forked from zbw/yiliao2026
with '#' will be ignored, and an empty message aborts the commit. On branch master Your branch is ahead of 'origin/master' by 31 commits. (use "git push" to publish your local commits) Changes to be committed: new file: .gitignore new file: .vscode/c_cpp_properties.json new file: .vscode/launch.json new file: .vscode/settings.json new file: CLAUDE.md new file: README.md new file: bashes/README.md new file: bashes/radar-driver-switch.sh new file: bashes/radar-driver-switch.sh.bak new file: dependencies/dependencies.txt new file: src/LSLIDAR_X_ROS2-20240228/src/README.md new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/CMakeLists.txt new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/include/lslidar_driver/input.h new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/include/lslidar_driver/lsiosr.h new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/include/lslidar_driver/lslidar_driver.h new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lslidar_double_launch.py new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lsm10_net_launch.py new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lsm10_uart_launch.py new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lsm10p_net_launch.py new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lsm10p_uart_launch.py new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lsn10_launch.py new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lsn10_net_launch.py new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lsn10p_launch.py new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lsn10p_net_launch.py new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/viewer_scan_launch.py new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/package.xml new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/params/lidar_net_ros2/lsm10_net.yaml new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/params/lidar_net_ros2/lsm10p_net.yaml new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/params/lidar_net_ros2/lsn10_net.yaml new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/params/lidar_net_ros2/lsn10p_net.yaml new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/params/lidar_uart_ros2/lsm10.yaml new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/params/lidar_uart_ros2/lsm10_p.yaml new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/params/lidar_uart_ros2/lsn10.yaml new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/params/lidar_uart_ros2/lsn10p.yaml new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/rviz/lslidar.rviz new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/src/input.cc new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/src/lsiosr.cpp new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/src/lslidar_driver.cc new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/src/lslidar_driver.cc.bak new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/src/lslidar_driver_node.cc new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_msgs/CMakeLists.txt new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_msgs/msg/LslidarDifop.msg new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_msgs/msg/LslidarPacket.msg new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_msgs/msg/LslidarPoint.msg new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_msgs/msg/LslidarScan.msg new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_msgs/msg/LslidarSweep.msg new file: src/LSLIDAR_X_ROS2-20240228/src/lslidar_msgs/package.xml new file: src/LSLIDAR_X_ROS2-20240228/src/version.txt new file: src/LSLIDAR_X_ROS2-20240228/src/wheeltec_udev.sh new file: "src/LSLIDAR_X_ROS2-20240228/src/\351\225\255\347\245\236Lsx\351\233\267\350\276\276\346\227\213\350\275\254\350\247\222\345\272\246.png" new file: src/LSLIDAR_X_ROS2-20240228/wheeltec_lidar.launch.py new file: "src/LSLIDAR_X_ROS2-20240228/wheeltec_lidar.launch.py\344\273\205\345\234\250WHEELTEC\351\225\234\345\203\217\344\270\255\344\275\277\347\224\250" new file: src/cyy_navigation2/CMakeLists.txt new file: src/cyy_navigation2/bt/follow_point.xml new file: src/cyy_navigation2/bt/nav_to_pose_with_consistent_replanning_and_if_path_becomes_invalid.xml new file: src/cyy_navigation2/bt/navigate_through_poses_w_replanning_and_recovery.xml new file: src/cyy_navigation2/bt/navigate_to_pose_w_replanning_and_recovery.xml new file: src/cyy_navigation2/bt/navigate_to_pose_w_replanning_goal_patience_and_recovery.xml new file: src/cyy_navigation2/bt/navigate_w_recovery_and_replanning_only_if_path_becomes_invalid.xml new file: src/cyy_navigation2/bt/navigate_w_replanning_distance.xml new file: src/cyy_navigation2/bt/navigate_w_replanning_only_if_goal_is_updated.xml new file: src/cyy_navigation2/bt/navigate_w_replanning_only_if_path_becomes_invalid.xml new file: src/cyy_navigation2/bt/navigate_w_replanning_speed.xml new file: src/cyy_navigation2/bt/navigate_w_replanning_time.xml new file: src/cyy_navigation2/bt/odometry_calibration.xml new file: src/cyy_navigation2/config/nav2_params.yaml new file: src/cyy_navigation2/launch/car_bringup.launch.py new file: src/cyy_navigation2/launch/cyy_nav.launch.py new file: src/cyy_navigation2/launch/cyy_nav_box.launch.py new file: src/cyy_navigation2/maps/cyy_map.data new file: src/cyy_navigation2/maps/cyy_map.pgm new file: src/cyy_navigation2/maps/cyy_map.yaml new file: src/cyy_navigation2/maps/cyy_map1.pgm new file: src/cyy_navigation2/maps/cyy_map1.yaml new file: src/cyy_navigation2/package.xml new file: src/cyy_navigation2/param/nav2_params.yaml new file: src/cyy_navigation2/param/slam_toolbox_localization.yaml new file: src/cyy_slamtoolbox/CMakeLists.txt new file: src/cyy_slamtoolbox/config/angular_filter_example.yaml new file: src/cyy_slamtoolbox/config/box_filter_example.yaml new file: src/cyy_slamtoolbox/config/footprint_filter_example.yaml new file: src/cyy_slamtoolbox/config/intensity_filter_example.yaml new file: src/cyy_slamtoolbox/config/laser_filter_config.yaml new file: src/cyy_slamtoolbox/config/mapper_params_lifelong.yaml new file: src/cyy_slamtoolbox/config/mapper_params_localization.yaml new file: src/cyy_slamtoolbox/config/mapper_params_offline.yaml new file: src/cyy_slamtoolbox/config/mapper_params_online_async.yaml new file: src/cyy_slamtoolbox/config/mapper_params_online_sync.yaml new file: src/cyy_slamtoolbox/config/mask_filter_example.yaml new file: src/cyy_slamtoolbox/config/median_filter_example.yaml new file: src/cyy_slamtoolbox/config/median_spatial_filter_example.yaml new file: src/cyy_slamtoolbox/config/multiple_filters_example.yaml new file: src/cyy_slamtoolbox/config/pass_through_example.yaml new file: src/cyy_slamtoolbox/config/polygon_filter_example.yaml new file: src/cyy_slamtoolbox/config/range_filter_example.yaml new file: src/cyy_slamtoolbox/config/scan_blob_filter_example.yaml new file: src/cyy_slamtoolbox/config/sector_filter_example.yaml new file: src/cyy_slamtoolbox/config/shadow_filter_example.yaml new file: src/cyy_slamtoolbox/config/slam_toolbox_default.rviz new file: src/cyy_slamtoolbox/config/speckle_filter_example.yaml new file: src/cyy_slamtoolbox/launch/cyy_slam_toolbox_launch.launch.py new file: src/cyy_slamtoolbox/launch/cyy_slam_toolbox_location.launch.py new file: src/cyy_slamtoolbox/launch/filter.launch.py new file: src/cyy_slamtoolbox/package.xml new file: src/gc_navigation2_real/CMakeLists.txt new file: src/gc_navigation2_real/behavior_tree/nav_to_pose_ackermann.xml new file: src/gc_navigation2_real/config/slam_toolbox_async_real.yaml new file: src/gc_navigation2_real/config/slam_toolbox_localization_real.yaml new file: src/gc_navigation2_real/launch/real_bringup.launch.py new file: src/gc_navigation2_real/launch/real_nav2_slam.launch.py new file: src/gc_navigation2_real/launch/real_nav2_slam_online.launch.py new file: src/gc_navigation2_real/launch/real_slam_mapping.launch.py new file: src/gc_navigation2_real/maps/Readme.txt new file: src/gc_navigation2_real/package.xml new file: src/gc_navigation2_real/params/gc_navigation_slam_real.yaml new file: src/gc_navigation2_slamtoolbox/CMakeLists.txt new file: src/gc_navigation2_slamtoolbox/config/mapper_params_lifelong.yaml new file: src/gc_navigation2_slamtoolbox/config/mapper_params_localization.yaml new file: src/gc_navigation2_slamtoolbox/config/mapper_params_offline.yaml new file: src/gc_navigation2_slamtoolbox/config/mapper_params_online_multi_async.yaml new file: src/gc_navigation2_slamtoolbox/config/mapper_params_online_sync.yaml new file: src/gc_navigation2_slamtoolbox/config/nav_to_pose_ackermann.xml new file: src/gc_navigation2_slamtoolbox/config/slam_toolbox_async.yaml new file: src/gc_navigation2_slamtoolbox/config/slam_toolbox_localization.yaml new file: src/gc_navigation2_slamtoolbox/config/slam_toolbox_mapping.yaml new file: src/gc_navigation2_slamtoolbox/launch/gc_nav2_with_amcl.launch.py new file: src/gc_navigation2_slamtoolbox/launch/gc_nav2_with_slam.launch.py new file: src/gc_navigation2_slamtoolbox/launch/gc_nav2_with_slam_online.launch.py new file: src/gc_navigation2_slamtoolbox/launch/gc_nav2_with_slam_online_real.launch.py new file: src/gc_navigation2_slamtoolbox/launch/gc_nav_slamtoolbox_lifelong.launch.py new file: src/gc_navigation2_slamtoolbox/launch/gc_nav_slamtoolbox_location.launch.py new file: src/gc_navigation2_slamtoolbox/launch/gc_nav_slamtoolbox_on_async.launch.py new file: src/gc_navigation2_slamtoolbox/launch/gc_slam_mapping.launch.py new file: src/gc_navigation2_slamtoolbox/maps/my_map.data new file: src/gc_navigation2_slamtoolbox/maps/my_map.pgm new file: src/gc_navigation2_slamtoolbox/maps/my_map.posegraph new file: src/gc_navigation2_slamtoolbox/maps/my_map.yaml new file: src/gc_navigation2_slamtoolbox/maps/zhihui.data new file: src/gc_navigation2_slamtoolbox/maps/zhihui.pgm new file: src/gc_navigation2_slamtoolbox/maps/zhihui.posegraph new file: src/gc_navigation2_slamtoolbox/maps/zhihui.yaml new file: src/gc_navigation2_slamtoolbox/package.xml new file: src/gc_navigation2_slamtoolbox/params/gc_navigation_amcl.yaml new file: src/gc_navigation2_slamtoolbox/params/gc_navigation_slam.yaml new file: src/gc_navigation2_slamtoolbox/params/gc_navigation_slam.yaml.bak new file: src/gc_navigation2_slamtoolbox/world/zhihui/model.config new file: src/gc_navigation2_slamtoolbox/world/zhihui/model.sdf new file: src/gc_navigation_fish/CMakeLists.txt new file: src/gc_navigation_fish/launch/gc_navigation.launch.py new file: src/gc_navigation_fish/maps/test_map.pgm new file: src/gc_navigation_fish/maps/test_map.yaml new file: src/gc_navigation_fish/package.xml new file: src/gc_navigation_fish/param/gc_navigation.yaml new file: src/gc_navigation_fish/param/navigation_test.yaml new file: src/gc_slam_toolbox_fish/CMakeLists.txt new file: src/gc_slam_toolbox_fish/config/gc_2d.lua new file: src/gc_slam_toolbox_fish/launch/catograph.launch.py new file: src/gc_slam_toolbox_fish/package.xml new file: src/ground_slam/.gitignore new file: src/ground_slam/CMakeLists.txt new file: src/ground_slam/LICENSE.md new file: src/ground_slam/README.md new file: src/ground_slam/cmake/FindEigen3.cmake new file: src/ground_slam/cmake/FindFFTW3.cmake new file: src/ground_slam/configs/config_HD.yaml new file: src/ground_slam/configs/config_geekplus.yaml new file: src/ground_slam/configs/config_ntu.yaml new file: src/ground_slam/figures/data_association.jpg new file: src/ground_slam/figures/features_small.jpg new file: src/ground_slam/figures/fig1.jpg new file: src/ground_slam/figures/loop_error.jpg new file: src/ground_slam/figures/loop_trajectory.jpg new file: src/ground_slam/figures/pipeline.png new file: src/ground_slam/figures/rmse_curve.jpg new file: src/ground_slam/figures/sample_images.jpg new file: src/ground_slam/figures/trajectory.jpg new file: src/ground_slam/figures/video.png new file: src/ground_slam/include/camera.h new file: src/ground_slam/include/circ_shift.h new file: src/ground_slam/include/correlation_flow.h new file: src/ground_slam/include/dataset.h new file: src/ground_slam/include/edge.h new file: src/ground_slam/include/frame.h new file: src/ground_slam/include/loop_closure.h new file: src/ground_slam/include/map.h new file: src/ground_slam/include/map_builder.h new file: src/ground_slam/include/map_stitcher.h new file: src/ground_slam/include/optimization_2d/angle_local_parameterization.h new file: src/ground_slam/include/optimization_2d/normalize_angle.h new file: src/ground_slam/include/optimization_2d/pose_graph_2d.h new file: src/ground_slam/include/optimization_2d/pose_graph_2d_error_term.h new file: src/ground_slam/include/optimization_2d/types.h new file: src/ground_slam/include/read_configs.h new file: src/ground_slam/include/thread_publisher.h new file: src/ground_slam/include/timer.h new file: src/ground_slam/include/utils.h new file: src/ground_slam/include/visualization.h new file: src/ground_slam/main.cpp new file: src/ground_slam/package.xml new file: src/ground_slam/src/camera.cc new file: src/ground_slam/src/correlation_flow.cc new file: src/ground_slam/src/dataset.cc new file: src/ground_slam/src/edge.cc new file: src/ground_slam/src/frame.cc new file: src/ground_slam/src/loop_closure.cc new file: src/ground_slam/src/map.cc new file: src/ground_slam/src/map_builder.cc new file: src/ground_slam/src/map_stitcher.cc new file: src/ground_slam/src/optimization_2d/pose_graph_2d.cc new file: src/ground_slam/src/thread_publisher.cc new file: src/ground_slam/src/timer.cc new file: src/ground_slam/src/utils.cc new file: src/ground_slam/src/visualization.cc new file: src/ground_slam/supplementary/GroundSLAM_Supplement_Materia.pdf new file: src/origincar_base/CMakeLists.txt new file: src/origincar_base/config/ekf.yaml new file: src/origincar_base/config/imu.yaml new file: src/origincar_base/include/origincar_base/Quaternion_Solution.h new file: src/origincar_base/include/origincar_base/origincar_base.h new file: src/origincar_base/launch/__pycache__/testtwo.launch.cpython-38.pyc new file: src/origincar_base/launch/base_serial.launch.py new file: src/origincar_base/launch/ekf.launch.py new file: src/origincar_base/launch/origincar_bringup.launch.py new file: src/origincar_base/launch/robot_mode_description.launch.py new file: src/origincar_base/msg/Position.msg new file: src/origincar_base/package.xml new file: src/origincar_base/scripts/__pycache__/cmd_vel_to_ackermann_drive.cpython-310.pyc new file: src/origincar_base/scripts/cmd_vel_to_ackermann_drive.py new file: src/origincar_base/src/Quaternion_Solution.cpp new file: src/origincar_base/src/origincar_base.cpp new file: src/origincar_base/src/origincar_base.cpp.bak new file: src/origincar_description/CMakeLists.txt new file: src/origincar_description/CMakeLists.txt.save new file: src/origincar_description/config/joint_names_origincar_description.yaml new file: src/origincar_description/config/joint_names_origincar_description.yaml:Zone.Identifier new file: "src/origincar_description/config/joint_names_origincar_description.yaml\357\200\272Zone.Identifier" new file: src/origincar_description/launch/display.launch new file: src/origincar_description/launch/display.launch.py new file: src/origincar_description/launch/gazebo.launch new file: src/origincar_description/launch/gazebo.launch.py new file: src/origincar_description/meshes/base_link.STL new file: src/origincar_description/meshes/base_link.STL:Zone.Identifier new file: "src/origincar_description/meshes/base_link.STL\357\200\272Zone.Identifier" new file: src/origincar_description/meshes/down_left_Link.STL new file: src/origincar_description/meshes/down_left_Link.STL:Zone.Identifier new file: "src/origincar_description/meshes/down_left_Link.STL\357\200\272Zone.Identifier" new file: src/origincar_description/meshes/down_right_Link.STL new file: src/origincar_description/meshes/down_right_Link.STL:Zone.Identifier new file: "src/origincar_description/meshes/down_right_Link.STL\357\200\272Zone.Identifier" new file: src/origincar_description/meshes/up_left_Link.STL new file: src/origincar_description/meshes/up_left_Link.STL:Zone.Identifier new file: "src/origincar_description/meshes/up_left_Link.STL\357\200\272Zone.Identifier" new file: src/origincar_description/meshes/up_right_Link.STL new file: src/origincar_description/meshes/up_right_Link.STL:Zone.Identifier new file: "src/origincar_description/meshes/up_right_Link.STL\357\200\272Zone.Identifier" new file: src/origincar_description/package.xml new file: src/origincar_description/rviz/README new file: src/origincar_description/rviz/display.rviz new file: src/origincar_description/urdf/origincar.urdf new file: src/origincar_description/urdf/origincar.xacro new file: src/origincar_description/world/fishbot.world new file: src/origincar_description/world/gc_world.world new file: src/origincar_description/world/test.world new file: src/origincar_description/world/zhihui.world new file: src/origincar_msg/CMakeLists.txt new file: src/origincar_msg/msg/Data.msg new file: src/origincar_msg/msg/Sign.msg new file: src/origincar_msg/package.xml new file: src/zbw_slamtoolbox/CMakeLists.txt new file: src/zbw_slamtoolbox/config/mapper_params_online_async.yaml new file: src/zbw_slamtoolbox/config/mapper_params_online_sync copy.yaml new file: src/zbw_slamtoolbox/config/navigation.yaml new file: src/zbw_slamtoolbox/launch/navigation.launch.py new file: src/zbw_slamtoolbox/launch/slamtoolbox.launch.py new file: src/zbw_slamtoolbox/package.xml new file: "\347\253\236\350\265\233\346\226\271\346\241\210_\347\254\25421\345\261\212\346\231\272\350\203\275\346\261\275\350\275\246\347\253\236\350\265\233\345\234\260\347\223\234\346\234\272\345\231\250\344\272\272\350\265\233\351\241\271.md" new file: "\350\260\203\350\257\225\350\256\260\345\275\225.log"
7.7 KiB
7.7 KiB
CLAUDE.md
项目概述
这是一个 ROS 2 Humble 工作空间,用于 Ackermann 转向小车的 Gazebo 仿真、SLAM 建图和 Nav2 导航。同时支持实车部署(无 Gazebo)。
工作空间结构
test_ws/
├── src/
│ ├── gc_navigation2_slamtoolbox/ # 仿真版:导航+SLAM 启动文件和配置
│ │ ├── launch/ # Python launch 文件
│ │ ├── config/ # slam_toolbox 参数
│ │ ├── params/ # Nav2 参数
│ │ ├── maps/ # 地图文件 (.pgm, .yaml, .posegraph)
│ │ └── world/ # Gazebo 模型 (zhihui/)
│ ├── gc_navigation2_real/ # 实车版:导航+SLAM 启动文件和配置(无 Gazebo)
│ │ ├── launch/ # Python launch 文件
│ │ ├── config/ # slam_toolbox 参数(实车调优)
│ │ ├── params/ # Nav2 参数(use_sim_time=false)
│ │ ├── maps/ # 实车地图存放目录
│ │ └── behavior_tree/ # 阿克曼自定义行为树
│ ├── origincar_description/ # 机器人 URDF 和 Gazebo world
│ │ ├── urdf/ # origincar.urdf
│ │ ├── world/ # .world 文件
│ │ ├── meshes/ # 3D 模型
│ │ ├── launch/ # display.launch.py
│ │ └── rviz/ # RViz 配置
│ ├── origincar_base/ # 实车底盘驱动(串口通信+EKF+IMU融合)
│ │ ├── src/ # C++ 源码(origincar_base.cpp)
│ │ ├── scripts/ # cmd_vel_to_ackermann_drive.py
│ │ ├── launch/ # origincar_bringup / base_serial / ekf
│ │ └── config/ # ekf.yaml / imu.yaml
│ ├── origincar_msg/ # 自定义 ROS 2 消息
│ │ └── msg/ # Data.msg / Sign.msg
│ └── LSLIDAR_X_ROS2-20240228/ # 镭神激光雷达 ROS 2 驱动
│ └── src/
│ ├── lslidar_driver/ # 雷达驱动核心
│ └── lslidar_msgs/ # 雷达消息定义
├── build/ # colcon build 输出
├── install/ # colcon install 输出 (含符号链接)
└── log/ # 构建日志
构建命令
cd /home/guoch/test_ws
source /opt/ros/humble/setup.bash
colcon build --symlink-install
source install/setup.bash
常用 Launch 文件
仿真版 (gc_navigation2_slamtoolbox)
| 文件 | 功能 |
|---|---|
gc_slam_mapping.launch.py |
Gazebo + SLAM 建图模式 |
gc_nav2_with_slam_online.launch.py |
已知地图 + SLAM 在线更新 + Nav2 导航 |
gc_nav2_with_slam.launch.py |
已知地图 + SLAM 定位 + Nav2 导航 |
gc_nav2_with_amcl.launch.py |
AMCL 定位 + Nav2 导航 |
实车版 (gc_navigation2_real)
| 文件 | 功能 |
|---|---|
real_bringup.launch.py |
基础 bringup(底盘驱动+雷达+TF,无导航) |
real_slam_mapping.launch.py |
实车 SLAM 建图模式 |
real_nav2_slam.launch.py |
已知地图 + SLAM 定位 + Nav2 导航 |
real_nav2_slam_online.launch.py |
已知地图 + SLAM 在线更新 + Nav2 导航 |
机器人参数 (origincar)
- 类型: Ackermann 转向小车
- 尺寸: 0.276 × 0.214 × 0.211 m (长×宽×高)
- 轴距: 0.143 m(URDF 中前轮 x=0.0715,后轮 x=-0.0715),轮距: 0.189 m
- 轮子: 半径 0.03 m,厚 0.025 m
- 激光雷达: 360°, 0.12
3.5 m, 5 Hz(仿真); 镭神 N10 0.1512m(实车) - IMU: 100 Hz, 含高斯噪声
- Gazebo 插件:
gazebo_ros_ackermann_drive,gazebo_ros_ray_sensor,gazebo_ros_imu_sensor
实车 TF 树
map ──→ odom_combined ──→ base_footprint ──→ base_link ──→ laser
↑ ↑ ↑ ↑
slam_toolbox EKF static TF URDF/static
(定位) (融合odom+IMU) (origincar_bringup)
- slam_toolbox 发布
map → odom_combined - EKF 发布
odom_combined → base_footprint - origincar_bringup 发布
base_footprint → base_link(z=0)、base_link → laser - robot_state_publisher 发布 URDF 各连杆 TF
仿真 vs 实车关键差异
| 方面 | 仿真版 | 实车版 |
|---|---|---|
| use_sim_time | true |
false |
| odom_frame | odom |
odom_combined(EKF 融合后) |
| 底盘驱动 | Gazebo plugin | origincar_base 串口驱动 |
| 激光雷达 | Gazebo ray plugin | lslidar_driver(镭神 N10) |
| robot_state_publisher | launch 文件内启动 | origincar_bringup 已包含,勿重复启动 |
| joint_state_publisher | launch 文件内启动 | origincar_bringup 已包含,勿重复启动 |
阿克曼底盘模式
通过 akmcar 参数控制,链路如下:
origincar_bringup.launch.py
└─ akmcar=LaunchConfiguration('akmcar', default='true')
└─ 传入 base_serial.launch.py
├─ IfCondition(true) → origincar_base_node (akm_cmd_vel='ackermann_cmd')
│ + cmd_vel_to_ackermann_drive.py (Twist→Ackermann)
└─ UnlessCondition(false) → 差速模式(跳过)
数据流:MPPI cmd_vel(Twist) → cmd_vel_to_ackermann_drive.py → ackermann_cmd(AckermannDriveStamped) → STM32
关键参数:
cmd_vel_to_ackermann_drive.py:wheelbase = 0.143(与 URDF 一致)akmcar=true时 STM32 接收speed + steering_angleakmcar=false时 STM32 接收vx + vy + wz(固件自行转换)
关键设计
- map_server 提供全量静态底图(
/map) - slam_toolbox 负责定位和增量建图,重映射
/map→/slam_map避免冲突 - Nav2 使用
global_costmap/static_layer ← /map+local_costmap/obstacle_layer ← /scan - 保存地图:
ros2 service call /slam_toolbox/serialize_map ... - 实车版 launch 文件不应自行启动
robot_state_publisher和joint_state_publisher,origincar_bringup已包含
地图文件
地图放在 src/gc_navigation2_slamtoolbox/maps/(仿真)和 src/gc_navigation2_real/maps/(实车),包含:
xxx.pgm— 地图图像xxx.yaml— 地图元数据 (resolution, origin, thresholds)xxx.posegraph— 序列化的位姿图
Gazebo World
World 文件在 src/origincar_description/world/:
zhihui.world— 智慧楼墙体环境(内联模型)test.world— 测试环境fishbot.world/gc_world.world— 其他场景
实车底盘驱动包 (origincar_base)
origincar_base_node(C++): 串口读写(/dev/ttyACM0, 115200bps)、航迹推算、四元数姿态解算(Mahony AHRS)cmd_vel_to_ackermann_drive.py(Python): Twist → AckermannDriveStamped 转换,wheelbase=0.143- 帧协议: 24 字节收(帧头0x7B/帧尾0x7D)/ 11 字节发
- EKF 融合:
/odom+ IMU →/odom_combined,two_d_mode=true
注意事项
- 使用
--symlink-install构建,Python launch 文件修改后无需重新编译 .world文件不应使用model://外部引用,应将模型内联定义robot_base_frame在 ackermann plugin 中应设为base_footprint- 实车
gc_navigation2_real的 launch 文件调用origincar_bringup.launch.py时,不再重复启动robot_state_publisher和joint_state_publisher - 轴距参数在三处需保持一致:URDF(0.143m)、
cmd_vel_to_ackermann_drive.py(0.143m)、Nav2 plannerminimum_turning_radius(0.40m)