お疲れ様です。秋並です。
今回は、ROSの「sensor_msgs/Imuメッセージ」を扱う際に注意すべきポイントを紹介します。
ちなみに、今回紹介することはImuメッセージの公式ドキュメントに書いてあります。
ポイント1:加速度の単位はm/s^2
「加速度:linear_acceleration
」に格納する加速度の単位はm/s^2になります。
使用するIMUモジュールによってはG単位で加速度が取得されるため、その場合は単位変換してから格納する必要があります。
Gに重力加速度(≒9.8)を掛けるとrad/s^2に変換できます。
msg.linear_acceleration.x = acc_g_x * 9.8F
msg.linear_acceleration.y = acc_g_y * 9.8F
msg.linear_acceleration.z = acc_g_z * 9.8F
ポイント2:角速度の単位はrad/s
「角速度: angular_velocity
」に格納する角速度の単位はrad/sになります。
degree/sec に π/180.0 を掛けると rad/sec に変換できます。
割り算は計算量が大きいので、下コードのように π/180.0 の計算結果である0.017453を掛けることが一般的です。
msg.angular_velocity.x = gyro_degree_x * 0.0174533F
msg.angular_velocity.y = gyro_degree_y * 0.0174533F
msg.angular_velocity.z = gyro_degree_z * 0.0174533F
ポイント3:取得できない要素は、共分散の0番目に-1を代入
IMUの種類によっては、「姿勢: orientation
」「加速度: linear_acceleration
」「角速度: angular_velocity
」のうち、一部の情報が取得できない場合があります。
例えば、「姿勢: orientation
」を取得できないような場合は、対応する共分散行列の0番目の要素に-1を代入することで、
orientation
は無効値である
ということを示します。
msg.orientation_covariance[0] = -1 // orienationは無効値であること示す
ポイント4:姿勢はクォータニオン
ROS2では、基本的にクォータニオンで姿勢を示すため、Imuの「姿勢: orientation
」もオイラー角ではなく、クォータニオンで示す必要があります。
オイラー角→クォータニオンへの変換は、元のオイラー角の回転の順番によります。
詳しくは下記記事を参照してください。
さいごに
今回は、Imuメッセージを扱う際の注意点を紹介しました。
navigation2などのパッケージと連携させてImuメッセージを扱う場合は、この辺りが間違っていると正しく動作しないので注意しましょう。
一言
公式ドキュメントは確認しよう!
参考サイト