🤖

ROS2でのURDF/Xacroの作成とLiDARのスキャン可視化

2025/01/26に公開

この記事では、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 は引き続き動いているので、表示がリアルタイムに更新され、レーザースキャンなどの可視化ができるようになります。

3./scanトピックがパブリッシュされているか確認(ターミナル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に設定する必要があります。

  1. Displaysパネル(左下/左側)にある「Add」ボタンをクリック
  2. 「By Topic」タブに切り替えて/scanを選択するか、もしくは「By display type」からLaserScanを選んで追加し、Topicを/scanに合わせる。
  3. 表示色・大きさなどを調整すると、点群が可視化されます。

補足: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.xacrodisplay.launch.py
  • 生成されるファイル: robot.urdf(Xacroファイルから生成)
  • Xacroを使うことで柔軟なロボットモデル記述が可能です。
  • RVizでモデルを確認しながら調整することで、正確なロボット構造を実現できます。

これでURDF/Xacroの作成と記述方法の解説は終了です。

Discussion