Webots講座9までは自動運転シミュレータを使い,予め作られたロボットカー(BMW X5)にプログラミングしてきました.Webots講座11からは自作ロボットの作り方を学んでいきましょう.本記事はレファレンスのWebots User Guide Tutorial 6を参考に制作しました.作るロボットは自律移動ロボットでは定番の左右駆動輪の速度差によって進行方向が変わる差動駆動型ロボットです.ロボットの前後にキャスターとして球を本体に埋め込んでいます.
なお,Webotsのデフォルトの座標系はロボットの進行方向がz軸:青,左手方向がx軸:赤,上方向がz軸:緑となっています.
レファレンス
ロボットの仕様
- サイズ:直径 0.35[m],高さ 0.1[m]
- 重量:4.0 [kg]
- 駆動方式:差動駆動
- 車輪数:4(駆動輪2,受動輪2)
- 駆動輪直径:0.08[m]
プロジェクトの作成
- まず,次のWebots作業用ディレクトリがなければエクスプローラで作成する.
- C:\ユーザー\ユーザ名\webots
- Webotsを起動する.
- 新規プロジェクトを作成する.Webots講座2で実施した新規プロジェクトする方法でwheel1プロジェクトを作成する.
Robotノードの追加
- シーンツリーの最後にRobotノードを追加する.
- Robotノードのchildrenの次のノードを追加する.追加の方法はRobotノードのchildrenを右マウスボタンクリックして[新規の追加]を選択する.Solidはロボット前後のキャスター,HingeJointは駆動輪の回転軸,Shapeはロボット本体用である.
- Shape:ロボット本体用を次のように設定する.
- boundingObject: [新規の追加]→[USE]→Body (Shape)
- USE: Body (Shape)
- physics: [新規の追加]→[Base nodes]→Physics
- HingeJoint: 左車輪用
- DEF: HINGE_LEFT
- jointParameters: HingeJointParameters
- axis 1 0 0
- anchor -0.175 -0.03 0
- device
- PositionSensor: “position sensor”
- RotationMotor: “motor_left”
- endPoint: Solid
- 右車輪用のHingeJointは上の左車輪用HingeJointノードに右マウスボタンをクリックしてコピペする.変更箇所は以下とDEF(定義)でLEFTとなっているところをRIGHTにする.
-
- jointParameters
- axis 1 0 0
- anchor -0.175 -0.03 0
- endPoint
- translation: -0.175 -0.03 0
- jointParameters
-
- Solid: 前キャスター用
- DEF:CASTER_FRONT
- translation: 0 -0.05 0.15
- children
- Shape
- appearance: PBRAppearance
- geometry Sphere
- radius: 0.02
- Shape
- boundingObject: Sphere
- radius: 0.02
- physics: Physics
- Solid: 後キャスター用.前キャスター用のDEF CASTER_FRONT Solidノードをコピペして以下の項目を変更する.
- なお,ボールキャスターをシミュレーションするために,ボールジョイントで球と本体を拘束しても良いですが,簡単のためとシミュレーションが遅くなるので,このような実装にしています.
コントローラの作成
-
- Webots講座10で実施した新規ロボットのコントローラ作成と同じ要領です.
- メニューの [ウィザード]→[新規ロボットのコントローラ…]から以下を選択する.
- 言語選択:C
- IDE selection: Webots (gcc / Makefile)
- コントローラの名前:wheel1
- ソースコード:下のコードを上の開いたテクストエディタに貼り付けてビルドする.ソースコードの説明はコメントを参照して欲しい.
/* wheel1.c */ #include #include <webots/motor.h> #include <webots/robot.h> /* main関数 */ int main() { WbDeviceTag motor_left, motor_right; /* デバイスの宣言 */ wb_robot_init(); /* webotsの初期化 */ motor_left = wb_robot_get_device("motor_left"); /* デバイスの取得 */ motor_right = wb_robot_get_device("motor_right"); wb_motor_set_position(motor_left, INFINITY); /* モータ位置の設定 */ wb_motor_set_position(motor_right, INFINITY); /* 速度制御時はINFINITYに設定 */ while (wb_robot_step(64) != -1) { wb_motor_set_velocity(motor_left, 3.0); /* 回転速度の設定 [rad/s] */ wb_motor_set_velocity(motor_right, 5.0); } wb_robot_cleanup(); /* webotsの終了処理 */ return 0; }
ロボットへのコントローラ組込み
- 次にこのコントローラプログラムをロボットに組込みます.組み込まないとプログラムは動作しません.左欄の[Robot “robot”]→[controller]を選択し,下の[Selection controller (String)]欄の[選択…]をクリックするとコントローラの一覧が現れるので,その中から先ほど作成した”wheel1”をクリックして組み込みます.ワールドを保存する.
実 行
- プログラムを実行するためには,まず,シミュレーション表示部分の上にある,[reset]ボタンを押して,シミュレーションをリセットして初期化します.次に,[run]ボタンを押すとプログラムが実行され,ロボットが反時計周りに大きく回ります.
ハンズオン
- 上の説明に従って自作ロボットモデルをつくりプログラムを実行してみよう.ワールドファイルやコントローラプログラムの入ったwheel1プロジェクトフォルダは次のリンクからダウンロードできます.
- 直径1[m]の円の軌跡を進むコントローラプログラムを作成しよう.
- 5秒間前進して,1秒停止,5秒間後進して元の位置に戻るコントローラプログラムを作成しよう.ヒント:メインループは1回64[ms]です.
- 1辺が1mの正方形の軌跡になるように進むコントローラプログラムを作成しよう.wb_motor_set_velocity()の引数の回転速度[rad/s]と車輪の半径0.04[m]から移動速度を計算してください.
- 上のプログラムでは速度指令値をもとに進んだ距離を計算しているので正確ではありません.車軸にはPositionSensorがついているので,この値を使い正確な正方形の軌跡に進むようなコントローラプログラムを作成しよう.
終わり
コメント