ros2-fishbot 是一个基于 ROS 2 Humble 的 FishBot 移动机器人学习与实践工作区。项目把机器人描述、Gazebo 仿真、ros2_control 差速底盘控制、Nav2 导航、Python 导航示例、自定义服务接口和自动巡逻应用放在同一个 ROS 2 workspace 中,适合用来系统练习移动机器人软件栈的完整链路。
当前仓库已经从单一的 fishbot_description 学习包扩展为一个可运行、可继续迭代的 FishBot 实验平台。你可以用它学习 URDF / Xacro 建模、传感器挂载、仿真控制、地图导航、航点任务、语音播报和巡逻图像采集。
当前包版本:
2.0.0推荐运行环境:Ubuntu 22.04 + ROS 2 Humble + Gazebo Classic
- 使用 URDF / Xacro 描述 FishBot 机器人本体、轮子、万向轮和传感器模块。
- 在 RViz 中查看机器人模型和 TF 关系。
- 在 Gazebo Classic 中加载室内房间场景并生成 FishBot。
- 通过
ros2_control加载joint_state_broadcaster和diff_drive_controller。 - 向
/cmd_vel发布速度指令,驱动仿真机器人移动。 - 使用 Nav2 加载地图、定位、规划路径并执行导航任务。
- 使用 Python 示例调用
nav2_simple_commander完成初始位姿设置、单点导航、航点跟随和当前位姿查询。 - 使用自定义
SpeechText.srv服务完成巡逻过程中的中文语音播报。 - 按参数文件配置自动巡逻点,并在巡逻过程中保存相机图像。
ros2-fishbot/
├── README.md
├── img_*.png
└── src/
├── fishbot_description/
│ ├── config/
│ ├── launch/
│ ├── urdf/
│ └── world/
├── fishbot_navigation2/
│ ├── config/
│ ├── launch/
│ └── maps/
├── fishbot_application/
│ └── fishbot_application/
├── autopatrol_interfaces/
│ └── srv/
└── autopatrol_robot/
├── autopatrol_robot/
├── config/
└── launch/
根目录下的 img_*.png 是自动巡逻图像采集流程生成或保留的示例图片。
| Package | 类型 | 主要职责 |
|---|---|---|
fishbot_description |
ament_cmake |
FishBot 机器人描述、RViz 模型显示、Gazebo 场景、ros2_control 配置 |
fishbot_navigation2 |
ament_cmake |
Nav2 bringup、地图加载、导航参数、RViz 导航界面 |
fishbot_application |
ament_python |
nav2_simple_commander 示例:初始位姿、单点导航、航点跟随、位姿查询 |
autopatrol_interfaces |
ament_cmake |
自动巡逻用自定义服务接口,当前包含 SpeechText.srv |
autopatrol_robot |
ament_python |
自动巡逻节点、语音服务客户端、相机图像保存流程 |
fishbot_description
-> xacro 生成 robot_description
-> robot_state_publisher 发布机器人模型
-> gazebo_ros 生成 FishBot 实体
-> gazebo_ros2_control 加载控制插件
-> joint_state_broadcaster 发布关节状态
-> diff_drive_controller 订阅 /cmd_vel 并发布里程计
fishbot_navigation2
-> Nav2 bringup 加载地图和参数
-> RViz 显示导航状态
-> fishbot_application 调用 BasicNavigator
-> autopatrol_robot 根据巡逻点循环导航
-> autopatrol_interfaces 提供语音播报服务接口
建议使用以下环境:
- Ubuntu 22.04
- ROS 2 Humble Desktop
- Gazebo Classic
colconrosdepxacrorviz2- Navigation2
核心 ROS 依赖包括:
gazebo_rosgazebo_ros2_controlcontroller_managerjoint_state_broadcasterdiff_drive_controllernav2_bringupnav2_simple_commandertf2_rostf_transformationscv_bridge
自动巡逻语音播报还需要系统 espeak-ng 引擎和 Python espeakng 模块。
先安装常用 ROS 依赖:
sudo apt update
sudo apt install \
ros-humble-gazebo-ros-pkgs \
ros-humble-gazebo-ros2-control \
ros-humble-ros2-controllers \
ros-humble-navigation2 \
ros-humble-nav2-bringup \
ros-humble-nav2-simple-commander \
ros-humble-tf-transformations \
ros-humble-xacro \
ros-humble-cv-bridge如果你要运行语音播报:
sudo apt install espeak-ng
pip install espeakng也可以在工作区根目录使用 rosdep 补齐依赖:
rosdep install --from-paths src --ignore-src -r -ygit clone https://github.com/sceneeeee/ros2-fishbot.git
cd ros2-fishbot
colcon build --symlink-install
source install/setup.bash如果你的浏览器可以访问 GitHub,但终端 git clone 卡住,通常是终端没有走代理。可以临时指定代理后再克隆:
git -c http.proxy=socks5h://127.0.0.1:7897 clone https://github.com/sceneeeee/ros2-fishbot.git把端口换成你本机代理软件实际监听的端口。
下面的命令默认你已经在工作区根目录执行过:
source install/setup.bashros2 launch fishbot_description display_robot.launch.py显示模块化 FishBot 模型:
ros2 launch fishbot_description display_robot.launch.py \
model:=$(ros2 pkg prefix fishbot_description)/share/fishbot_description/urdf/fishbot/fishbot.urdf.xacroros2 launch fishbot_description gazebo_sim.launch.py该 launch 文件会加载 custom_room.world,生成 FishBot,并依次启动:
fishbot_joint_state_broadcasterfishbot_diff_drive_controller
前进:
ros2 topic pub /cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.2}, angular: {z: 0.0}}" -r 10原地旋转:
ros2 topic pub /cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.0}, angular: {z: 0.5}}" -r 10查看控制器状态:
ros2 control list_controllers先保持 Gazebo 仿真运行,然后在新的终端中进入工作区并加载环境:
source install/setup.bash
ros2 launch fishbot_navigation2 navigation2.launch.py默认会使用:
use_sim_time=truesrc/fishbot_navigation2/maps/room.yamlsrc/fishbot_navigation2/config/nav2_params.yaml- Nav2 默认 RViz 配置
ros2 run fishbot_application init_robot_poseros2 run fishbot_application nav_to_pose默认示例目标点为:
x = 2.0y = 1.0
ros2 run fishbot_application waypoint_followerros2 run fishbot_application get_robot_pose该节点会查询 map -> base_footprint 的 TF 变换,并输出机器人当前位姿。
autopatrol_robot 会读取巡逻点参数,循环调用 Nav2 导航,并通过 SpeechText.srv 调用语音播报服务。到达巡逻点后,节点会尝试保存 /camera_sensor/image_raw 的最新图像。
先确保以下部分已经运行正常:
- Gazebo 仿真
- Nav2 导航
- 地图定位
- 机器人初始位姿
ros2 run autopatrol_robot speakerros2 run autopatrol_robot patrol_node \
--ros-args \
--params-file $(ros2 pkg prefix autopatrol_robot)/share/autopatrol_robot/config/patrol_config.yaml参数文件位于:
src/autopatrol_robot/config/patrol_config.yaml
当前参数包括:
| 参数 | 说明 |
|---|---|
initial_point |
初始位姿,格式为 [x, y, yaw] |
patrol_points |
巡逻点序列,格式为 [x1, y1, yaw1, x2, y2, yaw2, ...] |
use_sim_time |
是否使用仿真时间,建议和 Gazebo / Nav2 的时间配置保持一致 |
patrol_node.py 还支持 img_save_path 参数。设置后,巡逻图像会保存到对应路径;不设置时会使用当前运行目录。
导航参数位于:
src/fishbot_navigation2/config/nav2_params.yaml
当前配置重点是把局部路径跟随器调整为 RPP(Regulated Pure Pursuit)。相比早期 DWB 配置,RPP 在室内走廊、墙边和巡逻任务中的路径跟随更平滑,也更适合作为这个 FishBot 仿真实验的默认局部控制器。
如果你要继续调参,可以优先关注:
- 机器人 footprint / inflation radius
- controller server 的局部控制器配置
- planner server 的全局规划器配置
- AMCL 与地图坐标系配置
use_sim_time是否和 Gazebo / Nav2 一致
通常是浏览器走了代理,但终端没有继承代理配置。可以检查本地代理端口:
lsof -nP -iTCP -sTCP:LISTEN | grep -E "7890|7897|1080|1087"临时使用代理 clone:
git -c http.proxy=socks5h://127.0.0.1:7897 clone https://github.com/sceneeeee/ros2-fishbot.git长期使用可以设置 Git 代理:
git config --global http.proxy socks5h://127.0.0.1:7897
git config --global https.proxy socks5h://127.0.0.1:7897取消代理:
git config --global --unset http.proxy
git config --global --unset https.proxy检查控制器是否正常加载:
ros2 control list_controllers确认 fishbot_diff_drive_controller 处于 active 状态,并确认 /cmd_vel 有速度消息。
优先检查:
- Gazebo 是否仍在运行
- 所有终端是否都执行了
source install/setup.bash use_sim_time是否一致- RViz 中初始位姿是否设置正确
map -> odom -> base_footprintTF 是否连续
确认 speaker 节点已经运行,且系统安装了 espeakng Python 模块。也可以检查服务是否存在:
ros2 service list | grep speech_text确认相机话题存在:
ros2 topic list | grep camera如果需要固定保存目录,请给 patrol_node 配置 img_save_path,并确保目录存在且可写。
- 接入 SLAM Toolbox,补齐建图与保存地图流程。
- 增加键盘遥控或手柄遥控节点。
- 为巡逻任务增加暂停、恢复、取消和任务状态反馈。
- 把巡逻点从一维数组升级为更清晰的结构化配置。
- 使用行为树编排巡逻、播报、拍照和异常处理。
- 增加更复杂的 Gazebo 场景、障碍物和传感器噪声。
- 补充 CI、格式化、lint 和基础测试。
- 为 README 增加截图、录屏或 GIF。
Apache-2.0