RTMaps ツールキット ドキュメントEnglish

ロボットの仕様とセンサの取り付け

ロボット自身の形は 2 つに分かれていて、それぞれ別のコンポーネントで与えます。

何を与えるものファイル
ロボットの体の輪郭と半径(フットプリント)、寸法・質量、性能値(速度・加速度の限界)本パッケージの RobotSpecManagerロボットの仕様ファイル(<robot_spec>)
センサをロボットのどこに、どちら向きに付けたか(センサの座標 → ロボットの座標、センサどうしの変換)RTMaps 標準の Sensor Calibration File Parser(MAPSSensorCalibrationFileParser)センサの校正ファイル(<system>)

センサの取り付けには標準のコンポーネントを使います。RobotSpecManager はセンサの取り付けを出しません。標準にない、輪郭、寸法・質量、性能値(速度・加速度の限界)を出します。

2 つのファイルは 1 つにまとめられません。Sensor Calibration File Parser は、知らない要素(たとえば <footprint>)があるファイルを読めないので、ロボットの仕様と、センサの校正は別のファイルにしてください。

座標

RobotSpecManager:ロボットの輪郭

RobotSpecManager はロボットの仕様ファイルを読み、輪郭と半径をカスタムストラクチャー SMSL_RobotSpec(出力 robot_spec)で、始めに 1 回だけ出します。輪郭を使う部品(NavigationToolkit の膨張・計画・安全停止・表示など)は線で受けるので、ロボットの大きさをそれぞれのプロパティに持ちません。

プロパティは spec_file(ロボットの仕様ファイルのパス)だけです。

<robot_spec>
  <!-- rectangle / circle / polygon のどれか 1 つ -->
  <footprint shape="rectangle" front_in_m="0.3" rear_in_m="0.3" left_in_m="0.2" right_in_m="0.2"/>
  <!-- <footprint shape="circle" radius_in_m="0.25"/> -->
  <!-- <footprint shape="polygon">0.3 0.2  -0.3 0.2  -0.3 -0.2  0.3 -0.2</footprint> -->
</robot_spec>
shape属性意味
rectanglefront_in_m、rear_in_m、left_in_m、right_in_mロボットの原点から前端・後端・左端・右端までの距離(m、どれも 0 より大きい)。原点は車体の中心でなくてもよい
circleradius_in_m半径(m)、原点が中心
polygon中身の文字:x y の並びロボット座標の頂点(m)、3〜32 個。数は空白・カンマ・セミコロン・括弧で区切る(ROS の footprint をそのまま貼れる)

種類、本体、性能値

ロボットの仕様ファイルには、輪郭のほかに、ロボットの物理値と性能値も書けます。後段の部品のパラメータを減らすためです。ロボットの種類を <robot_spec> の type に書きます(<body> か <motion_limits> を書くときは必須):differential(差動二輪・クローラ・AGV)、omni(メカナム・オムニホイール)、ackermann(前輪操舵)、drone(マルチロータ)。

<robot_spec type="differential">
  <footprint shape="rectangle" front_in_m="0.3" rear_in_m="0.3" left_in_m="0.2" right_in_m="0.2"/>
  <body height_in_m="0.8" mass_in_kg="40" cog_xyz_in_m="0.05 0 0.25"
        wheel_radius_in_m="0.1" track_width_in_m="0.4" drive_axle_x_in_m="0"/>
  <motion_limits max_velocity_forward_in_m_per_s="1.0" max_velocity_backward_in_m_per_s="0.3"
          max_yaw_rate_in_rad_per_s="1.5"
          max_acceleration_in_m_per_s2="0.5" max_deceleration_in_m_per_s2="1.0"
          max_yaw_acceleration_in_rad_per_s2="3.0"/>
</robot_spec>

4 つの種類のサンプルは、example フォルダの robot_spec_differential.xml、robot_spec_omni.xml、robot_spec_ackermann.xml、robot_spec_drone.xml です。種類ごとにどの属性が要るかは、ファイルのコメントに書いてあります。

Sensor Calibration File Parser:センサの取り付け

Sensor Calibration File Parser は、センサの座標系どうしの変換を書いた XML を読み、4 × 4 の変換行列を出します。直接書いていない 2 つのセンサの間も、ほかの座標系を通ってつながっていれば(たとえば LiDAR からロボットを通ってカメラへ)変換を求めます。逆向きの変換も求めます。

ファイル

<extrinsic from="A" to="B"> は、A の座標系の点を B の座標系へ移す変換です。中に書いた変換は、書いた順に適用されます。

<?xml version="1.0" encoding="UTF-8" ?>
<system>
  <calibration>
    <extrinsic from="front_lidar" to="robot">
      <!-- X 軸まわりに roll 20 度、次に Y 軸まわりに pitch −30 度、次に Z 軸まわりに yaw 40 度 -->
      <rotation><axis_angle><vector size="3">1 0 0</vector><angle unit="deg">20</angle></axis_angle></rotation>
      <rotation><axis_angle><vector size="3">0 1 0</vector><angle unit="deg">-30</angle></axis_angle></rotation>
      <rotation><axis_angle><vector size="3">0 0 1</vector><angle unit="deg">40</angle></axis_angle></rotation>
      <!-- ロボット座標でのセンサの位置(m) -->
      <translation><vector size="3">0.25 0 0.3</vector></translation>
    </extrinsic>
  </calibration>
</system>

コンポーネント

プロパティ設定
calibration_fileセンサの校正ファイルのパス
matrix_count出す行列の数(1 つずつ出力 matrix_0、matrix_1、…ができる。番号は 0 から)
matrix_output_modeOnce At Start(ダイアグラムの始めに 1 回出す)。既定は Periodic
matrix_<i>_from、matrix_<i>_toファイルの中の名前から、座標系を選ぶ。from がセンサ、to がロボットなら、センサ → ロボットの変換

点群に当てる

出力 matrix_<i> を Rotation3D の入力 transformation_matrix_4x4 につなぎ、transfo_source = Matrix Input (4x4) にします。点群での Rotation3D の設定は、PointCloudProcessingToolkit のトピック「点群の座標:センサからロボットへ」にあります。

例:GNSS のアンテナと IMU のレバーアーム

IMU を内蔵しない GNSS では、アンテナと IMU は別の場所にあります。この 2 つのずれがレバーアーム l です。それぞれの位置をロボットに対して書くと、2 つの間の変換はパーサーがロボットを通って求めます。

<?xml version="1.0" encoding="UTF-8" ?>
<system>
  <calibration>
    <extrinsic from="gnss_antenna" to="robot">
      <translation><vector size="3">0.5 0 1.2</vector></translation>
    </extrinsic>
    <extrinsic from="imu" to="robot">
      <translation><vector size="3">0.1 0 0.3</vector></translation>
    </extrinsic>
  </calibration>
</system>

matrix_0_from = gnss_antenna、matrix_0_to = imu にします。出力の行列 [R | t] の平行移動 t が、IMU の座標で見たアンテナの位置、つまり l です。この例では l = (0.4, 0, 0.9) m です。

これらの値は、RTMaps で Rotation3D の Matrix Input につないで確かめました。

パーサーが出すのは、この固定の l だけです。GNSS の位置を補正するには、そのときどきの姿勢も要ります。p_antenna = p_imu + R(t)·l で(R(t) は IMU の姿勢)、速度には ω × l の項が入ります。この行列は姿勢で変わらないので、Rotation3D では補正になりません。補正は、位置を推定する部品の中で行います。

imu_to_pose6D:IMU の姿勢

IMU の姿勢のクォータニオンを pose6D [0, 0, 0, roll, pitch, yaw] にします。機種ごとの違いは 2 つのプロパティで受けます。

プロパティ設定
quaternion_order要素の並び。wxyz(スカラーが先頭)、xyzw(スカラーが末尾。ROS の sensor_msgs/Imu)
reference_frame入力の座標。ENU(ワールド ENU、機体 FLU。ROS)、NED(ワールド NED、機体 FRD)

NED の入力を ENU のまま読むと、ピッチの符号が逆になり、yaw も 90° − 方位になりません。お使いの機種の並びと座標は、メーカーの資料で確かめてください。

出力は IMU 自身の姿勢です。IMU をロボットに対して回して付けたときは、IMU → ロボットの回転を Sensor Calibration File Parser の校正ファイルに書き、姿勢を使う側で当てます。

IMU は位置を測れないので、並進は常に 0 です。ヨーの基準は機種によります。地磁気を使う機種は北が基準で、6 軸の機種はドリフトします。

どちらを使うか

やりたいこと使うもの
障害物を避ける・経路を計画する部品に、ロボットの大きさと形を渡すRobotSpecManager
点群をセンサの座標からロボットの座標へ移すSensor Calibration File Parser → Rotation3D
GNSS のアンテナと IMU の位置(レバーアーム)を与えるSensor Calibration File Parser(from がアンテナ、to が IMU かロボット)
2 つのセンサの間の変換(LiDAR → カメラ)を求めるSensor Calibration File Parser
両方ファイルは別々。ロボットの仕様ファイルと、センサの校正ファイルを分ける