前回は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 など)を表示 |
LaserScan | 360° LIDARスキャンを可視化(緑の点群) |
Odometry | 自己位置の変化を示すベクトル |
Model | 3Dロボット本体の構造(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_vel
にgeometry_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
これで次のような構成が自動で立ち上がります。
ノード名 | 役割 |
---|---|
gazebo | 3Dシミュレーター本体 |
turtlebot3_gazebo | TurtleBot3 モデルとプラグインのロード |
robot_state_publisher | URDFからTFを配信 |
gazebo_ros | Gazeboと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
が“トピック名だけを差し替える”指定です。
- もし
speed
やang_vel
などのパラメータがある場合は同様に-p speed:=0.2 -p ang_vel:=0.2
などで与えてください。
- 円運動の半径は r = v / ω(直進速度 / 角速度)で決まります。

Gazebo上のロボットが自動で走り出せば成功です。
課題10
turtle_vel_publisher
を書き換えて Gazebo の TurtleBot3 を動かしてください。
- 既存の
turtle_vel_publisher
を最小限改造し、/cmd_vel にgeometry_msgs/Twist
をPublish。 - Gazebo 上の TurtleBot3(burger)を円運動させる。
ノードは /cmd_vel
に Twist
を一定周期で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