尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

鱼香ROS一键安装指南:ROS2、Gazebo仿真与micro-ROS实战

鱼香ROS一键安装指南:ROS2、Gazebo仿真与micro-ROS实战 上周帮实验室新来的师弟配环境他抱着刚装好的 Ubuntu 22.04 笔记本问我ROS 这东西到底要装多久。我说你运气好现在不用再对着十几个终端窗口抄命令了一条命令拉个脚本下来喝口水的功夫就能跑起来。他半信半疑地敲完三分钟后roscore起来了那种表情我太熟悉了——三年前我第一次装 ROS 的时候可是折腾了整整一个通宵。这篇东西就是把我这几年的安装经验、踩过的坑、以及不同场景怎么选版本一次性摊开讲清楚。核心围绕鱼香ROS这个国内社区维护的一键安装脚本展开从最基础的ros安装到一键安装ros2再到后面的gazebo仿真、micro-ros配esp32、机械臂和小车导航的环境搭建都串一遍。不管你是刚接触ros学习的在校学生还是想把ros机械臂开发、ros小车自主导航仿真这类项目跑起来的老手照着流程走都能落地。需要说明的是脚本的菜单和细节会随版本迭代变化文中具体操作是基于我近期的实测记录整理的遇到不一致的地方以脚本实际提示为准。1. 手动装ROS的坑以及一键脚本为什么值得用1.1 手动装ROS到底卡在哪几个环节很多人对 ROS 安装的恐惧不是没来由的。ROS1 时代官方文档给的步骤看着简单实操起来问题一箩筐。最典型的是源的问题默认源在国外apt update卡在某个百分号上十分钟不动重试几次还报Failed to fetch。然后是密钥apt-key这个命令在 Ubuntu 20.04 之后就被标记为废弃了新系统上跑老文档的命令会弹一堆警告新手看到红色字就慌。再往下是依赖。ROS 的包依赖树非常深rosdep是官方推荐的依赖安装工具但它默认从国外服务器拉rosdistro的索引文件国内网络下经常超时报ERROR: unable to process source。我见过不少人卡在这一步反复重装系统最后干脆放弃。还有环境变量source /opt/ros/noetic/setup.bash这行必须写进~/.bashrc否则每开一个新终端都要手动 source 一次很多人装完发现roscore找不到命令就是这个原因。这些环节单拎出来都不难难的是它们叠在一起而且每个报错信息都不够直白。对刚入门的人来说安装这一关消耗掉了本该花在学习概念上的精力。一键脚本的价值就在这儿——它把版本检测、换源、密钥导入、依赖安装、环境变量配置这几件事打包成一个流程用中文菜单把选择权交给你。1.2 鱼香ROS一键安装的定位与能力边界鱼香ROS是国内社区里做得比较早也比较成体系的一个工具集合作者是大家口中的小鱼。它的核心产物就是一个安装脚本主要解决两件事一是把 ROS1 和 ROS2 的安装过程自动化二是提供一批配套的国内化工具比如rosdepc这个rosdep的国内替代品还有 Docker、VsCode、VNC 这类周边环境的一键配置。它的定位很清晰就是降低入门门槛不是要替代官方安装方式。所以你会看到脚本做的事情本质上还是调用apt只是帮你把源换好了、把顺序理清了、把容易漏的步骤补齐了。理解这一点很重要意味着出问题时你依然可以用常规的 ROS 排查思路去定位而不是面对一个黑盒束手无策。能力边界也说一下。脚本能帮你把环境装好但装完之后的编译错误、代码逻辑问题、硬件驱动适配它一概不管。有师弟问我为什么装完还是跑不通某个开源包我说安装脚本不是万能药它只负责把地基浇平房子怎么盖还得看图纸。另外脚本对系统版本有要求太老的 Ubuntu 或者非 Ubuntu 的发行版它可能识别不了这种情况就得手动来。2. 动手之前环境检查与版本选型2.1 Ubuntu与ROS版本对应关系表版本选错是新手最容易犯的错误装完发现某个包找不到排查半天才发现是版本不匹配。ROS 和 Ubuntu 是强绑定的官方只保证特定组合能用。下面这张表是我整理的高频组合装之前先对一眼。Ubuntu 版本推荐 ROS1推荐 ROS2状态说明18.04 LTSMelodicDashing / EloquentROS1 已停止维护仅维护旧项目时使用20.04 LTSNoeticFoxy / GalacticNoetic 是 ROS1 最后一个版本资料最全22.04 LTS无官方支持Humble目前 ROS2 的主力版本长期支持24.04 LTS无Jazzy较新部分第三方包适配还不完整这里有个关键点要解释。ROS1 在 Noetic 之后就停止了官方把精力全部转到 ROS2。所以如果你拿 Ubuntu 22.04是装不上 ROS1 Noetic 的只能走 ROS2 Humble。而ros 2 humble micro-ros、ros2 humble相关的教程在 22.04 上是最顺的。反过来如果你要做ros机械臂开发而手头的机械臂厂商只提供了 ROS1 的驱动包那老老实实上 Ubuntu 20.04 加 Noetic 更省事别硬啃 ROS2 的移植。选择逻辑总结成一句话先看你的硬件和依赖包支持哪个版本再倒推系统版本不要先装系统再纠结版本。顺序反了返工成本很高。2.2 硬件、网络与磁盘空间的准备虚拟机还是双系统还是纯 Linux这个看你的使用场景。要做ros小车自主导航仿真、gazebo这类仿真建议内存给到 8GB 以上Gazebo 加载模型很吃内存4GB 的虚拟机跑起来会卡到怀疑人生。要是涉及isaaclab、isaacsim这种更重的仿真平台显卡和显存的要求会再上一个台阶这个后面单独说。磁盘空间方面ROS 本体加上常用工具、Gazebo 模型库、Docker 镜像轻松吃掉 30GB 以上。我一般建议至少留 60GB 给系统盘别等到装到一半提示磁盘不足。这里有个实操细节/opt/ros目录会随着安装的版本增多而变大如果你同时装 ROS1 和 ROS2空间要再放宽些。网络这块虽然脚本会帮你换源但下载安装包本身还是需要网络通畅。我个人习惯在装之前先测一下ping国内镜像站确认延迟正常。如果用无线网遇到断流可以试试有线连接ros路由器无线中继之类的网络环境如果本身不稳定安装过程容易中断apt中断后再续传有时会留下损坏的锁文件反而更麻烦。注意安装前先把系统更新到最新执行sudo apt update sudo apt upgrade。系统处于半更新状态时装 ROS 容易因为依赖版本冲突报错。2.3 换源这件事比你想的更重要换源不是可有可无的优化它直接决定了安装能不能顺利完成。鱼香ROS脚本里内置了换源选项通常会问你要不要更换系统源和 ROS 源可以选清华、中科大、阿里这些国内镜像。我的建议是全部选国内源除非你在国外或者有特殊网络环境。为什么强调这个因为 ROS 的源和 Ubuntu 的源是两套独立的配置分别放在/etc/apt/sources.list和/etc/apt/sources.list.d/下面。手动配置时经常有人只换了系统源忘了换 ROS 源结果apt update前半段飞快后半段卡死。脚本会自动处理这两处省去了踩坑的机会。换源之后有个验证动作执行sudo apt update看输出末尾有没有报错。如果出现W: GPG error或者E: 无法获得锁前者一般是密钥问题后者通常是另一个 apt 进程在跑等它结束或者清理锁文件即可。确认 update 干净通过再往下走安装流程别跳步。3. 一键安装完整实操记录3.1 获取脚本并首次运行脚本的获取方式很简单官方给的是wget拉取再执行。我平时用的命令是这条wget http://fishros.com/install -O fishros . fishros解释一下这条命令拆开在干什么。wget负责把安装脚本下载到当前目录命名为fishros-O是 output 的意思指定文件名。后面的表示前面成功了才执行后面。最后那个. fishros是source的简写意思是在当前 shell 环境里执行脚本而不是开一个子进程。这一点很重要因为脚本里要设置一些环境变量如果用bash fishros去跑变量只在子进程里生效执行完就丢了。首次运行的时候脚本一般会先做一些环境自检判断你的系统版本、架构然后给出中文菜单。如果提示权限不足用sudo重新执行。有个细节如果你已经把脚本改成可执行文件用./fishros跑效果和source差不多但环境变量这块还是推荐用 source 的方式。3.2 菜单选项逐条拆解脚本跑起来后会看到一个中文菜单大致分成几类。我这里按类别讲具体编号以你屏幕上显示的为准因为脚本版本更新会调整顺序。第一类是 ROS1 安装会检测你的系统版本推荐对应的 ROS 发行版。选中后它会先问你换不换源然后自动执行密钥导入、apt update、安装ros-发行版-desktop-full。这个desktop-full是完整版包含了 rviz、rqt、Gazebo 集成等常用组件我一般直接选完整版省得后面一个个补装。装完它会问你要不要顺便配置环境变量选是就行。第二类是 ROS2 安装逻辑类似对应的是ros-发行版-desktop。ROS2 的包命名规则和 ROS1 不同命令从rosrun变成了ros2 run这个后面细说。第三类是配套工具安装包括 Docker、VsCode、VNC 远程桌面、rosdepc等。Docker 这一项对做ros gazebo在线环境或者需要隔离不同版本环境的场景很有用。VsCode 装上后配合 ROS 插件写代码体验会好很多。第四类是配置类比如一键配置rosdepc、一键设置环境变量、一键配置多机通信。这些单独拿出来讲因为实用。提示菜单里凡是涉及删除或覆盖的操作脚本一般会二次确认看清楚提示再按 y。我有次手快把已经配好的环境变量文件覆盖了只能重新配一遍。3.3 安装完成后的验证动作装完别急着开新项目先跑几个验证动作确认环境是好的。第一步关掉当前终端重新开一个或者执行source ~/.bashrc然后输入roscoreROS1或者ros2 doctorROS2看看命令能不能识别。ROS1 的验证开三个终端分别跑# 终端1 roscore # 终端2 rosrun turtlesim turtlesim_node # 终端3 rosrun turtlesim turtle_teleop_key第三个终端里按方向键小海龟能动说明基础环境没问题。这个ros生成多只海龟并用键盘控制也是很多教程的入门例子顺带说下怎么生成第二只。ROS1 里用服务调用rosservice call /spawn x: 2.0 y: 2.0 theta: 0.0 name: turtle2ROS2 版本写法不同ros2 service call /spawn turtlesim/srv/Spawn {x: 2.0, y: 2.0, theta: 0.0, name: turtle2}生成多只之后再用turtle_teleop_key只能控制默认那只想分别控制得自己写节点或者用命令行发话题。这个例子看着简单但它把话题、服务这两个核心通信机制都覆盖了很适合作为装完后的第一个练手项目。ROS2 的验证稍微不同ros2 run demo_nodes_cpp talker ros2 run demo_nodes_py listener一个发消息一个收消息终端里能看到数据在流动说明 DDS 通信正常工作。4. 把工具链补齐rosdepc、Gazebo、VsCode与Docker4.1 rosdepc解决依赖下载的痛点rosdep是 ROS 编译开源包时用来自动装依赖的工具rosdep install会读package.xml里的依赖声明挨个去装。问题在于它要联网拉索引国内直连经常失败。rosdepc就是把这个索引换到国内用法几乎一样。装法是sudo pip3 install rosdepc sudo rosdepc init rosdepc update在 Ubuntu 22.04 上pip3 install可能会报externally-managed-environment错误这是新版 pip 的保护机制。解决办法有两个一是加--break-system-packages参数二是用pipx装。我一般用前者简单直接sudo pip3 install rosdepc --break-system-packages装完在下游用的时候把原来命令里的rosdep换成rosdepc即可比如编译工作空间前rosdepc install --from-paths src --ignore-src -r -y这个-r是遇到错误继续-y是自动确认。实测下来它比原生rosdep在国内环境下顺畅太多基本不会卡。4.2 Gazebo与仿真环境Gazebo 的安装要看你的 ROS 版本。ROS1 Noetic 下sudo apt install ros-noetic-gazebo-ros-pkgs ros-noetic-gazebo-ros-controlROS2 Humble 下sudo apt install ros-humble-gazebo-ros-pkgs注意ros-humble-gazebo-ros-pkgs这个包是连接 ROS2 和 Gazebo 的桥接不要和独立的 Gazebo 搞混。装完之后跑gazebo看看能不能起来第一次启动会下载模型库可能会卡在Downloading model很久这是正常的模型库存在~/.gazebo/models下面下载一次之后就快了。如果你在虚拟机里跑 Gazebo显卡加速可能有问题表现为启动黑屏或者特别卡。这时候可以试试关掉硬件加速用软件渲染命令是export LIBGL_ALWAYS_SOFTWARE1。虽然帧率低但至少能动。顺带提一句ros gazebo在线环境。鱼香ROS和一些第三方平台提供了托管在云端的 Gazebo 环境适合手上电脑配置不够或者不想折腾本地安装的人。这类环境的用法通常是网页里开一个终端和图形界面操作方式和本地类似适合临时验证算法。4.3 编辑器与容器化环境VsCode 是大多数人写 ROS 的主力工具装上 ROS 插件后package.xml和launch文件都有语法高亮和跳转。一键装完 VsCode 之后建议手动装几个插件ROS、CMake Tools、Python、C/C。这几个组合起来编译和调试能省不少事。Docker 这块如果你要同时维护多套环境比如一套 ROS1 一套 ROS2或者不同版本之间来回切换用容器比在物理机上装多个版本更干净。脚本装好 Docker 后记得把当前用户加进 docker 组省得每条命令都要sudosudo usermod -aG docker $USER执行完要重新登录才生效。这条命令我踩过一次坑当时加了组但没重新登录一直以为配置失败其实是组权限没刷新。5. 从ROS到ROS2版本迁移与共存的实操建议5.1 一台机器上装两个版本会不会打架答案是能装但要会切。ROS1 和 ROS2 装在同一台机器上完全没问题它们各自的安装目录分别是/opt/ros/noetic和/opt/ros/humble互不干扰。真正需要注意的是环境变量source哪个版本当前终端就用哪个。常规做法是在~/.bashrc里写一个函数或者用别名来切换alias source_ros1source /opt/ros/noetic/setup.bash alias source_ros2source /opt/ros/humble/setup.bash然后在需要的时候手动执行。默认可以只 source 一个比如你主要用 ROS2就把 ROS2 的 source 写进~/.bashrc需要 ROS1 时再新开终端切。这里有个实际坑要提醒。ROS1 和 ROS2 之间有个ros1_bridge可以做消息互通但配置起来有讲究两边的消息类型必须能对上自定义消息还得额外处理。如果不是必须我建议同一个项目就选一边别为了都能用把自己绕进去。5.2 ROS2 Humble的关键变化从 ROS1 切到 ROS2命令层面的变化最直观。启动节点从rosrun变成ros2 run话题查看从rostopic变成ros2 topic编译从catkin_make变成colcon build。这些还好改改肌肉记忆就行。真正需要适应的是概念上的变化。ROS2 没有roscore这个中心节点了取而代之的是 DDS 这种去中心化的发现机制节点之间自动发现。好处是没有单点故障坏处是网络环境复杂时比如多机通信发现机制反而更难调。ros主从机设置在 ROS1 里主要配ROS_MASTER_URI到了 ROS2 就得配ROS_DOMAIN_ID和 DDS 相关的发现参数思路完全不同。编译方式也变了。ROS2 用colcon管理多包工作空间常用命令colcon build --symlink-install source install/setup.bash--symlink-install对 Python 包特别友好改了脚本不用重新编译刷新一下就能生效。这个参数我基本每次都带上。6. 几个典型场景落地机械臂、小车导航、相机数据与micro-ROS6.1 机械臂开发的环境搭建思路ros机械臂开发这类项目环境搭建的关键是把 SDK 和 ROS 驱动这两层理顺。以常见的机械臂为例厂商通常会提供两部分东西一个是底层的通信 SDK负责发指令和读状态另一个是 ROS 驱动包把 SDK 封装成话题和服务。装上 ROS 本体之后一般还需要这些组件moveit做运动规划rviz做可视化joint_state_publisher和robot_state_publisher处理关节状态。以 ROS1 Noetic 为例sudo apt install ros-noetic-moveit ros-noetic-joint-state-publisher ros-noetic-robot-state-publisherMoveIt 的配置通常用setup_assistant工具生成导入 URDF 模型后按提示配置自碰撞矩阵、规划组、末端执行器。这个过程不难但繁琐容易在规划组命名上出错一旦group_name和代码里调用对不上规划就会报找不到组。我的习惯是先用setup_assistant生成一个最小配置跑通再逐步加东西。ar3机械臂ros、ros标定这类需求标定环节要有心理准备。相机标定用camera_calibration包手眼标定更复杂一些建议先看厂商有没有现成的标定工具和文档从现成的流程入手比从零搭要快得多。6.2 小车自主导航仿真的最小闭环ros小车自主导航仿真这条链路核心是建图、定位、路径规划三件事。ROS1 里常用gmapping或cartographer建图amcl做定位move_base做导航ROS2 里对应的是slam_toolbox、nav2。搭最小闭环的步骤是这样。先准备一个带雷达和底盘的小车模型可以用 URDF 自己写或者找现成的。然后在 Gazebo 里加载这个模型和仿真世界世界文件里要有障碍物和地面。接着启动建图节点用键盘或手柄控制小车走一圈把地图存下来rosrun map_server map_saver -f my_map最后加载地图跑导航roslaunch my_robot navigation.launch在 rviz 里用2D Nav Goal点一个目标点小车应该能自己规划路径过去。这一步失败最常见的原因是坐标变换没配好tf树断裂rviz 里会提示某个 frame 不存在。排查方法是用rosrun tf view_frames生成 tf 树图看哪一环断了。ros版本humble hawksbill安装这类看起来奇怪的关键词多半是某个特定硬件平台或比赛用的版本组合思路是一样的只是把上面的 ROS1 命令换成 ROS2 的对应包。6.3 相机驱动与rosbag录制海康相机驱动ros录制这个需求很典型。工业相机一般走厂商自己的 SDK比如海康的 MVS需要先装 SDK再装对应的 ROS 驱动包或者用通用的usb_cam、v4l2_camera如果相机支持标准协议的话。驱动跑起来后验证方式是看话题有没有数据rostopic hz /camera/image_raw能看到稳定的频率输出说明采集正常。录制数据用rosbagrosbag record /camera/image_raw /imu/data -O mybag.bag-O指定输出文件名。录完用rosbag info mybag.bag看里面有哪些话题、多少条消息。回放用rosbag play mybag.bag加--loop可以循环播放。注意录图像数据非常占空间一路 1080p 图像录十分钟可能就是好几个 G。录之前先用df -h看一眼磁盘别录到一半把盘写满了系统卡死还得重启。ROS2 里对应的工具是ros2 bag record和ros2 bag play用法类似但存储格式从.bag变成了.db3加元数据文件整个目录一起管理。6.4 micro-ROS与ESP32ros 2 humble micro-ros esp32这条线的场景是让单片机直接接入 ROS2 网络。micro-ROS 是把 ROS2 的客户端库裁剪后跑在资源受限的 MCU 上ESP32 因为带 Wi-Fi 和蓝牙是很常见的载体。整体架构分两半。单片机这边跑 micro-ROS 的客户端主机这边跑一个 agent两者通过串口或者 UDP 通信。ESP32 上一般用 Arduino 环境装micro_ros_arduino这个库然后按官方示例改配置填上 Wi-Fi 名称密码和 agent 的地址端口。主机这边装 agent。ROS2 Humble 下有几种安装方式用 Docker 跑是最省事的docker run -it --rm --nethost microros/micro-ros-agent:humble udp4 --port 8888如果走串口把udp4 --port 8888换成serial --dev /dev/ttyUSB0 -b 115200。跑起来后在另一个终端ros2 topic list应该能看到 ESP32 发布的话题。我第一次调通的时候看到ros2 node list里冒出单片机的节点那种感觉还挺奇妙的。坑主要在端口和权限上。串口方式下当前用户可能没有/dev/ttyUSB0的读写权限需要把自己加进dialout组。UDP 方式下防火墙可能拦包临时关掉防火墙测试一下能快速定位问题。7. 常见问题排查速查与避坑心得7.1 常见报错速查表下面这些是我这几年反复遇到的错误整理成表格方便对照。报错现象可能原因解决思路Failed to fetch源不通或网络抖动换国内源重试apt updateGPG error密钥未导入或过期重新导入密钥或换源后重试Unable to locate package ros-xxxROS 源没配或版本不匹配检查/etc/apt/sources.list.d/下的 ROS 源roscore: command not found环境变量没生效source /opt/ros/版本/setup.bash检查~/.bashrc外无法获得锁 /var/lib/dpkg/lock有其他 apt 进程等待结束或按提示清理锁文件Could not find a package configuration file依赖包没装用rosdepc install补依赖pip externally-managed-environment新版 pip 保护加--break-system-packages或用 pipxrviz 里 tf 报错 frame 不存在坐标变换未发布rosrun tf view_frames检查 tf 树Gazebo 启动黑屏显卡加速异常设LIBGL_ALWAYS_SOFTWARE1软件渲染这张表建议存下来出问题先对号入座能省掉大量搜索时间。7.2 主从机配置的那些细节ros主从机设置是多机协作的基础比如主机跑导航从机跑传感器。ROS1 里的配置是在从机的~/.bashrc里加两行export ROS_MASTER_URIhttp://192.168.1.100:11311 export ROS_IP192.168.1.101ROS_MASTER_URI指向主机的 IP 和端口ROS_IP是本机 IP。主机那边也要设自己的ROS_IP。三个点要保证两台机器在同一网段能互相ping通主机和从机的时间同步时间差太大会导致消息时间戳异常主机名能互相解析实在不行就统一用 IP。配好之后在从机执行rostopic list能看到主机的话题说明通了。常见问题是防火墙拦截或者用了无线网络两机不在同一网段这种时候ros路由器无线中继之类的网络拓扑就要检查一下中继后的设备可能被分到不同子网。7.3 我踩过的几个坑第一个坑是装完就地重启结果没等apt的配置阶段跑完重启后 dpkg 状态损坏只能手动dpkg --configure -a修复。装 ROS 这种大工程看到终端彻底回到提示符、没有后台进程了再重启。第二个坑是同时装 ROS1 和 ROS2 后~/.bashrc里两行 source 都留着每次开终端后一个覆盖前一个导致命令行为诡异。后来我只保留一个默认 source另一个用别名按需切换。第三个坑是 Docker 里的 ROS 和主机上的 ROS 通信忘了配ROS_DOMAIN_ID两边话题互相看不见排查了半天才发现是域 ID 不一致。容器和主机通信时这个参数必须对齐网络模式用--nethost也能省不少事。第四个坑是 rosbag 录了一大堆数据结果磁盘写满系统直接卡死强行断电后文件系统损坏。现在我录数据前一定先df -h并且给录制命令加个--duration或者用脚本监控磁盘剩余空间。这几个坑的共同点是出问题时终端给的提示都不够直白得靠经验判断。所以我把它们写出来希望你能少走一遍。提示遇到脚本安装失败先别急着换脚本。把报错信息完整看一遍大部分问题都出在网络和权限上这两个解决了剩下的基本顺风顺水。最后再分享一个小技巧。装完之后建一个自己的install_log.md把版本号、安装时间、遇到的问题和解决办法都记进去。几个月后再回来复现环境翻一下记录比凭记忆靠谱得多。我手头这个记录已经攒了好几页帮我在换电脑和重装系统的时候省下了大量时间。
返回列表