260328

按照我们当前的进度,我们已经基本完成了对 ROS2 的初学者和中级部分的教程了。

基本上已经可以开始做项目了,按照我们的计划,我们解析来就可以来做一个简单的小项目了——KiBot One。

KiBot One 的本质不是“做一个很真的机器人”,而是:

  • 用 ROS2 + Gazebo 做出一个可运行、可调试、可扩展的最小机器人系统
  • 让一个 3D 仿真机器人能够根据你的指令完成基础移动任务
  • 用这个项目把 Target 1 需要的核心能力真正串起来

项目总目标

  • 在 Gazebo 里放一个简化机器人
  • 机器人能接收你的指令并在 3D 场景中运动
  • 整个系统具备 topic + service + action + parameter + launch + bag 的完整骨架
  • 最终形成一个能演示、能复现、能继续往 Target 2 演进的项目底座

KiBot One 要做成什么样

  • 一个 Gazebo 里的简化移动机器人
  • 一个基础场景:地面、墙体/障碍物、目标点
  • 一个指令入口:你可以让它 stop、cruise、go to point
  • 一个控制闭环:机器人根据当前模式和目标状态发布运动指令
  • 一个统一启动入口:launch 一键拉起
  • 一套基础调试能力:CLI、rqt_graph、ros2 bag

核心功能目标

  • 模式切换
    • stop
    • cruise
    • manual_goal
  • 目标执行
    • 接收一个目标点
    • 向目标点移动
    • 周期反馈剩余距离
    • 到达后返回成功
  • 基础控制
    • 发布速度指令
    • 控制机器人朝目标方向转动并前进
  • 仿真运行
    • Gazebo 正常加载场景和机器人
    • 机器人能在 3D 场景里移动

必须用到的技术

  • ROS2
    • rclpy
    • colcon
    • ament_python 或混合工作区
  • 通信机制
    • topic
    • service
    • action
    • parameter
  • 工程组织
    • launch
    • YAML 参数文件
    • ros2 bag
  • 仿真
    • Gazebo
  • 可视化与调试
    • rqt_graph
    • ros2 topic/service/action/param
  • 消息类型
    • geometry_msgs/msg/Twist
    • geometry_msgs/msg/PoseStamped 或你自定义目标消息
    • 自定义 srv/action

Gazebo 里的目标

第一版不要追求真实机器人外观,建议:

  • 用圆柱体或小车底盘当机器人
  • world 里放:
    • 地面
    • 几个障碍物
    • 一个或多个目标点
  • 能看到机器人从起点移动到目标点就够了

第一阶段验收标准

做到这些就算 KiBot One 第一版成立:

  • 能用一个 launch 启动整套系统
  • Gazebo 中成功生成机器人和场景
  • 能通过 service 切换模式
  • 能通过 action 下发一个目标点
  • 机器人能移动到目标附近
  • 能看到 action feedback 和 result
  • 能用 ros2 topic echo、rqt_graph 看系统状态
  • 能录一段 ros2 bag 并回放关键 topic

这个项目暂时不做什么

  • 不做真实视觉识别
  • 不做 URDF 复杂关节结构
  • 不做 tf2 深入建模
  • 不做 SLAM / Nav2
  • 不做机械臂操作
  • 不做大模型决策

这些是后续 KiBot One 升级版再接的内容。

一句话版本

KiBot One 的目标就是:

  • 做一个基于 ROS2 和 Gazebo 的最小移动机器人系统
  • 让机器人在 3D 仿真场景中根据你的指令完成基础移动任务
  • 并用这个项目掌握 Target 1 所需的 ROS2 核心能力与工程组织方式

至于使用 Gazebo 作为 3D 仿真的软件也是经过考虑的,主要考虑到目前就业市场对 Gazebo 在机器人领域的需求很大,且高于 UE, Unity 等,而 Isaac Sim 虽然也有考虑,但是考虑到我几个月前就已经尝试过安装和部署使用这个东西,该软件对硬件要求过高,我目前的硬件还跑不起来这个东西,因此最终选择了 Gazebo 作为我们的 3D 仿真的最终软件。

接下来就以该项目为当前阶段的阶段性项目吧。

我们接下来就来安装一下 Gazebo 并开始搭建我们的项目。

我们接下来将以 https://gazebosim.org/docs/all/getstarted/ 这个官方教程文档来作为我们 Gazebo 起步的文档。

通过我们的筛选,由于 ROS2 kilted 这个版本对应的 lonic这个 Gazebo 版本将于今年六月份停止后续的维护,因此我们决定将 ROS2 迁移到目前 Gazebo 长期维护的 Harmonic版本所对应的 ROS2 版本——Jazzy。

因此我们需要先修改我们当前的 ROS2 版本,其实也不是修改,应该说是引入 Jazzy版本。

我们可以使用下面的命令来安装 ROS2 的 Jazzy 桌面版:

sudo apt install ros-jazzy-desktop

现在就可以看到我们目前已经有两个版本的 ROS2 了:

jese--ki@KiBall:~$ ls /opt/ros
jazzy  kilted

然后,把我们现有的针对 kilted 的 profile文件 cp 一份,修改一下内容就可以了:

cp ~/.bash_profile.kildted ~/.bash_profile.jazzy
 GNU nano 7.2           /home/jese--ki/.bash_profile.jazzy *                 
# ros
export ROS_DOMAIN_ID=42
source /opt/ros/jazzy/setup.bash
source /usr/share/colcon_cd/function/colcon_cd.sh
export _colcon_cd_root=/opt/ros/jazzy/

现在就可以看到我们的 ROS2 的版本了:

jese--ki@KiBall:~$ source ~/.bash_profile.jazzy 
jese--ki@KiBall:~$ printenv ROS_DISTRO
jazzy

目前就代表我们 Jazzy 版本的 ROS2 就已经安装好了。

然后是 Harmonic版本的 Gazebo 安装了。

我们需要先安装一些可能的必要工具:

sudo apt-get install curl lsb-release gnupg

然后就可以用下面的命令来安装 Gazebo Harmonic 了:

sudo curl https://packages.osrfoundation.org/gazebo.gpg --output /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] https://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null
sudo apt-get update
sudo apt-get install gz-harmonic

安装好后,我们尝试运行一下看看:

可以看到正常启动了。

接下来就按照 Gazebo 的教程来走一遍吧。