全体構成
rogi_launch/launch/rogi_nav.launch.py が、profile YAML を読み込んで各 component launch を組み合わせます。
多くの C++ ノードは rclcpp_components の composable node として実装され、必要に応じて
component_container_mt にロードされます。
example/sample/config/real.yaml と example/sample/config/sim.yaml の
launch.components で、コンポーネント単位またはノード単位に有効/無効を切り替えます。
データの流れは大きく次の順序です。
map_loaderが CSV 地図をrogi_msgs/msg/Mapとして配信し、map_converterが自己位置推定用のOccupancyGridに変換します。実機では
sick_scan_xdが LiDAR scan を出し、scan_mergerが複数 scan をbase_link基準の 1 本の scan に統合します。シミュレーションでは Gazebo 側の scan が同じ後段に入ります。line_detectorが scan 点群から RANSAC で線分を抽出し、emcl2とransac_localizerが地図、scan、odom、線分を使ってmap上の robot pose を推定します。simple_pure_pursuitが推定 pose と CSV 経路から/cmd_velを生成します。実機では
cmd_vel_to_dcmotor_nodeが/cmd_velを Rogidrive motor command に変換し、wheel_odometryが encoder から/odomを更新します。state_nodeが BehaviorTree を tick し、FollowPathaction を通じて pure pursuit の経路実行順を管理します。
frame は map -> odom -> base_link -> sensor が基本です。emcl2 と ransac_localizer は map -> odom を publish し得るため、同時有効化する場合は profile と TF の競合に注意します。