■ はじめに
こんにちは!
前回は ROS 2 Jazzy + TurtleBot3 の環境で、自作の自律走行ソフトをビルドして
ros2 run で動かせるようにしました。
今回はその続きです。
いよいよ自作ノードで Gazebo上のTurtleBot3を動かしてみる 回!
……のはずだったのですが。
ビルドも通ってるのにロボットがピクリとも動かないというトラブルが発生💦
今回も ChatGPTさんと一緒に原因を追いかけて、Jazzy特有の「型違い問題」に挑戦していきます。
■ 実行環境を用意しよう
① GAZEBOを起動
まずGazebo上にTurtleBot3を出します。
このターミナルは閉じずにそのままキープです。
cd ~/ros2_ws
export TURTLEBOT3_MODEL=burger
source /opt/ros/jazzy/setup.bash
source ~/ros2_ws/install/setup.bash
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
② 自作ノードを実行
新しいターミナル②を開いて、同じく環境変数をセット。
自律走行ノード(tb3_autorun)は、前回作ったものを使います👇
cd ~/ros2_ws
colcon build --packages-select tb3_autorun
source install/setup.bash
export TURTLEBOT3_MODEL=burger
source /opt/ros/jazzy/setup.bash
source ~/ros2_ws/install/setup.bash
ros2 run tb3_autorun tb3_autorun
止めたい場合は、Ctrl + C で終了できます。
■ ビルドできても動かない!? 型違い問題
ビルドは成功しているのに、ロボットが全く動かない……。
ChatGPTさんのアドバイスで、 /cmd_vel を調べてみました。
ros2 topic echo /cmd_vel
すると、トピックの型が複数存在していることが判明。
Jazzy版では一部のノードが TwistStamped(タイムスタンプ付き) を出すようになっていました。
そこで、自作ノード側も TwistStamped に対応させるよう修正。
# 修正版 Publisher例
from geometry_msgs.msg import TwistStamped
msg = TwistStamped()
msg.twist.linear.x = 0.2
msg.twist.angular.z = 0.0
msg.header.stamp = node.get_clock().now().to_msg()
publisher.publish(msg)
これでようやく型が一致!
……なのですが、Gazebo上では今度はロボットが暴れまくった挙句、転倒してしまう事態に😅
■ なぜ倒れるのか?
GazeboのTurtleBot3には物理エンジンが働いているため、
衝突時に以下のようなことが起こります👇
・摩擦や反発で転倒
・高速衝突で座標が乱れる
つまり、「ぶつからなければ倒れない」ということ。
次はセンサを使って、壁を避ける仕組みを入れます。
■ センサ自律走行で改善!
TurtleBot3にはLIDAR(/scan)が搭載されています。
これを使って「障害物を検知して回避する」ロジックを追加します。
1️⃣ 前方40cm以内に障害物がある → その場で旋回(回避行動)
2️⃣ 前方が安全 → 前進を継続
つまり、「壁にぶつかる前に回避する」仕組みです。
■ 動作の様子
Gazebo上でロボットが動き出し、
壁の手前で止まって、少し旋回してから再び前進。
物理的な衝突がなくなり、安定して環境内をウロウロと移動できました🚗💨
LIDARによる基本的な自律移動の成功です!
■ まとめ
今回のポイントを振り返るとこんな感じです👇
/cmd_vel の型違いで動かない
→TwistStamped に対応して解決
壁に突っ込んで転倒 LIDARで回避して安定走行
つまり、倒れない・滑らない・安全運転!
(なんだか交通安全の標語みたいですが😂)
■ 今回の学び
> ROS 2 Jazzyでは、メッセージ型の変更に注意!
動かないときはまず /cmd_vel の型を確認しよう。
■ 次のステップ
この基礎動作をベースに、さらに以下の拡張を考えています👇
・SLAM(地図生成)との統合
・Nav2を使った経路計画
・LIDAR + カメラで物体検知
次回は 「SLAMを使って、地図を作りながら走るTurtleBot3」 に挑戦予定!
お楽しみに✨




