
RDK X5 这块板子最近在机器人圈子里讨论度很高我自己前后上手了三块从最开始烧录镜像踩坑到后面把 ROS 2 Humble 完整跑起来、接上底盘和传感器中间折腾了不少时间。这篇文章不讲虚的就把从零搭建地瓜 RDK X5 机器人开发环境的完整过程拆开讲清楚——包括系统镜像怎么选、Ubuntu 20.04 环境怎么配、ROS 2 Humble 怎么装、常见依赖怎么补、以及跑通第一个机器人节点需要做哪些事。适合刚拿到板子不知道从哪下手的朋友也适合已经装过系统但卡在 ROS 2 环境上的同学参考。我尽量把每一步的为什么这么做讲明白而不是只丢一堆命令让你复制。因为机器人开发环境这东西命令谁都能抄但出了问题能不能自己定位靠的是对底层逻辑的理解。1. 拿到 RDK X5 之后先想清楚这几件事1.1 这块板子到底适合做什么RDK X5 是地瓜机器人推出的一款面向机器人开发的算力板卡核心卖点是自带 BPU 神经网络加速单元能跑视觉推理、SLAM、路径规划这类机器人典型负载。它出厂一般预装基于 Ubuntu 的系统官方主推的搭配就是 Ubuntu 20.04 ROS 2 Humble 这套组合。为什么是 Ubuntu 20.04 而不是更新的 22.04这里有个很现实的理由ROS 2 Humble 的官方 Tier 1 支持平台就是 Ubuntu 20.04Focal。虽然 Humble 也能在 22.04 上跑但很多机器人相关的二进制包、驱动、第三方库在 20.04 上的验证最充分。你在机器人项目里最怕的不是功能少而是某个底层库版本对不上导致编译一整天。所以跟着官方推荐走能省掉大量排查时间。这块板子的典型应用场景包括移动机器人底盘控制、视觉巡线、目标检测跟随、多传感器融合建图、机械臂视觉引导等。如果你只是想做纯计算或者纯单片机控制其实用不上它但只要涉及感知决策控制这条链路RDK X5 的定位就很合适。1.2 开发环境搭建的整体思路很多人一上来就急着装 ROS结果系统环境一团糟后面各种依赖冲突。我的建议是把整个搭建过程分成四层逐层验证层级内容验证标准第一层系统镜像烧录与启动能正常进桌面/终端网络通第二层基础开发工具链gcc、cmake、python、git 可用第三层ROS 2 Humble 安装ros2 topic list 能正常输出第四层机器人功能包与硬件联调能收发话题、控制底盘这个分层的好处是每一层出问题都能快速定位。比如你 ROS 装完发现编译报错如果第一二层是干净的那问题基本就在 ROS 依赖上不用怀疑系统。提示强烈建议在动 ROS 之前先确认系统时间和时区正确。ROS 2 的 DDS 通信对时间同步敏感时间不对会导致节点之间发现不了彼此这个坑我踩过排查了半天才发现是时区问题。1.3 硬件和网络准备清单动手之前把这些东西备齐能少跑很多冤枉路RDK X5 开发板本体 官方电源供电不足会导致板子随机重启别用手机充电器凑合至少 32GB 的 microSD 卡建议 Class 10 以上U3 更好或者用板载 eMMC 的话准备对应的烧录方式读卡器网线一根有线连接比 WiFi 稳定太多尤其是后面做多机通信一台电脑用于烧录镜像和 SSH 连接可选USB 转串口模块用于调试启动日志网络这块我要多说一句。RDK X5 支持有线和无线但在开发阶段我强烈建议用有线。原因有两个一是 ROS 2 的 DDS 默认走组播无线网络对组播的支持经常有问题导致节点发现不稳定二是有线能保证你 SSH 和文件传输的速度编译大包的时候体验差很多。2. 系统镜像烧录与首次启动的完整流程2.1 镜像选择别盲目追新地瓜官方会提供多个版本的镜像通常分为带桌面的完整版和精简版。我的选择逻辑是这样的如果你是第一次上手选带桌面的完整版。虽然占空间但你能直观看到系统状态调试方便。如果你已经熟悉准备做无头部署选精简版省资源启动快。镜像版本尽量选官方标注为稳定版或推荐版的不要选最新的 beta 版。机器人项目求稳不求新。下载镜像的时候注意核对文件大小和校验值一般官方会给 MD5 或 SHA256。我遇到过一次下载不完整导致烧录后无法启动的情况重新下载就好了所以校验这一步别省。2.2 烧录工具与操作要点烧录工具用 balenaEtcher 或者官方推荐的烧录软件都行。操作本身不复杂但有几个细节决定成败烧录前先格式化 SD 卡尤其是之前用过其他系统的卡残留分区表会干扰。烧录完成后不要急着拔卡等工具提示写入和校验都完成。如果板子支持从 eMMC 启动需要先通过 SD 卡启动再用官方工具把系统写入 eMMC这一步官方文档有详细说明照着做即可。烧录完成后把卡插回板子接上电源和网线上电。第一次启动会比较慢因为系统要做初始化耐心等 1-2 分钟。2.3 首次登录与基础配置首次启动后你需要知道板子的 IP 地址。如果有显示器直接看桌面如果没有可以通过路由器管理界面找或者用串口登录后执行ip addr查看。登录方式有两种直接接显示器和键盘图形界面操作通过 SSH 远程登录命令如下ssh username板子IP默认用户名和密码官方文档会给出首次登录后第一件事就是改密码这是基本安全习惯。登录后先做几件基础配置# 更新软件源 sudo apt update sudo apt upgrade -y # 设置时区重要 sudo timedatectl set-timezone Asia/Shanghai # 确认时间同步 timedatectl status时区这一步我再强调一次ROS 2 节点通信依赖时间时区错了会导致时间戳异常进而影响 TF 变换和传感器数据对齐。2.4 网络配置的稳定性优化如果你用有线一般插上就能用。如果用 WiFi建议配置静态 IP避免 IP 变动导致 SSH 断连。配置静态 IP 可以通过图形界面也可以改配置文件。另外ROS 2 在多机通信时需要设置ROS_DOMAIN_ID和ROS_LOCALHOST_ONLY等环境变量。开发阶段如果只在本机跑可以设置export ROS_LOCALHOST_ONLY1这样能避免局域网内其他设备的 ROS 2 节点干扰你的调试。等要做多机通信时再关掉。注意如果你所在网络环境复杂比如公司或实验室有很多设备DDS 的自动发现可能会发现一堆无关节点这时候用ROS_LOCALHOST_ONLY1或者指定ROS_DOMAIN_ID能有效隔离。3. Ubuntu 20.04 基础开发环境的补齐3.1 系统自带工具盘点与缺失补齐RDK X5 的官方镜像虽然基于 Ubuntu 20.04但为了控制体积往往不会预装所有开发工具。上电后先检查一遍gcc --version cmake --version python3 --version git --version如果哪个没有就补上。一次性把常用工具装齐sudo apt install -y build-essential cmake git python3-pip python3-dev \ wget curl vim htop net-tools这里解释一下每个包的作用方便你按需取舍build-essential包含 gcc、g、make 等编译核心工具ROS 2 编译离不开cmake构建系统ROS 2 的 ament 构建依赖它python3-pipPython 包管理很多 ROS 2 工具是 Python 写的python3-devPython 开发头文件编译 Python 扩展时需要net-tools提供 ifconfig 等老牌网络工具虽然新系统推荐 ip 命令但有些脚本还在用3.2 Python 环境的管理策略Ubuntu 20.04 自带 Python 3.8这个版本对 ROS 2 Humble 是兼容的。但这里有个坑不要随意升级系统 Python 版本。ROS 2 Humble 的很多包是针对 Python 3.8 编译的你升级到 3.10 之后二进制包可能加载失败。如果你确实需要其他 Python 版本做别的开发用虚拟环境隔离sudo apt install -y python3-venv python3 -m venv myenv source myenv/bin/activate但在 ROS 2 环境下工作时建议还是用系统 Python避免环境混乱。pip 安装包的时候如果遇到权限问题用--user参数装到用户目录不要动不动就sudo pip那样容易污染系统环境。3.3 中文输入法与显示环境如果你要接显示器做图形化开发中文输入法可能需要配置。Ubuntu 20.04 上常用的是 fcitx 框架配合拼音输入法sudo apt install -y fcitx fcitx-pinyin fcitx-config-gtk装完后在系统设置里配置输入法框架为 fcitx然后重启。这一步不是必须的如果你纯 SSH 开发可以跳过。另外如果 SSH 终端里中文显示乱码检查 locale 设置sudo locale-gen zh_CN.UTF-8 sudo update-locale LANGzh_CN.UTF-83.4 远程开发体验优化纯命令行开发效率有限我习惯用 VS Code 的 Remote-SSH 插件连到板子上开发。这样既能用本地熟悉的编辑器又能直接在板子上编译运行。配置步骤本地 VS Code 安装 Remote-SSH 插件配置 SSH 连接信息连接后在板子上安装 VS Code Server会自动提示安装 ROS、Python、C 相关插件这样你写代码、编译、调试都在板子环境里完成避免本地和板子环境不一致导致的问题。实测下来这套流程比纯 vim 效率高不少尤其是调试 C 节点的时候。提示Remote-SSH 连接如果经常断可以在 SSH 配置里加上ServerAliveInterval 60保持连接活跃。4. ROS 2 Humble 安装与验证的实操细节4.1 安装源配置的正确姿势ROS 2 Humble 在 Ubuntu 20.04 上的安装官方推荐用 apt 方式。第一步是配置软件源和密钥# 添加 ROS 2 仓库密钥 sudo apt install -y software-properties-common sudo add-apt-repository universe sudo apt update sudo apt install -y curl sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \ -o /usr/share/keyrings/ros-archive-keyring.gpg # 添加源 echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] \ http://packages.ros.org/ros2/ubuntu $(. /etc/os-release echo $UBUNTU_CODENAME) main | \ sudo tee /etc/apt/sources.list.d/ros2.list /dev/null这里有个常见问题如果网络访问 GitHub 慢密钥下载可能失败。可以多试几次或者手动下载后放到对应目录。源配置好后执行sudo apt update如果这一步报错多半是源地址或密钥有问题仔细看报错信息。4.2 安装桌面版还是基础版ROS 2 Humble 有几个安装选项安装包内容适用场景ros-humble-desktop包含 ROS、RViz、demo、教程有图形界面学习开发ros-humble-ros-base只含核心通信库和工具无头部署资源受限ros-humble-perception感知相关包视觉、点云处理对于 RDK X5 这种要做机器人完整开发的板子我建议装ros-humble-desktop因为 RViz 可视化在调试时太有用了。虽然占空间但值得。sudo apt install -y ros-humble-desktop安装过程可能比较久取决于网络。装完后配置环境变量echo source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc4.3 环境变量与工作空间初始化ROS 2 装完后验证一下ros2 topic list如果输出/parameter_events和/rosout说明核心通信正常。接下来初始化工作空间。ROS 2 用 colcon 作为构建工具sudo apt install -y python3-colcon-common-extensions mkdir -p ~/ros2_ws/src cd ~/ros2_ws colcon build source install/setup.bash把工作空间的 setup 也加到.bashrc里这样每次开终端都自动加载echo source ~/ros2_ws/install/setup.bash ~/.bashrc注意工作空间的 source 要放在 ROS 系统 source 之后否则会覆盖系统环境。顺序错了会导致找不到系统包。4.4 跑通第一个节点验证环境环境装完跑个经典的 talker/listener 验证# 终端1 ros2 run demo_nodes_cpp talker # 终端2 ros2 run demo_nodes_py listener如果 listener 能收到 talker 发的消息说明 ROS 2 通信链路完全正常。这一步看着简单但它验证了 DDS 发现、话题通信、Python 和 C 混合环境是环境是否健康的综合体检。如果这一步不通排查顺序是先看环境变量是否 source 正确再看ROS_DOMAIN_ID是否一致最后检查网络和防火墙。防火墙这块Ubuntu 默认的 ufw 如果开着可能会挡 DDS 通信开发阶段可以临时关掉sudo ufw disable5. 机器人开发常用依赖与工具链补充5.1 编译工具与依赖管理机器人项目经常要编译第三方包除了前面装的 build-essential还需要一些常用库sudo apt install -y libeigen3-dev libboost-all-dev libyaml-cpp-dev \ libopencv-dev libpcl-dev这些库的用途libeigen3-dev线性代数库做坐标变换、矩阵运算必备libboost-all-devC 通用库很多机器人包依赖libyaml-cpp-devYAML 解析ROS 2 参数文件常用libopencv-dev计算机视觉视觉相关节点依赖libpcl-dev点云处理激光雷达和深度相机相关装这些库的时候注意版本兼容。Ubuntu 20.04 的 apt 源里的版本都是经过验证的一般不会有问题。但如果你从源码编译某些包可能会要求特定版本这时候要小心处理。5.2 rosdep 的正确使用rosdep是 ROS 用来管理依赖的工具编译前一般要执行sudo rosdep init rosdep updaterosdep init如果报错说文件已存在说明之前初始化过可以跳过。rosdep update需要访问网络如果超时可以多试几次。编译工作空间时先安装依赖cd ~/ros2_ws rosdep install --from-paths src --ignore-src -r -y这个命令会扫描src下所有包的package.xml自动安装缺失依赖。养成习惯每次拉新代码后先跑一遍能避免很多找不到头文件的编译错误。5.3 常用调试工具安装机器人调试离不开工具这几个我强烈建议装上sudo apt install -y ros-humble-rqt ros-humble-rqt-common-plugins \ ros-humble-rviz2 ros-humble-tf2-toolsrqt图形化调试工具集能看话题、服务、参数rviz23D 可视化看传感器数据、TF、地图tf2-tools坐标变换调试ros2 run tf2_tools view_frames能生成 TF 树另外ros2 topic hz和ros2 topic echo这两个命令要熟练前者看话题频率后者看话题内容是排查传感器数据是否正常的第一手段。5.4 串口与硬件通信准备机器人开发免不了和单片机、底盘通信串口是常见方式。检查串口权限ls -l /dev/ttyUSB* /dev/ttyACM*如果权限不够把用户加到 dialout 组sudo usermod -aG dialout $USER然后重新登录生效。这一步不做的话程序打开串口会报权限错误很多人第一次遇到会以为是代码问题。如果需要用 Python 操作串口装 pyserialpip3 install pyserial6. 环境搭建中那些容易翻车的点6.1 依赖冲突与版本地狱机器人开发最头疼的就是依赖冲突。常见场景是你装了一个包它依赖某个库的 A 版本但系统里已经有 B 版本apt 会尝试解决但有时候解决不了就报错。我的处理原则是优先用 apt 装不要动不动就从源码编译。apt 的包经过测试依赖关系处理得好。遇到冲突先看报错apt 会告诉你哪个包冲突根据提示决定是降级还是移除。用虚拟环境隔离 Python 依赖避免 pip 装的包和系统包打架。记录环境变更装了什么、改了什么配置记下来出问题好回溯。6.2 编译内存不足的处理RDK X5 的内存有限编译大包比如某些视觉库时可能因为内存不足被 kill。表现是编译到一半突然中断报错信息里有 Killed 字样。解决办法增加 swap 空间用colcon build --parallel-workers 1减少并行编译数分模块编译不要一次编译整个工作空间增加 swap 的操作sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile然后加到/etc/fstab里持久化。这个技巧在资源受限的板子上特别实用。6.3 网络与 DDS 通信问题ROS 2 的 DDS 通信在复杂网络环境下容易出问题典型表现是节点之间发现不了。排查思路确认ROS_DOMAIN_ID一致确认ROS_LOCALHOST_ONLY设置符合预期检查防火墙确认网络支持组播如果组播有问题可以配置 DDS 使用单播或者换用其他 DDS 实现。不过开发阶段最简单的办法就是本机开发时设ROS_LOCALHOST_ONLY1多机时确保在同一网段且网络干净。6.4 系统更新带来的意外有时候apt upgrade会更新一些底层库导致原本能跑的 ROS 环境出问题。我的建议是环境搭好后不要频繁全量升级升级前用apt list --upgradable看看要升什么心里有数关键项目环境考虑用 Docker 固化避免系统变动影响Docker 这块RDK X5 上跑 ROS 2 的 Docker 容器是可行的但要注意设备映射比如串口、摄像头和网络模式配置。这个展开讲又是一大篇后面有机会单独聊。7. 从环境到第一个机器人功能节点7.1 创建功能包的规范流程环境验证通过后建一个自己的功能包练手cd ~/ros2_ws/src ros2 pkg create --build-type ament_cmake my_robot_pkg \ --dependencies rclcpp std_msgs这里选ament_cmake是因为机器人底层控制多用 C性能好。如果是纯逻辑或工具可以用ament_python。创建后目录结构是my_robot_pkg/ ├── CMakeLists.txt ├── include/my_robot_pkg/ ├── package.xml └── src/在src下写节点然后在CMakeLists.txt里配置编译目标package.xml里声明依赖。这套流程是 ROS 2 的标准做法熟悉之后很顺手。7.2 一个最小可用的控制节点写一个简单的节点订阅速度指令打印出来实际项目里会转发给底盘#include rclcpp/rclcpp.hpp #include geometry_msgs/msg/twist.hpp class CmdVelSubscriber : public rclcpp::Node { public: CmdVelSubscriber() : Node(cmd_vel_subscriber) { subscription_ this-create_subscriptiongeometry_msgs::msg::Twist( cmd_vel, 10, [this](const geometry_msgs::msg::Twist::SharedPtr msg) { RCLCPP_INFO(this-get_logger(), 收到速度指令: linear.x%.2f, angular.z%.2f, msg-linear.x, msg-angular.z); }); } private: rclcpp::Subscriptiongeometry_msgs::msg::Twist::SharedPtr subscription_; }; int main(int argc, char** argv) { rclcpp::init(argc, argv); rclcpp::spin(std::make_sharedCmdVelSubscriber()); rclcpp::shutdown(); return 0; }这个节点订阅cmd_vel话题收到消息就打印。编译后运行再用ros2 topic pub发一条测试消息能看到打印就说明你的开发环境完全打通了。7.3 编译与运行的完整验证编译cd ~/ros2_ws colcon build --packages-select my_robot_pkg source install/setup.bash运行ros2 run my_robot_pkg cmd_vel_subscriber另开终端发消息ros2 topic pub /cmd_vel geometry_msgs/msg/Twist \ {linear: {x: 0.5}, angular: {z: 0.1}}如果订阅端打印出速度值恭喜你的 RDK X5 机器人开发环境已经完整可用。接下来就是接传感器、写控制逻辑、做实际机器人功能了。提示实际项目中cmd_vel话题的坐标系和单位要统一。线速度单位是米/秒角速度是弧度/秒底盘固件要按这个约定解析否则机器人动起来会和你预期不符。8. 一些让环境更稳的长期维护习惯环境搭好只是开始长期稳定运行靠的是维护习惯。我自己总结了几条第一给系统做快照。环境配置到稳定状态后用镜像工具备份整个系统出问题能快速恢复。这个在板子上尤其重要因为重装一次环境要花不少时间。第二用脚本记录环境配置。把安装命令、配置修改写成脚本换板子或者重装时一键执行。我自己的脚本里包含了源配置、依赖安装、环境变量设置省了很多重复劳动。第三版本锁定。关键依赖记录版本号避免某次升级导致不兼容。ROS 2 的包版本、Python 库版本、编译工具版本都值得记录。第四分离开发环境和运行环境。开发时装的调试工具部署时可以精简掉减少资源占用和潜在故障点。第五定期检查日志。ROS 2 的日志在~/.ros/log下定期看看有没有异常警告很多问题在爆发前都有征兆。这套环境我在 RDK X5 上反复搭过几次从最开始的手忙脚乱到现在半小时能搞定靠的就是把每一步的逻辑搞清楚而不是死记命令。机器人开发环境搭建这件事本质上是在建立一个可靠的软件基础基础打牢了后面做算法、调硬件才顺。希望这篇内容能帮你少走点弯路把时间花在真正有价值的机器人功能开发上。