smrutisouravsahoo006/differential_robot
GitHub: smrutisouravsahoo006/differential_robot
基于 ROS2 Jazzy 和 Gazebo Harmonic 的差速驱动机器人仿真项目,提供完整的控制器配置、传感器仿真和键盘遥控功能。
Stars: 1 | Forks: 0
# differential_robot
# ros2_diff_drive_robot
适用于 **ROS2 Jazzy + Gazebo Harmonic** 的差速驱动机器人仿真,
使用了 `gz_ros2_control`、`diff_drive_controller`、lidar 和摄像头。
## 之前存在的问题(及修复方法)
1. **`config/ros2_controllers.yaml`** 包含 `use_stamped_vel: false`,这是一个
在 Jazzy 版本的 `diff_drive_controller` 中已不存在的参数。
在 Jazzy 中,控制器**始终**订阅
`/diff_drive_controller/cmd_vel`,类型为 `geometry_msgs/msg/TwistStamped`
(不是 `Twist`,也不是旧的 `.../cmd_vel_unstamped` 名称)。设置
无法识别的参数会静默失效,这就是为什么普通的
`teleop_twist_keyboard` / 手动发布 `Twist` 无法移动
机器人的原因。
2. **`config/gazebo_bridge.yaml`** 通过 `ros_gz_bridge` 桥接了 `/joint_states`、
`/diff_drive_controller/odom`、`/diff_drive_controller/cmd_vel_unstamped`
和 `/tf`。这些都不是 Gazebo 传输(Gazebo-transport)的话题——它们是由
`gz_ros2_control` 插件内置的 controller_manager 节点直接发布的原生 ROS2 话题。桥接
`/tf` 特别会创建第二个冲突的 TF 发布者。
Gazebo 端的 `/joint_states` 桥接也指向了
`/world/empty_world/...`,而实际的世界名为
`office_world`(参见 `worlds/office_world.sdf`),因此它静默地
解析为空。
3. **`launch/teleop.launch.py`**(新增)启动 `teleop_twist_keyboard`
时使用了 `stamped:=true`,并将其输出直接重映射到
`/diff_drive_controller/cmd_vel` —— 这才是 teleop 的真正修复方法。
4. **`package.xml`** 缺少 `teleop_twist_keyboard` 依赖项。
## 构建
```
cd ~/project1_ros2_ws
colcon build --symlink-install
source install/setup.bash
```
## 运行仿真
```
ros2 launch ros2_diff_drive_robot gazebo.launch.py
```
这将启动 Gazebo Harmonic,生成机器人,桥接传感器,并在 6
秒后通过 `control.launch.py` 自动加载并**激活** `joint_state_broadcaster` 和
`diff_drive_controller`。如果使用
此 launch 文件,你**不**需要手动运行 `ros2 control load_controller`;这已经处理好了。
检查控制器是否已成功启动并激活:
```
ros2 control list_controllers
# joint_state_broadcaster[joint_state_broadcaster/JointStateBroadcaster] 活跃
# diff_drive_controller[diff_drive_controller/DiffDriveController] 活跃
```
如果你确实需要手动加载/激活(例如控制器已被
卸载),在 Jazzy 上有效的语法是:
```
ros2 control load_controller --set-state active joint_state_broadcaster
ros2 control load_controller --set-state active diff_drive_controller
```
## 使用键盘驱动
```
ros2 run teleop_twist_keyboard teleop_twist_keyboard \
--ros-args -p stamped:=true -r cmd_vel:=/diff_drive_controller/cmd_vel
```
(或 `ros2 launch ros2_diff_drive_robot teleop.launch.py`)
你原先的命令 —
`--ros-args -r cmd_vel:=/cmd_vel` — 将 `/cmd_vel` 重映射到了它自身(无实际效果),并且仍然发布未加盖时间戳(unstamped)的 `Twist`,而控制器
已不再监听该类型。
## 仅 URDF 预览(无 Gazebo)
```
ros2 launch ros2_diff_drive_robot display.launch.py
```
标签:Gazebo仿真, ROS2, SOC Prime, 差速驱动, 开发工具, 控制系统, 机器人, 逆向工具