測試方向鍵於手足球的人偶自由度&code設定 :
RJ1 : 為人偶前後踢球的軸代稱 \ RJ2 : 為控制人偶左右的桿子的軸代稱
樹狀圖為gif中所表示
下方為Lua code --->用於Vrep3.6.1版本中
function sysCall_init() right_left_handle= sim.getObjectHandle('RJ1') up_down_handle= sim.getObjectHandle('RJ2') MaxVel=5 right_left_velocity=0 up_down_velocity=0 dVel=0.5; sim.setJointTargetVelocity(right_left_handle,right_left_velocity) sim.setJointTargetVelocity(up_down_handle,up_down_velocity) end function sysCall_actuation() message,auxiliaryData=sim.getSimulatorMessage() while message~=-1 do if (message==sim.message_keypress) then if (auxiliaryData[1]==32) then -- right key right_left_velocity=0 up_down_velocity=0 sim.setJointForce(right_left_handle, 0) sim.setJointForce(up_down_handle, 0) break else sim.setJointForce(right_left_handle, 10000) sim.setJointForce(up_down_handle, 10000) end if (auxiliaryData[1]==2007) then -- left key right_left_velocity=right_left_velocity+dVel*1.3 end if (auxiliaryData[1]==2008) then -- right key right_left_velocity=right_left_velocity-dVel*1.3 end if (auxiliaryData[1]==2009) then -- up key up_down_velocity=up_down_velocity+dVel/10 end if (auxiliaryData[1]==2010) then -- down key up_down_velocity=up_down_velocity-dVel/10 end end message,auxiliaryData=sim.getSimulatorMessage() end if right_left_velocity>MaxVel then right_left_velocity=-5 end if right_left_velocity<-MaxVel then right_left_velocity=5 end if up_down_velocity>MaxVel then up_down_velocity=0 end if up_down_velocity<-MaxVel then up_down_velocity=0 end sim.setJointTargetVelocity(right_left_handle,right_left_velocity) sim.setJointTargetVelocity(up_down_handle,up_down_velocity) end
改寫code=python to lua並簡化
優點:
python : 可執行運算值較大的編譯
lua : Vrep內部沿用 , 延遲現象較少
缺點:
python : 會有爆ping問題導致延遲
lua : 太多運算時直接停止
unction sysCall_init() KickBallV = 10 R_KickBallVel = (math.pi/180)*KickBallV B_KickBallVel = -(math.pi/180)*KickBallV Sphere_handle=sim.getObjectHandle('Sphere') BRod_handle=sim.getObjectHandle('BRod') BRev_handle=sim.getObjectHandle('BRev') BMo_handle=sim.getObjectHandle('BMo') -- RRod_handle=sim.getObjectHandle('RRod') RRev_handle=sim.getObjectHandle('RRev') RMo_handle=sim.getObjectHandle('RMo') end function sysCall_actuation() position_BR=sim.getObjectPosition(BRod_handle,-1) position_S=sim.getObjectPosition(Sphere_handle,-1) X =position_S[1] - position_BR[1] Y =position_S[2] - position_BR[2] if 1 then if X <= 0.02 and Y <= 0 then sim.setJointTargetVelocity(BRev_handle,B_KickBallVel) sim.setJointTargetVelocity(BRev_handle,-1) elseif X > 0.02 and Y <= 0 then sim.setJointTargetVelocity(BRev_handle,B_KickBallVel) sim.setJointTargetVelocity(BRev_handle,1) elseif X <= 0.02 and Y > 0 then sim.setJointTargetVelocity(BRev_handle,R_KickBallVel) sim.setJointTargetVelocity(BRev_handle,-1) elseif X > 0.02 and Y > 0 then sim.setJointTargetVelocity(BRev_handle,R_KickBallVel) sim.setJointTargetVelocity(BRev_handle,1) end YYYYY = Y*5 sim.setJointTargetVelocity(BMo_handle,YYYYY) end --- position_RR=sim.getObjectPosition(RRod_handle,-1) X =position_S[1] - position_RR[1] Y =position_S[2] - position_RR[2] if 1 then if X <= 0.02 and Y <= 0 then sim.setJointTargetVelocity(RRev_handle,B_KickBallVel) sim.setJointTargetVelocity(RRev_handle,-1) elseif X > 0.02 and Y <= 0 then sim.setJointTargetVelocity(RRev_handle,B_KickBallVel) sim.setJointTargetVelocity(RRev_handle,1) elseif X <= 0.02 and Y > 0 then sim.setJointTargetVelocity(RRev_handle,R_KickBallVel) sim.setJointTargetVelocity(RRev_handle,-1) elseif X > 0.02 and Y > 0 then sim.setJointTargetVelocity(RRev_handle,R_KickBallVel) sim.setJointTargetVelocity(RRev_handle,1) end YYYYY = Y*5 sim.setJointTargetVelocity(RMo_handle,YYYYY) end end --by 40623130--
原本要編寫切換鍵但於vrep中用io.clock等時間等待輸入雙命令時會出現運算值過大導致停止問題 , 所以先寫電腦打擊與跟蹤球
原python code出處(by 40623128):https://mdekmol.github.io/cd2019a-task1-2019cda_t1_g3_1/content/%E6%89%8B%E8%B6%B3%E7%90%83%E6%89%8B%E6%8E%A7%E8%88%87%E9%9B%BB%E8%85%A6%E5%B0%8D%E6%89%93.html