pyBox2D を使用して単純な差動駆動ロボット (e-Puck、Khepera など) をモデル化しています。このクラスのロボットは通常、左右の車輪の速度を rad/sec で示すことによって制御されます。
ただし、Box2D は、線速度 (2D ベクトルとしてのメートル/秒単位) と角速度 (ラジアン/秒単位) の 2 つのパラメーターを介して (キネマティック) ボディのみを制御できます。ホイール速度を線形 + 角速度に変換する必要があります。
線速度は実際には簡単です。車輪の半径 r がメートル単位で指定され、現在のロボットの方向シータがラジアンである場合、前進速度は単純に 2 つの車輪速度の平均 (メートル/秒) であり、現在の方向に従ってベクトルに減じられます。
(1) forwardSpeed = ((rightSpeed * r) + (leftSpeed * r)) / 2
(2) linearVelocity = (forwardSpeed * cos(シータ), forwardSpeed * sin(シータ))
ただし、角速度の正しい式を完全に理解することはできません。直感的には、車輪間の距離を法とする 2 つの速度の差になります。
(3) angularVelocity = (rightSpeed - leftSpeed) / wheelSeparation
極限の場合: right = left の場合、ロボットはその場でスピンし、rightSpeed = 0 または leftSpeed = 0 の場合、ロボットは固定ホイールの周りをスピン (ピボット) します。つまり、半径 = の円で、ホイール。
ただし、式(3)では期待どおりの動作が得られません。テストとして、左の車輪の速度を 0 に設定し、右の車輪の速度の値を徐々に上げました。予想される動作は、ロボットが速度を上げて左車輪の周りを回転することです。代わりに、ロボットは半径が大きくなる円を描くように回転します。つまり、外側にらせん状に回転します。これは、角速度が不十分であることを示しています。
ロボットに Box2D キネマティック ボディを使用しているため、摩擦は結果に影響しないことに注意してください。