Python ROS2 プログラム 高専4年生

【ROS2講座⑦】RViz2、Gazeboで3D可視化【Python】

前回はrosbag2とrqtを学びました。

これまでの章で、Turtlesimやrqtを使って「ノード」「トピック」「通信」を理解してきました。
この章では、ROS2の3D可視化ツール RViz2(アールヴィズツー) を使って、
ロボットの位置やセンサー情報を 3次元的に“見る” 方法を学びます。

RViz2は、ROSの世界で最も重要なツールの1つです。
センサー、地図、ロボットモデル、軌跡などをリアルタイムで表示でき、
ロボット開発・デバッグ・研究に欠かせません。

RViz2とは

RViz2(ROS Visualization 2) は、ROS2環境で動作する3Dビジュアライザです。

項目内容
表示対象ロボットモデル(URDF)、センサー情報(LaserScan、Image)、経路、姿勢など
対応メッセージ/tf, /odom, /scan, /image_raw, /map など
使用場面ロボットの状態確認、シミュレーション、デバッグ、可視化教材の作成など

RViz2はrqtよりも高機能で、3D空間上で動きを直感的に確認できます。

ROS2がインストールされていれば、RViz2も自動的に入っています。

以下で起動できます。

ros2 run rviz2 rviz2

RViz2のウィンドウは3つの領域で構成されています。

領域説明
左パネル(Displays)表示する項目(例:Grid、TF、LaserScan)を追加/設定
中央(3Dビュー)ロボットや座標系を表示する3D空間
上部メニュー保存・読込・視点操作などを行うメニュー群

基本操作は以下の通りです。

操作方法
視点を回転右ドラッグ
平行移動Shift + 右ドラッグ
拡大・縮小マウスホイール
オブジェクト追加左パネルの「Add」ボタン

RViz2でTurtleBot3を3D表示

ROS2で標準的に用意されているロボットモデル TurtleBot3 を使って、
センサーや座標の表示、動作の可視化を体験します。

TurtleBot3 は、ROS公式が提供する教育・研究向け移動ロボットです。
GazeboやRViz2で動作確認が可能で、
現実のロボットを持っていなくてもシミュレーション体験ができます。

まず、TurtleBot3関連パッケージをインストールします。
(Humbl環境向け)

sudo apt update
sudo apt install -y ros-humble-turtlebot3* ros-humble-rviz2

* を付けることで、モデル・Bringup・Description・Gazebo など一式が入ります。

環境変数を設定します。

echo "export TURTLEBOT3_MODEL=burger" >> ~/.bashrc
source ~/.bashrc

TurtleBot3の3DモデルをRViz2で直接表示してみましょう。

export TURTLEBOT3_MODEL=burger
ros2 launch turtlebot3_fake_node turtlebot3_fake_node.launch.py

RViz2が起動し、TurtleBot3のモデルが中央に表示されます。
左パネルには TF, LaserScan, Odometry, Map などが並びます。

表示項目内容
TFロボットの座標系(base_link, camera_link など)を表示
LaserScan360° LIDARスキャンを可視化(緑の点群)
Odometry自己位置の変化を示すベクトル
Model3Dロボット本体の構造(URDF)

「TF」はロボットの“骨格”のようなもので、
各センサー・関節・ホイールの位置関係を定義しています。

別の端末を開き、Teleop(キーボード操作ノード)を実行します。

export TURTLEBOT3_MODEL=burger
ros2 run turtlebot3_teleop teleop_keyboard

以下の通りキーボード入力を行うと表示されたモデルが動きます。

Control Your TurtleBot3!
---------------------------
Moving around:
        w
   a    s    d
        x

w/x : 前進/後退  
a/d : 左右旋回  
s   : 停止

/cmd_vel トピックに速度コマンドが送られ、
Fake Node 上のロボットが実際に動きます。RViz2 上でも移動を確認できます。

  • turtlebot3_teleop は、キー入力を受けて /cmd_velgeometry_msgs/Twist 型の速度指令を送ります。
  • turtlebot3_fake_node は、受け取った速度指令に基づいて仮想ロボットを動かし、位置情報(/odom)や座標変換(/tf)を配信します。
  • robot_state_publisher は、ロボットの構造情報(URDF)を基にリンク位置を計算し、RViz2でモデルを描くために必要です。
  • RViz2 は、これらの情報を統合してリアルタイム表示を行います。

Gazeboシミュレーションでロボットを動かす

Gazebo(ガゼボ) は、ROSと連携できる本格的な3Dロボットシミュレーターです。
ロボットモデル(URDF)・物理エンジン・センサーシミュレーションを統合して、
「実機がなくてもリアルな挙動を試せる」ことが最大の特徴です。

Gazeboのインストール

ROS2 Humble では Gazebo Classic が標準的に使用されます。
以下のコマンドで必要な TurtleBot3 関連パッケージをまとめて導入します。

sudo apt update
sudo apt install -y \
  ros-humble-gazebo-ros-pkgs \
  ros-humble-gazebo-plugins \
  ros-humble-turtlebot3-gazebo

モデルの指定

Gazebo と TurtleBot3 は連携するため、まずモデル名を環境変数で指定します。

export TURTLEBOT3_MODEL=burger

以下でGazeboを起動しつつ、TurtleBot3を読み込みます。

ros2 launch turtlebot3_gazebo empty_world.launch.py

これで次のような構成が自動で立ち上がります。

ノード名役割
gazebo3Dシミュレーター本体
turtlebot3_gazeboTurtleBot3 モデルとプラグインのロード
robot_state_publisherURDFからTFを配信
gazebo_rosGazeboとROS2間のブリッジ機能

ウィンドウ上に小さな TurtleBot3 が表示されれば成功です。

こちらのモデルもトピックを送信すると動きます。

別のターミナルで以下を実行します。

export TURTLEBOT3_MODEL=burger
ros2 launch turtlebot3_gazebo empty_world.launch.py

キーボード操作で動けばロボットが動けば成功です。

続いて、Gazebo上に障害物を置いてみましょう。

円柱を選択し、適当な位置をクリックすると円柱の障害物を配置できます。

するとロボットから発射されたレーザー光が障害物で止まっている様子が確認できます。

RViz2でセンサーを可視化(LaserScan)

ロボットが周囲の環境を認識するために使う代表的なセンサーが LIDAR(ライダー) です。
レーザーを水平に照射して、反射までの距離を計測し、周囲の障害物の位置を点群データとして取得します。

ROS2ではこのデータが
sensor_msgs/msg/LaserScan というメッセージ型で /scan トピックとして送信されます。

Gazeboシミュレータ上で検出しているLiderの情報をRviz上で確認することができます。

上のGazebo上で障害物を検出している状態でRvizを起動します。

ros2 run rviz2 rviz2

起動したらFixd FrameをOdomにします。

AddからLaseScanを選択します。

表示するTopicで/Scanを選択します。

画面上に赤い点群が表示され、Gazeboと連携してセンサを可視化することができます。

トピックのリマップ機能の活用

Gazebo上のロボットですが、正しいトピック名を発信すれば、簡単に動かすことができます。

以前作成した、turtle_vel_publisherで円運動をさせてみましょう。

Gazeboを起動します。

export TURTLEBOT3_MODEL=burger
ros2 launch turtlebot3_gazebo empty_world.launch.py

別の端末で以下のコマンドを打ちます。

ros2 run turtle_playground turtle_vel_publisher \
  --ros-args \
  -r /turtle1/cmd_vel:=/cmd_vel \
  -p radius:=2.0
  • -r /turtle1/cmd_vel:=/cmd_vel が“トピック名だけを差し替える”指定です。
  • もし speedang_vel などのパラメータがある場合は同様に -p speed:=0.2 -p ang_vel:=0.2 などで与えてください。
  • 円運動の半径は r = v / ω(直進速度 / 角速度)で決まります。

Gazebo上のロボットが自動で走り出せば成功です。

課題10

turtle_vel_publisher を書き換えて Gazebo の TurtleBot3 を動かしてください。

  • 既存の turtle_vel_publisher を最小限改造し、/cmd_velgeometry_msgs/Twist をPublish。
  • Gazebo 上の TurtleBot3(burger)を円運動させる。

ノードは /cmd_velTwist一定周期でPublish(例:10Hz)。

直進速度 speed と角速度 omegaパラメータ化(起動時に変更できる)。

解答例はこちら
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist

class TurtleVelPublisher(Node):
    def __init__(self):
        super().__init__('turtle_vel_publisher')
        # ★ パラメータ(起動時に変更可)
        self.declare_parameter('speed', 0.15)   # m/s
        self.declare_parameter('omega', 0.30)   # rad/s
        self.declare_parameter('topic', '/cmd_vel')  # 変更したい場合だけ使う

        topic = self.get_parameter('topic').get_parameter_value().string_value
        self.pub = self.create_publisher(Twist, topic, 10)

        self.timer = self.create_timer(0.1, self._on_timer)  # 10 Hz
        self.get_logger().info(
            f'Publishing Twist to {topic} (speed={self.speed:.2f} m/s, omega={self.omega:.2f} rad/s)'
        )

    @property
    def speed(self):
        return self.get_parameter('speed').get_parameter_value().double_value

    @property
    def omega(self):
        return self.get_parameter('omega').get_parameter_value().double_value

    def _on_timer(self):
        msg = Twist()
        msg.linear.x = self.speed
        msg.angular.z = self.omega
        self.pub.publish(msg)

def main():
    rclpy.init()
    node = TurtleVelPublisher()
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        pass
    finally:
        node.get_logger().info('Shutting down turtle_vel_publisher')
        node.destroy_node()
        rclpy.shutdown()

if __name__ == '__main__':
    main()

実行コマンドは以下の通りです。

ros2 run turtle_playground turtle_vel_publisher --ros-args -p speed:=0.15 -p omega:=0.3

次回はこちら

Comming soon

Follow me!

-Python, ROS2, プログラム, 高専4年生
-, , , ,

PAGE TOP