Apache License 2.0

技术解读

以下内容由 GitRead 中文社区 编辑团队基于项目 README 与官方资料整理, 结合中文开发者的常见使用场景补充技术选型建议。具体以项目官方文档为准。

深度技术分析:SMBU-PolarBear-Robotics-Team/pb2025_sentry_nav

项目背景与痛点

深圳南科大-港理工联合大学PolarBear团队的Sentry Navigation Sim2Real项目致力于解决RoboMaster 2025对机器人导航开发中的虚拟到现实转换问题。在智能机器人开发中,从仿真环境到真实世界的无缝迁移是重要的技术挑战之一。此项目提供了从仿真到实测的数据映射方案,有效简化了导航逻辑的真实测试过程,提升了开发效率。

核心技术揭秘

该项目使用了一系列复杂的技术栈和算法来实现Sim2Real转换。代码结构清晰,基于ROS(Robot Operating System)构建,提供了一整套配置和中间件,以适应不同的仿真和实测环境。其核心功能模块包括状态同步、姿态更新和传感器模型处理等。

graph TD subgraph "仿真环境" SimEnvironment[SimEnvironment] SimEnvironment --> SimDataFlow[Sim2Real数据流] end SimDataFlow --> RealDataFlow[Real2Sim数据流] subgraph "现实环境" RealEnvironment[RealEnvironment] RealDataFlow --> RealEnvironment RealEnvironment --> ControlUnit[控制单元] ControlUnit --> MotorControl[电机控制] end

此项目采用的数据流采取双向映射,保证在仿真和真实环境之间有良好的一致性。从仿真到现实的转换过程中,关键在于数据流的精确建模和映射,确保传感器输入和执行器输出在两种环境下的一致性。

功能亮点与差异

相比于市场上常见的仿真到现实转换解决方案,此项目具有以下几点显著差异:

  • 精细化的映射模型:该项目通过对仿真和现实传感器具体模型的模拟,实现较为精准的数据映射。
  • 灵活性和可扩展性:基于ROS,可以方便地进行功能拓展和模块化配置,满足不同场景下的需求。
  • 高效性和稳定性:其核心算法经过精心设计,能够有效提高数据转换的效率和稳定性,减少由于环境变化带来的误差。

应用场景与落地建议

此项目适合于智能机器人导航仿真平台到真实应用平台部署测试的场景,特别适用于需要高仿真度的复杂机器人驱动任务中。在实际部署中,需要注意的操作要点包括:

  • 环境匹配:确保仿真环境中的物理参数和现实环境尽量一致。
  • 数据同步:保持仿真和现实环境数据的一致性,频繁进行同步校正。
  • 调试便利性:项目本身提供了详尽的文档和多样的配置选项,可以简化调试过程。

综合评价

优点

  • 一致性保证:提供了从仿真到实测的数据一致性的解决方案。
  • 代码实用性:优秀的设计思想,专注于实际使用效果,代码质量高且文档详尽。
  • ROS支持:充分利用ROS的生态系统,具备高扩展性和稳定性。

缺点

  • 高仿真度要求:对于仿真-实测环境高度一致性的需求,增加了项目复杂度。
  • 学习曲线:尽管文档详尽,但对于ROS不熟悉的新用户来说,可能需要一段时间去熟悉系统。

总的来说,SMBU-PolarBear-Robotics-Team/pb2025_sentry_nav项目凭借其高效的数据映射方案和灵活的架构设计,在智能机器人导航开发领域展现出了强大的潜力。如果您正在筹备相关项目的开发,这无疑是一个不错的起点和参考。

关于

GitHub 原始描述(英文)

Shenzhen MSU-BIT University PolarBear Team's Sentry Navigation Sim2Real Package for RoboMaster2025. QQ group: 932119307

描述取自 GitHub 官方 API,保持仓库作者书写的原文。

简要分析

热度分
596
价值分
296
活跃状态
活跃

语言占比

C++
CMake
Dockerfile
Python

Release

README

pb2025_sentry_nav

License Build and Test pre-commit

深圳北理莫斯科大学 北极熊战队 2025 赛季哨兵导航仿真/实车包

PolarBear Logo

BiliBili: 谁说在家不能调车!?更适合新手宝宝的 RM 导航仿真

https://github.com/user-attachments/assets/d9e778e0-fa43-40c2-96c2-e71eaf7737d4

https://github.com/user-attachments/assets/ae4c19a0-4c73-46a0-95bd-909734da2a42

1. Overview

本项目基于 NAV2 导航框架 并参考学习了 autonomous_exploration_development_environment 的设计。

  • 关于坐标变换:

    本项目大幅优化了坐标变换逻辑,考虑雷达原点 lidar_odom 与 底盘原点 odom 之间的隐式变换。

    mid360 倾斜侧放在底盘上,使用 point_lio 里程计,small_gicp 重定位,loam_interface 会将 point_lio 输出的 /cloud_registered 从 lidar_odom 系转换到 odom 系,sensor_scan_generation 将 odom 系的点云转换到 front_mid360 系,并发布变换 odom -> chassis。

    frames_2025_03_26

  • 关于路径规划:

    使用 NAV2 默认的 Global Planner 作为全局路径规划器,pb_omni_pid_pursuit_controller 作为路径跟踪器。

  • namespace:

    为了后续拓展多机器人,本项目引入 namespace 的设计,与 ROS 相关的 node, topic, action 等都加入了 namespace 前缀。如需查看 tf tree,请使用命令 ros2 run rqt_tf_tree rqt_tf_tree --ros-args -r /tf:=tf -r /tf_static:=tf_static -r __ns:=/red_standard_robot1

  • LiDAR:

    Livox mid360 倾斜侧放在底盘上。

    注:仿真环境中,实际上 point pattern 为 velodyne 样式的机械式扫描。此外,由于仿真器中输出的 PointCloud 缺少部分 field,导致 point_lio 无法正常估计状态,故仿真器输出的点云经过 ign_sim_pointcloud_tool 处理添加 time field。

  • 文件结构

    .
    ├── fake_vel_transform                  # 虚拟速度参考坐标系,以应对云台扫描模式自旋,详见子仓库 README
    ├── ign_sim_pointcloud_tool             # 仿真器点云处理工具
    ├── livox_ros_driver2                   # Livox 驱动
    ├── loam_interface                      # point_lio 等里程计算法接口
    ├── pb_teleop_twist_joy                 # 手柄控制
    ├── pb2025_nav_bringup                  # 启动文件
    ├── pb2025_sentry_nav                   # 本仓库功能包描述文件
    ├── pb_omni_pid_pursuit_controller      # 路径跟踪控制器
    ├── point_lio                           # 里程计
    ├── pointcloud_to_laserscan             # 将 terrain_map 转换为 laserScan 类型以表示障碍物(仅 SLAM 模式启动)
    ├── sensor_scan_generation              # 点云相关坐标变换
    ├── small_gicp_relocalization           # 重定位
    ├── terrain_analysis                    # 距车体 4m 范围内地形分析,将障碍物离地高度写入 PointCloud intensity
    └── terrain_analysis_ext                # 车体 4m 范围外地形分析,将障碍物离地高度写入 PointCloud intensity
    

2. Quick Start

2.1 Option 1: Docker

2.1.1 Setup Environment
  • Docker

  • 允许 Docker Container 访问宿主机 X11 显示

    xhost +local:docker
    
2.1.2 Create Container
docker run -it --rm --name pb2025_sentry_nav \
  --network host \
  -e "DISPLAY=$DISPLAY" \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  -v /dev:/dev \
  ghcr.io/smbu-polarbear-robotics-team/pb2025_sentry_nav:1.3.2

2.2 Option 2: Build From Source

2.2.1 Setup Environment
  • Ubuntu 22.04

  • ROS: Humble

  • 配套仿真包(Option):rmu_gazebo_simulator

  • Install small_icp:

    sudo apt install -y libeigen3-dev libomp-dev
    
    git clone https://github.com/koide3/small_gicp.git
    cd small_gicp
    mkdir build && cd build
    cmake .. -DCMAKE_BUILD_TYPE=Release && make -j
    sudo make install
    
2.2.2 Create Workspace
mkdir -p ~/ros_ws
cd ~/ros_ws
git clone --recursive https://github.com/SMBU-PolarBear-Robotics-Team/pb2025_sentry_nav.git src/pb2025_sentry_nav

下载先验点云:

先验点云用于 point_lio 和 small_gicp,由于点云文件体积较大,故不存储在 git 中,请前往 FlowUs 下载。

当前 point_lio with prior_pcd 在大场景的效果并不好,比不带先验点云更容易飘,待 Debug 优化

2.2.3 Build
rosdep install -r --from-paths src --ignore-src --rosdistro $ROS_DISTRO -y
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release
Note 注意

推荐使用 --symlink-install 选项来构建你的工作空间,因为 pb2025_sentry_nav 广泛使用了 launch.py 文件和 YAML 文件。这个构建参数会为那些非编译的源文件使用符号链接,这意味着当你调整参数文件时,不需要反复重建,只需要重新启动即可。

2.3 Running

可使用以下命令启动,在 RViz 中使用 Nav2 Goal 插件发布目标点。

2.3.1 仿真

单机器人:

导航模式:

ros2 launch pb2025_nav_bringup rm_navigation_simulation_launch.py \
world:=rmuc_2025 \
slam:=False

建图模式:

ros2 launch pb2025_nav_bringup rm_navigation_simulation_launch.py \
slam:=True

保存栅格地图:ros2 run nav2_map_server map_saver_cli -f <YOUR_MAP_NAME> --ros-args -r __ns:=/red_standard_robot1

多机器人 (实验性功能) :

当前指定的初始位姿实际上是无效的。TODO: 加入 map -> odom 的变换和初始化

ros2 launch pb2025_nav_bringup rm_multi_navigation_simulation_launch.py \
world:=rmul_2024 \
robots:=" \
red_standard_robot1={x: 0.0, y: 0.0, yaw: 0.0}; \
blue_standard_robot1={x: 5.6, y: 1.4, yaw: 3.14}; \
"
2.3.2 实车

建图模式:

ros2 launch pb2025_nav_bringup rm_navigation_reality_launch.py \
slam:=True \
use_robot_state_pub:=True

保存栅格地图:ros2 run nav2_map_server map_saver_cli -f <YOUR_MAP_NAME> --ros-args -r __ns:=/red_standard_robot1

导航模式:

注意修改 world 参数为实际地图的名称

ros2 launch pb2025_nav_bringup rm_navigation_reality_launch.py \
world:=<YOUR_WORLD_NAME> \
slam:=False \
use_robot_state_pub:=True

2.4 Launch Arguments

启动参数在仿真和实车中大部分是通用的。以下是所有启动参数表格的图例。

符号 含义
🤖 适用于实车
🖥️ 适用于仿真
可用性 参数 描述 类型 默认值
🤖 🖥️ namespace 顶级命名空间 string “red_standard_robot1”
🤖🖥️ use_sim_time 如果为 True,则使用仿真(Gazebo)时钟 bool 仿真: True; 实车: False
🤖 🖥️ slam 是否启用建图模式。如果为 True,则禁用 small_gicp 并发送静态 tf(map->odom)。然后自动保存 pcd 文件到 ./point_lio/PCD/ bool False
🤖 🖥️ world 在仿真模式,可用选项为 rmul_2024 或 rmuc_2024 或 rmul_2025 或 rmuc_2025 string “rmuc_2025”
在实车模式,world 参数名称与栅格地图和先验点云图的文件名称相同 string “”
🤖 🖥️ map 要加载的地图文件的完整路径。默认路径自动基于 world 参数构建 string 仿真: rmuc_2025.yaml; 实车: 自动填充
🤖 🖥️ prior_pcd_file 要加载的先验 pcd 文件的完整路径。默认路径自动基于 world 参数构建 string 仿真: rmuc_2025.pcd; 实车: 自动填充
🤖 🖥️ params_file 用于所有启动节点的 ROS2 参数文件的完整路径 string 仿真: nav2_params.yaml; 实车: nav2_params.yaml
🤖🖥️ rviz_config_file 要使用的 RViz 配置文件的完整路径 string nav2_default_view.rviz
🤖 🖥️ autostart 自动启动 nav2 栈 bool True
🤖 🖥️ use_composition 是否使用 Composable Node 形式启动 bool True
🤖 🖥️ use_respawn 如果节点崩溃,是否重新启动。本参数仅 use_composition:=False 时有效 bool False
🤖🖥️ use_rviz 是否启动 RViz bool True
🤖 use_robot_state_pub 是 是否使用 robot_state_publisher 发布机器人的 TF 信息
1. 在仿真中,由于支持的 Gazebo 仿真器已经发布了机器人的 TF 信息,因此不需要再次发布。
2. 在实车中,推荐使用独立的包发布机器人的 TF 信息。例如,gimbal_yaw 和 gimbal_pitch 关节位姿由串口模块 standard_robot_pp_ros2 提供,此时应将 use_robot_state_pub 设置为 False。
如果没有完整的机器人系统或仅测试导航模块(此仓库)时,可将 use_robot_state_pub 设置为 True。此时,导航模块将发布静态的机器人关节位姿数据以维护 TF 树。
注意:需额外克隆并编译 pb2025_robot_description
bool False
Tip 提示

关于本项目更多细节与实车部署指南,请前往 Wiki

2.5 手柄控制

默认情况下,PS4 手柄控制已开启。键位映射关系详见 nav2_params.yaml 中的 teleop_twist_joy_node 部分。

teleop_twist_joy.gif

评论

暂无评论