ROS2 Jazzy 入門 (5) - Odometry
「SDF」で作ったシンプルな差動二輪ロボットに「Odometry」を追加して「rviz2」で視覚化します。
前回
1. Odometry
「/odom トピック」は、ロボットの自己位置推定に関する位置・姿勢・速度に関する情報を提供します。これは、ロボットがどこにいるのか、どのように動いているのかを推定するために使用します。
2. Gazebo の起動
(1) ターミナルを開いて「Gazebo」を起動。
「ROS2 Jazzy 入門 (2) - ロボット操作」の「SDF」を使います。
$ gz sim simple_robot.sdf
(2) 別のターミナルを開いて「/cmd_vel」と「/odom」をROS2にブリッジ。
$ ros2 run ros_gz_bridge parameter_bridge /cmd_vel@geometry_msgs/msg/Twist@gz.msgs.Twist
$ ros2 run ros_gz_bridge parameter_bridge /model/simple_robot/odometry@nav_msgs/msg/Odometry@gz.msgs.Odometry --ros-args -r /model/simple_robot/odometry:=/odom
(3) 別のターミナルを開いて「teleop_twist_keyboard」を起動。
$ ros2 run teleop_twist_keyboard teleop_twist_keyboard
(4) 「Gazebo」左下の▶をクリック。
物理シミュレーションが開始します。
3. Odometry の動作確認
(1) 「/cmd_vel」と「/odom」がトピックに追加されていることを確認。
ros2 topic list
/cmd_vel
/odom
/parameter_events
/rosout
(2) 「/odom」のデータ型を確認。
$ ros2 topic info /odom
Type: nav_msgs/msg/Odometry
Publisher count: 1
Subscription count: 1
(3)「/odom」のリアルタイムデータを確認。
$ ros2 topic echo /odom
header:
stamp:
sec: 4
nanosec: 580000000
frame_id: simple_robot/odom
child_frame_id: base_link
pose:
pose:
position:
x: -1.0267009973536991e-19
y: 2.0570663312770103e-38
z: 0.0
orientation:
x: 0.0
y: 0.0
z: -5.432027051799655e-20
w: 1.0
covariance:
- 0.0
:
- 0.0
twist:
twist:
linear:
x: -6.423618365069177e-20
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: -1.5164891305854554e-20
covariance:
- 0.0
:
- 0.0
4. rviz2 での視覚化
(1) rviz2 の起動。
$ rviz2
(2) 左側の設定項目を以下のように設定。
(2) 左下の「Add」をクリックし、「By topic → /odom → Odometry」を選択し、「OK」をクリック。
(3) 矢印が表示されるのを確認。
(4) 「teleop_twist_keyboard」でロボットを移動。
矢印の位置が変わることを確認します。
「Keep」(デフォルト100)の数だけ矢印履歴が表示されます。
5. launchファイル
(1) launchファイルの作成。
・run_simple_robot_odom.py
from launch import LaunchDescription
from launch.actions import ExecuteProcess
def generate_launch_description():
return LaunchDescription([
# Gazeboの起動
ExecuteProcess(
cmd=['gz', 'sim', 'simple_robot.sdf'],
output='log',
log_cmd=True
),
# rviz2の起動
ExecuteProcess(
cmd=['rviz2'],
output='log',
log_cmd=True
),
# ブリッジの起動
ExecuteProcess(
cmd=[
'ros2', 'run', 'ros_gz_bridge', 'parameter_bridge',
'/cmd_vel@geometry_msgs/msg/Twist@gz.msgs.Twist'
],
output='log',
log_cmd=True
),
ExecuteProcess(
cmd=[
'ros2', 'run', 'ros_gz_bridge', 'parameter_bridge',
'/model/simple_robot/odometry@nav_msgs/msg/Odometry@gz.msgs.Odometry',
'--ros-args', '-r', '/model/simple_robot/odometry:=/odom'
],
output='log',
log_cmd=True
),
# teleop_twist_keyboardの起動
ExecuteProcess(
cmd=['ros2', 'run', 'teleop_twist_keyboard', 'teleop_twist_keyboard'],
output='screen',
prefix='xterm -e'
),
])
(2) launchファイルの実行。
ros2 launch ~/run_simple_robot_odom.py