はじめに
前回の記事で、バック走をしながらロボットを目的地まで移動させることができました。
今回の記事では、正常な向きにロボットモデルを変更し、自律走行をさせます。
その過程で、今までのおさらいができればと思います。
前提条件
前提条件は以下の通りです。
- 前回までの記事が完了している
これだけです。
今回は詳細なコードの記載は行わず、結果を見てご自身で修正していただければと思います。
URDF の変更
URDF を修正していきます。以前のこちらの記事を参考にしてください。
現状は以下の左側の向きになっていますが、右側の画像の向きになるように変更してください。
LIDAR や、カメラの向きにも注意です。車輪の位置もしくは名称も反転させてください。
作成した URDF ファイルを second_robot.urdf として保存します。
ロボットのバタつきが気になる方
車体を重くするか、長くし、車輪をできるだけ車体の中心から離してください。
もしくは、diff_drive の <max_wheel_torque> を 20 → 5 に変更してください。
これで、車体のウィリー状態を防ぐことができます。
Gazebo 上で確認
こちらの記事で作成した first_gazebo.launch.py を使用します。URDFのパスに注意。
ros2 launch ros2_first_test first_gazebo.launch.py
LIDAR, Gazebo の向きが前を向いていることを確認してください。
sdf ファイル (worldファイル) の作成
Gazebo を起動したまま、world ファイルを作成していきます。
この状態で、少しロボットを動かしてください。
ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args --remap /cmd_vel:=/first_robot/cmd_vel
バタつき、回転方向が正常であれば大丈夫です。”I”で前進、”L”で時計回りが正常です。
Map の作成
ここまでできたら、こちらの記事を参考に Map ファイルを作成していきます。
ros2 launch ros2_first_test first_localization.launch.py
別のターミナルを開きます。
ros2 launch ros2_first_test first_slam.launch.py
Map の生成が開始されたら、別のターミナルを開いて、ロボットを動かします。
ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args --remap /cmd_vel:=/first_robot/cmd_vel
Map が完成したら、以下のコマンドで保存します。
ros2 run nav2_map_server map_saver_cli -f ./second_map
多少歪んでいますが、これはMap 上の特徴点 (障害物など) が少ないため、参考にする LIDAR の情報が不足し、ロボットが自分の位置推定を誤ってしまうために生じます。
これを、” 退化 ” と呼びます。
退化について
以下の画像のような壁に挟まれた障害物のない通路の場合、ロボットは自分がどこにいるのか、把握することができません。
Navigation2 の実行
Navigation2 は、こちらの記事を参考に実行していきます。
translate_cmd_vel.py の以下の行を変更します。そのままの数値を送るように変更するだけです。
self.velocity.angular.x = -self.angle_x/2
self.velocity.angular.y = -self.angle_y/2
self.velocity.angular.z = -self.angle_z/2
↓
self.velocity.angular.x = self.angle_x
self.velocity.angular.y = self.angle_y
self.velocity.angular.z = self.angle_z
first_navigation.yaml の、map_server のマップファイルへのパスを忘れずに変更してください。
まずは “2D Pose Estimate” で自己位置推定を実行します。
“Navigation2 Goal” で、ゴール位置を指定します。
正常に走行しています。完成です!
おわりに
今回の記事で AGV の作成は完成です。
途中、バック走をした時は焦ったと思いますが、一連の流れを再度振り返るにはいい機会でした。
この記事を書いてて、Python プログラムから初期値位置指定、ゴール情報の送信をできるようにすべきかと思いました。検討します。
もしくは、先に産業用ロボットを ROS2 で扱うかもしれません。
コメント