自動運転ロボットやドローン、AGV(無人搬送車)、屋内ナビゲーションロボットなど、ROS2(Robot Operating System 2)とLiDAR(Light Detection and Ranging)を組み合わせたSLAM(Simultaneous Localization and Mapping)技術は、さまざまな分野で注目されています。
また、近年では、建設・土木現場でも地形測量や施工管理、構造物の変形監視などにLiDARを使った3Dマッピング技術が活用され、建設DX(Digital Transformation)の推進に貢献しています。
一方で、現場実装には「外付けIMUが必須」「加速度データの単位が不明」などの技術的課題があり、精度確保には工夫が必要です。
本コラムでは、IMU(Inertial Measurement Unit)内蔵型3D-LiDAR『MID-360』を活用し、外付けIMU不要で高精度な自己位置推定やナビゲーションを実現するためのポイントを解説します。
その中で、Pythonによる加速度データ単位変換(g→m/s²)の実装例を紹介します。これにより、ロボットの動作解析やSLAM、3Dマッピング用途での精度向上が期待できます。
MID-360製品概要
Livox Mid-360は、360°×59°の広視野角と最大20万点/秒の高密度点群出力を実現する次世代3D-LiDARセンサーです。コンパクトな筐体(65×65×60mm)にIMU(ICM-40609-D)を搭載し、自己位置推定や動的環境下での点群補正に対応。SLAMや自動運転システムにおける精度と安定性を大幅に向上させます。
また、内蔵IMUは、3軸加速度センサーと3軸ジャイロスコープを統合した6軸MEMS(Micro Electro Mechanical Systems)モーショントラッキングデバイスで、正確な動作解析の実現が可能であり、屋内外の移動ロボットやAGV(自律搬送車両)、3Dマッピングへの組み込みに最適です。
IMUデータフォーマット
Livoxが提供するROS Driver2:livox_ros_driver2を利用することで、IMUデータがROS2のtopic(/livox/imu)としてPublishされます。
IMUデータのフォーマットは、Livox_SDK2のプロトコル仕様に準拠し、下記の表の通り、加速度データ(acc_x,acc_y,acc_z)は単位:“g”で出力されます。

IMUデータのフォーマット
一方、ROSのsensor_msgs/Imuメッセージは“m/s²”単位を前提としているため、データをそのまま利用することはできません。
そこで、livox_ros_driver2から出力される加速度データを“m/s²”に変換する専用ノードを作成しました。
このノードをlivox_ros_driver2の後段へ追加するだけで、簡単にROS2上でMID-360内蔵IMUのデータを使用することが可能です。
IMU_converter
以下は、IMUの値を“g”から“m/s²”へ変換するROS2用Pythonノードの実装例です。
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Imu
from geometry_msgs.msg import Vector3
from rclpy.qos import qos_profile_sensor_data
class ImuConverter(Node):
def __init__(self):
super().__init__('imu_converter')
self.subscriber = self.create_subscription(
Imu,
'/livox/imu', # 元のIMUデータのトピック
self.listener_callback,
qos_profile_sensor_data
)
self.publisher = self.create_publisher(
Imu,
'/imu_converted', # 変換後のIMUデータのトピック
qos_profile_sensor_data
)
def listener_callback(self, msg):
# 加速度をgからm/s²に変換
conversion_factor = 9.81
converted_msg = Imu()
# ヘッダー情報をコピー
converted_msg.header = msg.header
# ジャイロスコープデータはそのままコピー
converted_msg.angular_velocity = msg.angular_velocity
# 加速度データを変換
converted_msg.linear_acceleration = Vector3(
x=msg.linear_acceleration.x * conversion_factor,
y=msg.linear_acceleration.y * conversion_factor,
z=msg.linear_acceleration.z * conversion_factor
)
# 姿勢情報もそのままコピー(必要に応じて変更)
converted_msg.orientation = msg.orientation
# 変換したIMUデータをパブリッシュ
self.publisher.publish(converted_msg)
#self.get_logger().info('Published converted IMU data')
def main(args=None):
rclpy.init(args=args)
imu_converter = ImuConverter()
rclpy.spin(imu_converter)
imu_converter.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
変換後のデータは“m/s²”単位の/imu_convertedトピックでPublishされるため、以降の処理で加速度データを直接利用することができます。
以下が変換前:/livox/imuと変換後:/imu_convertedのデータです。
変換後は、linear_accelerationの値が約9.81倍なっていることが分かります。

/livox/imu データ
/imu_converted データ
本ノードは、ROS2のHumble*1およびJazzy*2環境で動作確認済みです。
また、LiDARベースのSLAMアルゴリズムであるFAST-LIOとの併用により、自己位置のロストを大幅に低減できることが確認できました。これは、IMUデータの前処理や座標変換の精度向上によって、SLAMの安定性が向上したためです。
一方、livox_ros_driver2のソースコードを直接修正することでも対応可能です。
livox_ros_driver2のソースコードの修正方法については、こちらのドキュメントをご参照ください。
*1 Ubuntu 22.04 LTSに対応したROS2のバージョン
*2 Ubuntu 24.04 LTSに対応したROS2のバージョン
まとめ
本ノードを活用することで、MID-360のIMUデータをROS2環境で正確かつ効率的に利用でき、外付けIMU不要で高精度な自己位置推定や点群補正が実現できます。そのため、3DマッピングやSLAMを使った自動走行システムの精度・安定性向上に大きく貢献します。
関連情報
免責事項
本システムはあくまでもデモ用として確認しています。そのため、不具合などの責任は一切負いかねます。