3D LiDARデータの表示はカッコいいけど、直近で使いたいのはLaserScan形式。
いずれ実現したいと思っているナビに必要なのも、LaserScan形式。
(しばし沈黙)
というわけで、PointCloud2をLaserScanにリアルタイム変換してみました。
といっても、pointcloud-to-laserscanパッケージを使っただけです。
こんなの簡単だろうと思っていたら、rviz2の表示で少しハマりました。。。
環境
PC: TRIGKEY Green G5
OS: Ubuntu 22.04.3
ROS2 : Humble
LiDAR: Livox Mid-360
livox_ros_driver2: ユーザーによる修正版 (公式版でも問題ないはず。)
livox独自形式からPointCloud2形式への変換: livox_to_pointcloud2
インストール
$ sudo apt install ros-humble-pointcloud-to-laserscan -y
launchファイルの例
起動できるようにlaunchファイルを作成。
ファイル名は何でもいいけど、例として ros2_pointcloud_to_laserscan.launch.py で作成。
中身は次のとおり。
Mid-360用にアレンジしましたが、ほとんどこちらをパクリました参考にさせて頂きました。
from launch import LaunchDescription from launch.actions import DeclareLaunchArgument from launch.actions import ExecuteProcess from launch.substitutions import LaunchConfiguration from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package='pointcloud_to_laserscan', executable='pointcloud_to_laserscan_node', remappings=[('cloud_in', '/converted_pointcloud2'), ('scan', '/scan')], parameters=[{ 'target_frame': '', 'transform_tolerance': 0.01, 'min_height': -0.2, # -20cm 'max_height': 0.2, # 20cm 'angle_min': -3.1415, # - M_PI 'angle_max': 3.1415, # M_PI 'angle_increment': 0.0174, # M_PI * 2 / 360.0 = 1 degree 'scan_time': 0.1,# 10Hz 'range_min': 0.1, # 10cm 'range_max': 70.0, # 70m 'use_inf': True, 'inf_epsilon': 1.0 }], name='pointcloud_to_laserscan' ) ])
launchファイルを使って起動
$ ros2 launch ros2_pointcloud_to_laserscan.launch.py
rviz2でLaserScanを表示する方法と注意点
前回のrviz2でのPointCloud2表示と同様で、rviz2のFixed Frameと表示したいフレームの関連には注意が必要。
表示されない場合の手軽な対処方法は、riz2のFixed Frameにlivox_frameを設定。
あとは同じようにLaserScanのtopicを指定して追加。
これで表示できる・・・と思ってたけど表示されなかった。
Reliability Policy を Best Effort に変える必要がある。
(センサーデータだとわかりきっているのに、なぜBest Effortではないのか謎)
ここまで設定して、ようやく表示。 白色がLaserScan。
リンク
pointcloud_to_laserscan
[ROS 2] pointcloud_to_laserscanパッケージの使い方