ROS2でのURDF/Xacroの作成とLiDARのスキャン可視化
この記事では、ROS2におけるURDF/Xacroファイルの作成方法と、それらを使用してセンサーの取り付け位置を正確に記述する手順について解説します。
1. URDF/Xacroとは?
URDF (Unified Robot Description Format)
URDFは、ロボットのリンクやジョイントの関係をXML形式で記述するフォーマットです。主に以下を定義します:
- ロボットの構造(リンクとジョイント)
- センサーやアクチュエータの取り付け位置
Xacro (XML Macro)
XacroはURDFを拡張したフォーマットで、マクロやパラメータを利用して動的な記述を可能にします。これにより、複雑なロボットモデルを簡潔に記述できます。
2. 必要な準備
必要なファイル
- robot.xacro: Xacro形式で記述されたロボットのモデルファイル。このファイルは動的なパラメータを活用し、再利用可能なロボット記述を作成します。
- launch/display.launch.py: RVizでURDF/Xacroファイルを可視化するための起動ファイル。
使用する環境
- センサー:SLAMTEC A1M8 LiDAR
- マイコンボード:Raspberry Pi 4
- OS:Ubuntu Server 22.04LTS
3. ファイル作成と生成手順
1. ROS2パッケージの作成
URDF/Xacroファイルを管理する専用のROS2パッケージを作成します。
以下のコマンドを実行します:
cd ~/zeuscar_ros2_ws/src
ros2 pkg create robot_description --build-type ament_cmake
これにより、以下のようなディレクトリ構成が生成されます:
robot_description/
├── CMakeLists.txt
├── package.xml
├── resource/
└── include/
2. URDF/Xacroファイルの記述
URDF/Xacroファイルを配置するために、urdf/
ディレクトリを作成します:
sudo mkdir -p ~/zeuscar_ros2_ws/src/robot_description/urdf
このマクロはセンサーの取り付け位置と向きを設定します。
ユーザーは以下の手順で値を決定してください:
-
parent_link: LiDARが取り付けられる基準フレーム(例: base_link)
-
child_link: LiDAR自体のフレーム(例: laser_frame)
-
x, y, z: 基準フレームから見たセンサーの位置を測定し記述
-
roll, pitch, yaw: センサーの向きを計測し設定
例:
-
x="0.2" は基準フレームから前方20cmの位置を表す。
-
z="0.1" は基準フレームから上方10cmの位置を表す。
-
roll, pitch, yawが0の場合、センサーは基準フレームと同じ向き。
robot.xacroの例
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="zeuscar">
<!--
1) マクロ定義: フレームの固定ジョイントを生成
2) paramsに "yaw" が無かったので追加
-->
<xacro:macro name="add_lidar" params="parent_link child_link x y z roll pitch>
<joint name="${child_link}_joint" type="fixed">
<parent link="${parent_link}"/>
<child link="${child_link}"/>
<origin xyz="${x} ${y} ${z}" rpy="${roll} ${pitch} ${yaw}"/>
</joint>
</xacro:macro>
<!-- ベースリンク -->
<link name="base_link"/>
<!-- LiDAR用リンク
LiDARドライバがデフォルトで 'laser' を使用している場合は、
ここを 'laser' にして合わせると良い -->
<link name="laser"/>
<!--
マクロ呼び出し:
親リンク=base_link, 子リンク=laser, 取り付け位置は適宜調整
最後に '/>' を付けてタグを閉じる
-->
<xacro:add_lidar
parent_link="base_link"
child_link="laser"
x="-0.017"
y="0.0165"
z="0.21"
roll="0"
pitch="0"
yaw="0"
/>
</robot>
軸の確認
ROSの座標系の一般的な定義では以下のようになります:
- x軸: 前後方向(前方が正、後方が負)。
- y軸: 左右方向(左が正、右が負)。
- z軸: 上下方向(上が正、下が負)。
3. URDFファイルの生成
XacroファイルからURDFファイルを生成します。
URDFを生成する前に、ros-humble-xacro
パッケージをインストールします。
sudo apt update
sudo apt install -y ros-humble-xacro
ファイルを生成するための権限を付与します。
sudo chown -R $USER:$USER ~/zeuscar_ros2_ws/src/robot_description/urdf
URDFファイルの生成を実行します。
cd ~/zeuscar_ros2_ws/src/robot_description/urdf
xacro robot.xacro > robot.urdf
これにより、robot.urdf
が生成されます。
4. package.xmlの修正
続いてpackage.xml
の修正を行います。
sudo nano ~/zeuscar_ros2_ws/src/robot_description/package.xml
以下のような内容に変更します。
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>robot_description</name>
<version>0.0.0</version>
<description>Robot description package</description>
<maintainer email="pi@todo.todo">pi</maintainer>
<license>Apache 2.0</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<exec_depend>ros-humble-robot-state-publisher</exec_depend>
<exec_depend>ros-humble-xacro</exec_depend>
<exec_depend>rviz2</exec_depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
修正内容
修正内容の説明
ros-humble-robot-state-publisher: URDFやTFを処理するためのパッケージ。
ros-humble-xacro: Xacroファイルを処理してURDFを生成するために必要。
rviz2: RVizを起動するためのパッケージ。
Apache 2.0 など適切なライセンスを指定してください。まだ不明の場合はTODOをそのままにしておいても問題ありません。
ビルドの実行
修正後、ROS2のワークスペース全体を再ビルドします。
cd ~/zeuscar_ros2_ws
colcon build
ビルド後に環境を再設定します。
source ~/zeuscar_ros2_ws/install/setup.bash
4. 必要なパッケージのインストール
URDF/XacroファイルをRVizで可視化するには、以下のROS2パッケージを事前にインストールしておく必要があります:
sudo apt update
sudo apt install -y ros-humble-rviz2 ros-humble-robot-state-publisher ros-humble-xacro
5. RVizでの可視化
launchファイルの作成
launch/
ディレクトリを作成し、以下のようなlaunchファイルを作成します:
sudo mkdir -p ~/zeuscar_ros2_ws/src/robot_description/launch
nano ~/zeuscar_ros2_ws/src/robot_description/launch/display.launch.py
display.launch.pyの例
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.substitutions import Command, PathJoinSubstitution
def generate_launch_description():
robot_description_pkg = get_package_share_directory('robot_description')
xacro_file = PathJoinSubstitution([
robot_description_pkg,
'urdf',
'robot.xacro'
])
# xacroコマンドでURDFを生成(文字列として取得)
robot_description_content = Command(['xacro ', xacro_file])
return LaunchDescription([
Node(
package='robot_state_publisher',
executable='robot_state_publisher',
name='robot_state_publisher',
parameters=[{'robot_description': robot_description_content}],
output='screen'
),
Node(
package='rviz2',
executable='rviz2',
name='rviz2',
output='screen'
)
])
パスの指定方法
-
<absolute_path_to_urdf/robot.xacro>
の部分は、robot.xacro
ファイルの絶対パスを指定する必要があります。 - 例:
~/zeuscar_ros2_ws/src/robot_description/urdf/robot.xacro
以下のコマンドで絶対パスを確認できます:
readlink -f ~/zeuscar_ros2_ws/src/robot_description/urdf/robot.xacro
この値をdisplay.launch.py
内のfile://
の後に記述してください。
LiDARのスキャンを可視化する手順
1.RVizの起動(ターミナル1)
RVizを起動します。
現在使用しているターミナルで実行してください。:
cd ~/zeuscar_ros2_ws
source install/setup.bash
ros2 launch robot_description display.launch.py
これにより、RVizが起動し、ロボットモデルなどが表示される状態になります。
2.LiDARドライバを起動(ターミナル2)
cd ~/zeuscar_ros2_ws
source install/setup.bash
ros2 launch sllidar_ros2 sllidar_a1_launch.py
これで、LiDARドライバが /scan
トピックをパブリッシュし始めます。
RViz は引き続き動いているので、表示がリアルタイムに更新され、レーザースキャンなどの可視化ができるようになります。
/scan
トピックがパブリッシュされているか確認(ターミナル3)
3.ターミナル3を起動しでLiDARドライバが正しく起動しているかを確認しましょう。
ros2 topic list
この出力の中に/scan
が含まれていれば、LiDARのLaserScanデータがパブリッシュされています。
さらにLaserScanメッセージを確認します。
ros2 topic echo /scan
実行するとLaserScanメッセージ(range配列など)が流れているか確認できます。
pi@ubuntu:~/zeuscar_ros2_ws$ ros2 topic list
/joint_states
/parameter_events
/robot_description
/rosout
/scan
/tf
/tf_static
pi@ubuntu:~/zeuscar_ros2_ws$ ros2 topic echo /scan
header:
stamp:
sec: 1737887567
nanosec: 274496235
frame_id: laser
angle_min: -3.1241390705108643
angle_max: 3.1415927410125732
angle_increment: 0.005806980188935995
time_increment: 0.000132742861751467
scan_time: 0.14322954416275024
range_min: 0.15000000596046448
range_max: 12.0
ranges:
- 2.7079999446868896
- 2.7079999446868896
- 2.7119998931884766
- 2.7079999446868896
- 2.7039999961853027
- 2.7079999446868896
- 2.7119998931884766
- 2.7119998931884766
もし/scan
が存在しなかったり、データが流れていないなら、LiDARドライバが正しく動作していない可能性があります。
4.RVizに「LaserScan Display」を追加
ROSでLiDARのスキャンを可視化するには、RVizで「LaserScan」というタイプのディスプレイを追加し、トピックを/scanに設定する必要があります。
- Displaysパネル(左下/左側)にある「Add」ボタンをクリック
- 「By Topic」タブに切り替えて/scanを選択するか、もしくは「By display type」からLaserScanを選んで追加し、Topicを/scanに合わせる。
- 表示色・大きさなどを調整すると、点群が可視化されます。
補足:RVizだけを起動する場合
cd ~/zeuscar_ros2_ws
source install/setup.bash
ros2 run rviz2 rviz2
最もシンプルな方法は、ターミナルから直接以下のコマンドを入力することです。
---
5. ディレクトリ構成の最終形
最終的なディレクトリ構成は以下のようになります:
~/zeuscar_ros2_ws/
├── src/
│ ├── robot_description/
│ │ ├── urdf/
│ │ │ ├── robot.urdf # Xacroから生成されたURDF
│ │ │ └── robot.xacro # ユーザーが作成するXacroファイル
│ │ ├── launch/
│ │ │ └── display.launch.py
│ │ ├── CMakeLists.txt
│ │ └── package.xml
│ └── rplidar_ros2/
├── build/
├── install/
└── log/
6. まとめ
-
ユーザーが用意するファイル:
robot.xacro
とdisplay.launch.py
-
生成されるファイル:
robot.urdf
(Xacroファイルから生成) - Xacroを使うことで柔軟なロボットモデル記述が可能です。
- RVizでモデルを確認しながら調整することで、正確なロボット構造を実現できます。
これでURDF/Xacroの作成と記述方法の解説は終了です。
Discussion