ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

鱼香ROS一键安装ROS2+Gazebo+micro-ROS实战指南

鱼香ROS一键安装ROS2+Gazebo+micro-ROS实战指南 正式搞机器人开发这几年最消耗耐心的事情不是调算法而是装环境。早两年我按官方文档装 ROS2 Humble要改 locale、加软件源、导入 GPG key、再拉一长串依赖包顺利的话半小时起步不太顺利就是一整个下午中间还常见 GPG key 失效、源同步超时这类莫名其妙的坑。后来在群里看有人提到一个叫鱼香ROS的一键安装脚本抱着反正环境已经装废了的心态试了一次体验完全不一样ROS2、Gazebo甚至 micro-ROS 的开发基础都能在一个交互式脚本里选装完整个流程被压缩到十几分钟。这篇东西就是把我的实操过程整理成一份可以照着抄的指南主要包括三块怎么用鱼香ROS一键脚本搭好 ROS2 Gazebo 环境怎么在 Gazebo 里跑通第一个差速小车仿真以及怎么把 micro-ROS 接进来让单片机也能参与 ROS2 的通信网络。适合对象很明确刚入坑 ROS、不想把时间耗在环境上的新手以及经常在虚拟机里反复重建环境的折腾型玩家。1. 一键安装背后的设计逻辑1.1 官方安装流程到底难在哪先说说为什么不推荐新手直接按官方文档锤流程。ROS2 的官方安装步骤本身不算复杂难就难在细节太多第一步要确认系统 locale 是 UTF-8第二步要把 ROS2 的 apt 仓库地址插入软件源列表然后下载并导入 GPG key再执行 apt update最后才轮到安装 ros-humble-desktop-* 那一坨软件包。这一套流程对熟练工来说十分钟搞定但对新手而言每一步都是雷区。GPG key 导入经常会因为网络超时失败软件源地址如果和系统版本不匹配apt update 直接报错装完包还要手动往 ~/.bashrc 写 environment 配置少写一行ros2 命令就告诉你 command not found。这些坑单个看都不大串在一起足以劝退一大片人。鱼香ROS一键脚本之所以受欢迎就是把这些重复劳动全部封装成了交互式操作。脚本会自动检测你的 Ubuntu 版本和 CPU 架构判断该装哪个 ROS2 发行版然后弹出菜单让你选装哪些组件。它甚至会把软件源替换、rosdep 初始化、环境变量写入这些后续步骤一起处理用户要做的只是敲一行命令然后按几次数字键确认。1.2 一键脚本的工作流程与适用人群这个脚本本质上是一个经过社区验证的 Bash 安装器整个流程大致是先检查当前系统的发行版和架构再提示你选择软件源通常有默认源、国内镜像源几个选项接着列出 ROS1、ROS2、Gazebo、rosdep 工具、micro-ROS 等安装项。你选完以后脚本会依次执行添加仓库、下载安装、初始化依赖和环境配置这些步骤。它也有一个很实用的附带工具 rosdepc。用过原版 rosdep 的读者一定知道rosdep update 在实际操作中经常因为依赖源更新问题卡住rosdepc 相当于鱼香ROS作者针对这个问题提供的一个替代方案。我在多个环境里实际用过在解决 ROS2 包依赖的自动化处理上确实比原版省心。适用人群我真觉得挺广的刚入门的同学用它能省掉大量查资料时间虚拟机重度用户经常来回快照、重建环境脚本可重复执行跑一遍就等于一个新环境想快速测试不同发行版的玩家也可以用它一键切换不用担心把自己系统搞乱。如果你是想深入研究 ROS2 底层安装机制的人那我还是建议你从头手动装一遍理解每个步骤的含义但普通用户完全没必要折磨自己。1.3 为什么把 ROS2、Gazebo、micro-ROS 拼在一起很多初学者把这三个东西当独立工具看待其实它们的组合关系很自然ROS2 是机器人的大脑中枢负责节点通信和逻辑调度Gazebo 是身体训练场用来做物理仿真和算法验证micro-ROS 则是把 ROS2 通信延伸到微控制器上的桥梁让真实的驱动板、电机、传感器也能直接挂进 ROS2 网络。实际开发中典型的节奏是先在 Gazebo 里把机器人和环境的仿真跑通反复调参验证再用 micro-ROS 把验证过的指令格式下发到真实 MCU 上执行。三步拼起来就是一条从仿真到真机的完整链路。所以我这篇文章把这三样东西一次性讲清而不是只停在ROS2 装好了这一步。2. 实操从零到跑通 ROS2 和 Gazebo2.1 环境准备与前期配置先说硬件和系统准备这个直接决定后面顺不顺利。我目前的推荐配置是Ubuntu 22.04 64位系统内存至少 4GB磁盘建议预留 20GB 以上。ROS2 Humble 是 22.04 上的官方支持版本踩坑最少内存太小的虚拟机跑 Gazebo 会非常难受加载一个稍微复杂一点的世界模型就能把内存吃满。如果你用的是 VMware 或者 VirtualBox装系统的时候记得给虚拟机开启 3D 图形加速。这一步经常被人忽略等 Gazebo 打开界面疯狂闪烁或者黑屏时才想起来其实虚拟机设置里的显示选项早就可以打开加速3D图形了。内存方面建议给虚拟机分配 4GB 以上图形内存给到 128MB 或更高会更流畅。如果你是在 Windows 环境下折腾推荐优先用 WSL2 跑 Ubuntu 22.04在里面按照下面的流程操作。硬件上尽量别用太老的核显跑 Gazebo渲染复杂场景会卡到怀疑人生。2.2 鱼香ROS一键安装的具体步骤先看鱼香ROS官网提供的最新安装命令以官网为准。目前广泛流传的命令长这样wget http://fishros.com/install -O fishros . fishros在你打开终端执行之前先确保能用 sudo 执行命令因为后面安装软件包需要管理员权限。建议用普通用户执行而不要直接切到 root避免权限混乱。执行上面命令后脚本会开始下载并进入交互界面。我实际跑的时候菜单大致包括更换系统软件源、安装 ROS1、安装 ROS2、安装 rosdep 工具、配置 rosdepc、安装 Gazebo、安装 micro-ROS 等选项。不同版本菜单顺序可能有变化但逻辑一致。我的建议顺序是这样的第一项先把系统软件源更换为国内镜像源这一步能避免后面 apt 下载速度捉急。然后选择安装 ROS2脚本会询问你装完整版 desktop 还是精简版 base。如果后面要跑 Gazebo强烈建议选 desktop 版本因为 rviz2、gazebo_ros_pkgs、常用机器人描述格式解析库基本都在里面省得后面一个一个补。选完 ROS2 组件后脚本会处理依赖和初始化最后写入 bashrc 环境变量。整个过程大约 1020 分钟长多半是卡在下载进度条上耐心等就好。安装完成后新开一个终端或者手动重新加载一下 bashrcsource ~/.bashrc ros2 --help如果你能正常看到一长串 ROS2 命令列表说明基础环境已经通了。之后可以再用下面的命令做一次快速实测ros2 run demo_nodes_cpp talker终端里开始不断输出Hello world就说明 ROS2 的运行时和基本节点通信没有问题。2.3 手动补齐 Gazebo 与 colcon 等关键工具鱼香脚本通常会把 Gazebo 相关的包一并处理但如果你装的是精简版 base或者脚本版本没覆盖到 Gazebo就需要手动补一下。Ubuntu 22.04 对应的 Gazebo 版本是 Gazebo 11在 ROS2 Humble 中的安装命令如下sudo apt install ros-humble-gazebo-ros-pkgs装完以后验证一下gazebo --version能输出版本号就说明仿真器本体可用。这里多提一句ROS2 里操作 Gazebo 的标准入口已经变成了 ros2 launch 方式核心启动文件来自gazebo_ros包。所以别只装系统里的 gazebo 裸程序一定要装上ros-humble-gazebo-ros-pkgs否则后面用 launch 启动空世界时会报找不到 launch 文件。另外还有一个工具需要提前准备好就是 colcon。它是 ROS2 的编译构建工具micro-ROS、自己写功能包、编译工作空间全部都要靠它sudo apt install python3-colcon-common-extensions安装完成后在任意终端运行colcon能看到帮助信息就说明正常了。2.4 安装时容易被忽略的细节第一个细节安装过程中脚本如果提示某些依赖冲突尽量不要急着用apt --fix-broken install乱修。先看清楚冲突的包是什么很多时候是系统里的旧 ROS 残留或者手动装的 python 包版本不对。干净环境里出问题的概率很小一旦碰到建议把安装日志贴到社区搜索一下再处理。第二个细节bashrc 的环境变量。脚本写好了但如果你用的 shell 不是默认 bash 而是 zsh 之类需要自己手动把下面这行加进对应的配置文件source /opt/ros/humble/setup.bash我以前在 Ubuntu 上换过 zsh当时没注意这行一整天都在疑惑为什么 ros2 命令时好时坏。第三个细节rosdep 的初始化。虽然 rosdepc 可以替代一部分功能但很多需要从源码编译的功能包依然会调用 rosdep。建议装完环境后顺手跑一遍 rosdepc update并把依赖初始化做完后面 clone 源码编译时能少很多麻烦。3. 仿真核心知识话题、服务、动作与 DDS3.1 用生活例子理解 ROS2 通信三件套ROS2 里通信方式最常用的是话题、服务和动作。很多新手一开始分不清其实用生活场景类比就很好记。话题是单向广播式通信像电台广播发布者的消息发出去所有订阅者都能收到不管对方在不在线。最常见的例子是传感器数据流比如激光雷达持续广播扫描结果里程计持续发布位姿。对应的命令是ros2 topic echo、ros2 topic list。服务是同步问答式通信像打电话问客服客户端发请求服务端处理完给回应一问一答同一时间只处理一个请求。适合开关、查询这类一次性操作比如ros2 service call /spawn在 Gazebo 里生成一个模型。动作是带反馈的异步任务像你叫了个外卖平台给你下订单号、骑手实时上报位置最后送达确认。它适合机械臂抓取、导航到目标点这种长时操作中途可以随时取消。三者的区别看场景选择持续高频数据流用话题短时请求响应用服务需要进度反馈的长任务用动作。ROS2 底层默认基于 DDS 通信协议这决定了节点之间的发现和消息传递方式。DDS 通过同一个域内的广播协议发现对方节点再按照配置的 QoS 策略传输数据。QoS 可以理解为消息的服务等级比如传感器数据允许丢失最新帧通常选 best effort控制指令必须可靠送达需要选 reliable。我刚入门时经常在调试器里看不到数据后来发现就是两端 QoS 不匹配消息被直接拒收这个坑值得记一下。3.2 在 Gazebo 里跑一个差速小车环境装好后第一个建议尝试的仿真是 TurtleBot3 差速小车它模型轻量功能完整跑通以后对订阅发布流程会有直观理解。先安装相关功能包sudo apt install ros-humble-turtlebot3-gazebo然后在新终端里导出模型参数这一步经常有人漏掉export TURTLEBOT3_MODELwaffle接着用 launch 方式启动 Gazebo 空世界并加载小车ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py启动后会看到 Gazebo 窗口加载出一个带墙壁和障碍物的仿真场地小车站立在场地中。再开一个终端启动键盘遥控export TURTLEBOT3_MODELwaffle ros2 run turtlebot3_teleop teleop_keyboard这时通过键盘的 i、j、k、l 键就能驱动小车在仿真世界里移动。同时开第三个终端运行 rviz2加载配置后可以看到小车的模型、传感器数据和 tf 坐标变换。整个过程能直观展示出话题驱动的运动闭环键盘节点发布/cmd_velGazebo 里的差分驱动插件接收后计算轮速里程计信息再通过/odom话题发出去。这里想特别聊下 Gazebo 的意义。你在仿真里做的所有操作和真机上的数据流结构几乎一致区别只是物理环境被数学模拟替代。把算法放在仿真里跑验证的是逻辑正确性逻辑没问题的前提下再上真机能省下大量调试硬件的时间和成本。这也是我一直建议先跑原因。3.3 虚拟机中 Gazebo 显示异常的排查热词里有个问题被问得非常频繁VMware 打开 Gazebo 屏幕闪烁怎么办。这个问题我实际遇到过Gazebo 窗口打开后画面不停闪烁鼠标拖动视角时整个视图撕裂严重时甚至黑屏。原因主要是虚拟机 OpenGL 硬件加速没有开启或者虚拟显卡驱动不兼容。解决办法按顺序尝试第一步关闭虚拟机系统然后在 VMware 的虚拟机设置里找到显示器选项勾选加速 3D 图形同时把图形内存大小调到 128MB 或更高保存后重新开启虚拟机。第二步确认系统里装好 open-vm-tools-desktopsudo apt install open-vm-tools-desktop这个包影响显示适配没装的话画面分辨率也可能异常。第三步如果前面两步解决不了可以尝试强制使用软件渲染在启动 Gazebo 前执行export LIBGL_ALWAYS_SOFTWARE1 gazebo这个环境变量让 OpenGL 走软件渲染虽然画面顺滑度会下降但闪烁问题基本能压下去。这个方法在选择加速3D图形后依然闪烁的情况下很管用。如果你用的是 VirtualBox思路类似在虚拟机设置里开启 3D 加速并安装增强功能。实在不行直接物理机装系统跑 Gazebo 是最省心的毕竟仿真渲染对真实 GPU 更友好这也是我长期测试后的结论。4. micro-ROS 实战把单片机接进 ROS2 世界4.1 micro-ROS 的架构思路先解释一下 micro-ROS 到底是什么。机器人离不开微控制器底盘电机控制、舵机驱动、传感器采集这些底层任务通常由 STM32、ESP32 这类 MCU 负责。但 MCU 的资源太有限跑不动完整的 ROS2 节点。micro-ROS 出现就是为了解决这个问题它在 MCU 上运行一个精简的 ROS2 客户端通过 DDS-XRCE 协议和主机上的 micro-ROS Agent 桥接从而让单片机上的传感器和执行器作为 ROS2 网络里的节点被主机发现。打个比方ROS2 主机是大脑MCU 是手脚末端散布的神经末梢micro-ROS Agent 就是把这些神经信号汇总成大脑能理解的语言的接口层。它支持串口、UDP、WiFi 等传输方式所以从最普通的 USB 转串口到无线连接都能跑。4.2 编译安装 micro-ROS Agent先在工作空间里用 micro_ros_setup 工具编译 Agent这个流程在 Ubuntu 22.04 ROS2 Humble 下已经相当成熟。依次执行source /opt/ros/humble/setup.bash mkdir -p microros_ws/src cd microros_ws git clone -b humble https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup sudo apt update rosdep update rosdep install --from-paths src --ignore-src -y colcon build source install/setup.bash我在实际编译时遇到过 rosdep update 卡住的情况原因是依赖源更新不稳定换用 rosdepc update 后就很顺畅这也是我前面特意提到 rosdepc 的原因。编译完成后Agent 程序就有了启动串口模式用下面命令ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0 -b 115200如果 MCU 端走 UDP 网络通信则改成ros2 run micro_ros_agent micro_ros_agent udp4 --port 8888Agent 启动后终端会停在监听状态等待 MCU 端连接。这个监听状态是正常的别以为程序卡死了。此时可以用ls /dev/ttyUSB*确认串口存在如果提示设备不存在再检查驱动是否识别。4.3 在 ESP32 和 STM32 上创建客户端MCU 端的创建方式有很多我比较常用的是 Arduino 和 STM32CubeMX 两条路。ESP32 的 Arduino 路线很直接先安装 Arduino IDE并给 IDE 添加 ESP32 开发板支持然后在 Arduino 库管理器里搜索并安装 micro_ros_arduino这个库把 micro-ROS 客户端编译过程打包好了。打开示例中的 MicroRosPublisher 或 MicroRosSubscriber需要修改的参数主要是 WiFi 网络的 SSID 和密码以及 Agent 所在的电脑 IP 和通信端口。MCU 和电脑连同一个局域网这是一个常规操作。把固件烧录到 ESP32 后打开串口监视器能看到它尝试连接 Agent 并输出日志。如果连接成功Agent 终端也会打印出新的客户端连接信息。之后在 ROS2 主机上运行ros2 node list就能看到 MCU 对应的节点整个过程到这里基本算闭环了。STM32 的路线稍微繁琐建议用 STM32CubeMX 生成带 micro-ROS 中间件的基础工程选择串口或者 USB CDC 作为传输层然后通过 micro_ros_arduino 类似的库函数发布订阅。因为 STM32 外设配置差异较大我这里不展开讲每个型号的接线但核心思路一致MCU 端必须有 micro-ROS client连接 Agent 后节点自动加入 ROS2 图。4.4 联动案例仿真小车接收单片机指令把 micro-ROS 和前面 Gazebo 仿真打通是很有成就感的实验。设计思路是这样Gazebo 里跑一个差速小车单片机这边发布一个自定义的速度消息Agent 桥接进 ROS2主机再把它转发给小车实现运动控制。第一步让 Gazebo 里的 TurtleBot3 先正常启动确认节点列表里有/cmd_vel话题的发布者。第二步确认 Agent 已经跑在 UDP 或串口监听模式。第三步给 MCU 烧录一个简单的速度发布程序周期性发布一个线性速度 x0.2、角速度 z0 的指令。第四步在主机上运行ros2 topic echo /cmd_vel如果能看到单片机发出的数据就说明链路是通的。此时再运行ros2 topic pub /cmd_vel geometry_msgs/msg/Twist {linear: {x: 0.2, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}小车应该会开始前进。如果 MCU 发的指令能控制仿真车那你已经掌握了从嵌入式设备到 ROS2再到仿真器的完整数据通路。这个经验会在真机部署时直接产生价值。我在这个联动测试里踩过一个很典型的坑MCU 已经连着 Agent主机却收不到话题。后来查了半天发现是 MCU 程序里发布的 topic name 和 ROS2 里订阅的名字不一致比如一个有前导斜杠/cmd_vel一个没有。ROS2 对话题名规范化后会默认补正但某些 micro-ROS 工具链里接口名匹配很严格命名上一定要保持一致。5. 常见问题速查表把这几周帮人排查环境问题遇到的高频问题整理成一个速查表直接对着检索就行。现象常见原因解决建议ros2: command not found环境变量未加载执行source /opt/ros/humble/setup.bash并写入 bashrc安装脚本下载超时网络波动检查网络后重试脚本换国内镜像源选项提升成功率Gazebo 打开后屏幕闪烁、黑屏虚拟机 3D 加速未开或 OpenGL 驱动不兼容虚拟机设置开启 3D 加速仍不行则执行export LIBGL_ALWAYS_SOFTWARE1再启动colcon: command not foundcolcon 未安装sudo apt install python3-colcon-common-extensionsmicro_ros_agent提示串口不存在USB 转串口未识别或权限不足查看ls /dev/ttyUSB*执行sudo chmod 666 /dev/ttyUSB0或把用户加入 dialout 组两个终端的 topic 互相看不到数据ROS_DOMAIN_ID 不一致、不在同一网段两端设置相同export ROS_DOMAIN_ID0确保在同一局域网rosdep update失败依赖源更新异常使用 rosdepc选择替换初始化后再次 updatemicro-ROS 连不上 Agent固件里的 IP、端口与 Agent 启动参数不匹配核对 UDP/串口配置Agent 启动参数与固件保持一致话题收发了却没有反馈QoS 不匹配两端显式设置相同 QoS 策略传感器消息推荐 best effort虚拟机 Gazebo 异常卡顿分配的内存和图形内存不足虚拟机内存调到 4GB 以上图形内存 128MB 以上还有一些经验放在这里。第一个sudo chmod 666 /dev/ttyUSB0只是临时方案重启或者拔插串口后权限会还原更持久的做法是把当前用户加进 dialout 组然后重新登录系统。第二个多个 ROS2 应用共存在一台机器上调试时记得设置相同的ROS_DOMAIN_ID否则它们各自在自己的域里自嗨。这个坑特别隐蔽尤其当你照着教程一步步操作但结果就是不对的时候先排查域。第三个Gazebo 启动时如果报[Err] [RenderingScene.cc] Unable to create rendering context很多时候是显卡或者 OpenGL 版本太老建议优先检查显卡驱动和软件渲染环境变量而不是急着重装 Gazebo。6. 安装完成后的进阶路线环境搭好不是终点反而是真正开始。ROS2 生态里能玩的方向非常多我挑几个和热词相关的方向简单展开方便你装完之后有下一步目标。SLAM 建图与定位是移动机器人方向的热门Gazebo 里仿真多线激光雷达再配合 cartographer 或 slam_toolbox 建图后续叠加 Nav2 做路径规划与避障。网上很多介绍 mid360 建图定位的项目本质就是这一套。要注意的是Gazebo 里雷达仿真要确保 URDF 里的传感器插件配置正确否则建出来的地图会飘。机械臂方向可以关注 panda 机械臂的 Gazebo 仿真配合 MoveIt2 做运动规划。Gazebo 完整模拟了力矩传感器和关节驱动你在里面规划一条抓取路径真实机械臂上几乎可以直接套用。八叉树地图导航则适合做三维环境感知在 Gazebo 里加载点云然后构建 OctoMap比纯二维栅格图更适合高低起伏地形。性能敏感场景还可以研究一下 ROS2 的零拷贝、共享内存传输机制。默认的 DDS 传输有序列化和拷贝开销在高带宽激光雷达或阵列摄像头场景下开启零拷贝能明显降低延迟和 CPU 占用。这个方向需要同时调整底层中间件配置适合对 ROS2 架构已经比较熟悉的玩家。我的个人体会是这套环境装好只是万里长征第一步真正值钱的是后面持续在仿真里验证想法、在真机上调试问题、在踩坑中积攒经验的过程。用一键脚本把环境这部分省下来把更多精力留给机器人逻辑本身。如果你手头有闲置的开发板比如一块 ESP32 或者几十块钱的 STM32 核心板强烈建议照着第 4 章的流程实际跑一遍 micro-ROS。不用追求多复杂的任务让小车动起来、让板子上的按键状态出现在 ROS2 话题里就已经能帮你建立对整套数据链路的直观认知了。
返回列表