基于ROS2的差速驱动机器人仿真与控制系统,支持Gazebo物理仿真、键盘遥控及基于势场法(APF)的自动避障导航。
- 操作系统: Ubuntu 22.04 LTS (推荐)
- ROS2版本: Humble Hawksbill
- 依赖:
- ros-humble-desktop
- ros-humble-ros2-control
- ros-humble-ros2-controllers
- ros-humble-gazebo-ros-pkgs
- ros-humble-gazebo-ros2-control
- ros-humble-xacro
source scripts/env_setup.sh./scripts/build_all.shros2 launch diff_robot_control gazebo.launch.pyros2 run diff_robot_teleop teleop_twist_keyboardros2 launch diff_robot_navigation navigation.launch.py# 安装ROS2 Humble (如未安装)
sudo apt install ros-humble-desktop
# 安装额外依赖
sudo apt install \
ros-humble-ros2-control \
ros-humble-ros2-controllers \
ros-humble-gazebo-ros-pkgs \
ros-humble-gazebo-ros2-control \
ros-humble-xacro \
ros-humble-joint-state-publisher-gui# 进入工作空间
cd diff_robot
# 安装依赖
rosdep install --from-paths src --ignore-src -r -y
# 编译
colcon build --symlink-install
# 加载环境
source install/setup.bashros2 launch diff_robot_control gazebo.launch.pyros2 run diff_robot_teleop teleop_twist_keyboardros2 launch diff_robot_description view_robot.launch.pyros2 launch diff_robot_navigation navigation.launch.py# 构建并启动
docker compose -f docker/docker-compose.yaml build
docker compose -f docker/docker-compose.yaml up -d
docker compose -f docker/docker-compose.yaml exec diff-robot bash
# 容器内运行
ros2 launch diff_robot_control gazebo.launch.py| 话题名称 | 类型 | 说明 |
|---|---|---|
/diff_drive_controller/cmd_vel_unstamped |
geometry_msgs/Twist | 速度控制指令(差速驱动控制器) |
/odom |
nav_msgs/Odometry | 里程计数据 |
/joint_states |
sensor_msgs/JointState | 关节状态 |
/scan |
sensor_msgs/LaserScan | 激光雷达扫描数据(避障输入) |
| 按键 | 功能 |
|---|---|
w |
前进 |
x |
后退 |
a |
左转 |
d |
右转 |
s |
停止 |
q/z |
增加/减少线速度 (10%) |
e/c |
增加/减少角速度 (10%) |
遥控节点可配置参数(通过 --ros-args -p 或 YAML 配置):
| 参数 | 默认值 | 说明 |
|---|---|---|
linear_speed |
0.5 | 初始线速度 (m/s) |
angular_speed |
1.0 | 初始角速度 (rad/s) |
max_linear_speed |
2.0 | 最大线速度 (m/s) |
max_angular_speed |
4.0 | 最大角速度 (rad/s) |
cmd_vel_topic |
/diff_drive_controller/cmd_vel_unstamped |
发布的速度话题 |
避障节点使用人工势场法(APF),参数可通过 obstacle_avoidance.yaml 配置:
| 参数 | 默认值 | 说明 |
|---|---|---|
linear_speed |
0.3 | 最大线速度 (m/s) |
angular_speed |
0.8 | 最大角速度 (rad/s) |
safety_distance |
0.3 | 安全距离(小于此距离紧急停止)(m) |
influence_distance |
1.5 | 障碍物影响距离 (m) |
attractive_gain |
1.0 | 吸引力增益 |
repulsive_gain |
100.0 | 排斥力增益 |
angular_gain |
2.0 | 角度到角速度的增益 |
# 发布前进指令
ros2 topic pub /diff_drive_controller/cmd_vel_unstamped geometry_msgs/Twist "{linear: {x: 0.5}, angular: {z: 0.0}}"机器人描述文件包,包含:
- URDF/xacro 机器人模型(底盘、差速轮、万向轮、2D激光雷达)
- RViz 配置文件
仿真与控制包,包含:
- Gazebo Classic 仿真启动文件
- ros2_control 控制器配置
- 差速驱动控制器(DiffDriveController)+ 关节状态广播器
遥控节点包,包含:
- 键盘遥控节点(支持速度动态调节)
- 可配置的速度上下限与话题名称
导航与避障功能包,包含:
- 基于人工势场法(APF)的自动避障节点
- 激光雷达数据实时处理(URDF 内置 360 度 2D LiDAR)
- 激光雷达数据看门狗(无数据时自动停车并报警)
- 可配置的安全距离、影响力范围及增益参数
模式管理器功能包,是夹在多个速度源与差速控制器之间的集中式 cmd_vel 仲裁层,包含:
- 多模式仲裁:任意时刻仅当前模式的速度指令被转发到控制器,其余丢弃
- 模式切换:通过
/mode/set服务在 MANUAL / AUTO / IDLE 间显式切换 - 紧急停止:
/mode/emergency触发急停终态,立即发零速;急停期间拒绝一切模式切换,须显式释放才回 IDLE - 输入看门狗:当前模式对应源静默超过
input_timeout(默认 0.3s)即切回 IDLE 并发零,作为控制器 2s 超时之上的快速层 - 单线程执行:消除急停切换路径的并发竞态
- 配置驱动:YAML 定义模式、话题、看门狗超时
| 模式 | 输入话题 | 说明 |
|---|---|---|
| EMERGENCY_STOP | - | 紧急停止终态,仅经 /mode/emergency 进入/释放 |
| MANUAL | /cmd_vel_teleop | 手动遥控模式 |
| AUTO | /cmd_vel_avoidance | 自动避障模式 |
| IDLE | - | 空闲停止(默认起始模式、看门狗超时回退目标) |
| 服务 | 类型 | 说明 |
|---|---|---|
/mode/set |
diff_robot_mode_manager/srv/SetMode | 切换模式(target_mode: MANUAL/AUTO/IDLE,不可为 EMERGENCY_STOP) |
/mode/emergency |
std_srvs/SetBool | 急停(data=true 激活、data=false 释放) |
| 话题 | 类型 | 说明 |
|---|---|---|
/cmd_vel_teleop |
geometry_msgs/Twist | 遥控输入 |
/cmd_vel_avoidance |
geometry_msgs/Twist | 避障输入 |
/mode/status |
std_msgs/String | 模式状态(JSON:current_mode/available_modes/active_modes) |
/diff_drive_controller/cmd_vel_unstamped |
geometry_msgs/Twist | 最终输出 |
mode_manager.yaml 关键项:
| 参数 | 默认值 | 说明 |
|---|---|---|
input_timeout |
0.3 | 当前模式输入源静默超时(秒),超时切 IDLE |
status.rate |
10 | 状态发布频率(Hz) |
ros2 launch diff_robot_mode_manager mode_manager.launch.pyApache License 2.0