拓冰建站拓冰建站
首页 / 资讯中心 / 正文

基于RK3588和ROS2的家庭服务机器人实战:从裸板到抓取

花了一个多月我总算把这台基于RK3588方案的ELF 2开发板从一块裸板折腾成了一台能在家里自己转悠、看见水杯能识别、还能伸手把它抓起来的家庭服务机器人。这篇算是个作品展示加项目复盘不写PPT式的功能介绍主要讲我在搭这套ROS2具身智能系统时真正踩过的坑、验证过的做法以及实测下来的数据。先交代一下平台板子是RK3588方案的ELF 2开发板核心板加底板的形态CPU是4颗A76大核加4颗A55小核集成Mali-G610 GPU还有一颗6TOPS算力的NPU接口上该有的基本都有。软件侧用Ubuntu 22.04加ROS2 Humble感知部分把YOLOv8迁到NPU上跑导航用Nav2配八叉树地图底盘下位机用ESP32-S3走micro-ROS和主板通信机械臂用MoveIt2做规划。整套东西合起来就是现在大家常说的具身智能里的“感知、决策、执行”闭环。这篇内容适合谁正在用RK3588或者类似ARM平台折腾ROS2的同学想给机器人加视觉识别和机械臂抓取的同学还有被各种“具身智能学习路线”绕晕了、想看一个真实落地案例的同学。我能帮到你的是把那些文档之外容易卡人的地方提前给你排掉。1. 项目整体设计与思路拆解1.1 为什么硬件平台选了RK3588而不是树莓派或Jetson很多人上来就问做家庭服务机器人选RK3588而不是树莓派5或者Jetson Orin Nano理由是啥我一个个说。先看树莓派5。CPU性能确实比前代强不少但它没有像样的NPU想在本地跑YOLOv8这类视觉模型只能靠CPU硬扛。我用一块树莓派5对比测试过跑YOLOv8s在640×640输入下单帧推理要两三百毫秒做实时目标检测基本没法用。家庭服务机器人需要本地视觉推理如果把摄像头画面传到云端识别延迟大而且隐私也没保障所以本地算力是刚需。再看Jetson Orin Nano。性能确实强CUDA生态也成熟但价格贵载板也不便宜而且供货经常不稳定。对个人开发者来说RK3588的方案要友好得多芯片本身集成6TOPS NPU部署YOLOv8s量化模型能做到单帧二三十毫秒完全够用而且这颗芯片还带8K视频编解码以后要做视频监控、远程图像回传都不用额外加硬件。还有一点很多人容易忽略就是接口。做机器人要接激光雷达、RGB-D深度相机、下位机串口、PWM风扇、IMU、麦克风阵列RK3588的底板上一般都有PCIe、USB3.0、MIPI-CSI、I2C、SPI、UART、GPIO这些接口基本不需要转接板。我手上这块ELF 2就是核心板加底板的形态核心板负责算力底板把外设接口全引出来了省去自己画最小系统的麻烦。1.2 为什么软件侧选了ROS2而不是ROS1软件栈这块我几乎没有犹豫就直接用了ROS2 Humble。原因有几个。第一ROS1的通信架构是中心化的roscore一挂整台机器人就瘫了。ROS2改成DDS分布式通信节点之间点对点直连单点故障影响面小得多。家庭服务机器人要长时间稳定跑这个差异很关键。第二ROS2自带生命周期管理节点可以自己管理状态比如导航节点在“未激活”和“正常”之间切换长期运行出问题的概率比ROS1低。实际跑下来我一个导航任务连续跑四五个小时节点基本稳定。第三生态成熟度。Ubuntu 22.04对应的ROS2版本是Humble这个版本刚好是LTSNav2、MoveIt2、micro-ROS这些关键工具链都在Humble上跑得最顺。尤其是Nav2它相比ROS1的move_base在代价地图、行为树、插件化规划器方面都做了大改更适合做复杂的室内导航任务。最后说一句跟具身智能相关的。现在搜“具身智能学习路线”能看到很多文章但落到工程上绝大多数方案的第一步就是ROS2。因为具身智能要求机器人在真实环境里感知、规划、行动而ROS2正好提供了这套底层的通信、调度和硬件抽象能力。后续哪怕要接行为树、接大语言模型做任务规划ROS2都有成熟方案可以扩展。1.3 家庭服务机器人的总体架构做这个项目之前我先把整体架构分成了四层这样别人问起来也好讲感知层RGB-D深度相机加激光雷达加IMUYOLOv8做目标检测八叉树地图OctoMap做三维环境表示。决策层ROS2行为树做任务调度Nav2做路径规划与避障MoveIt2做机械臂运动规划。执行层差速底盘由ESP32-S3下位机控制六自由度机械臂负责抓取语音模块负责播报状态。交互层通过RViz2看机器人的实时状态也方便调试后续可以再接Web端或语音大模型。数据流大概是这样激光雷达和深度相机把点云喂给建图节点同时YOLOv8从RGB图像里检测出目标物体得到它在图像里的位置深度相机取深度后把像素坐标换算成相机坐标系下的三维坐标TF树负责把机器人各个坐标系串起来Nav2根据预建的二维地图规划底盘路径MoveIt2根据目标物体的三维坐标规划机械臂抓取路径。这里有一个很重要的经验动手写任何功能代码之前一定要把坐标系和数据流画清楚。我一开始没认真画TF树结果后面定位和抓取全乱套改起来特别痛苦。2. 硬件平台与基础环境搭建要点2.1 RK3588刷机与系统初始化ELF 2开发板到手第一件事就是刷系统。我选择刷Ubuntu 22.04因为ROS2 Humble在Ubuntu 22.04上是官方支持最好的组合。刷机流程并不复杂但有几个细节必须注意。先把开发板进入Loader模式一般是按住板子上的recovery键或者maskrom键然后用USB Type-C数据线连电脑最后上电。这个顺序不能反反了电脑就识别不到设备。识别成功之后用厂商提供的烧录工具把Ubuntu镜像写进去。我这边实测大概5到8分钟刷完刷完会自动重启。刷完系统之后我建议第一时间检查三件事CPU温度、风扇是否转、网络是否通。RK3588满载发热是比较猛的被动散热根本压不住主动散热是刚需。系统起来之后查看温度直接执行cat /sys/class/thermal/thermal_zone*/temp这个数字除以1000就是摄氏度。如果温度异常高说明散热没起作用优先检查风扇。RK3588开发板一般带PWM风扇控制在/sys/class/hwmon下面能看到pwm_fan设备可以通过配置让风扇根据温度自动调速。这里要重点说一下网上搜“rk3588读取风扇转速”的情况。很多人以为接个PWM风扇就能直接读到转速其实不是。RK3588底板上的风扇座一般只有PWM信号和电源正负极并没有转速反馈线。如果你用的是带测速线tach的三线或四线风扇需要把测速线接到一个可用的GPIO上然后通过GPIO中断测量两路脉冲之间的时间间隔才能换算出实际转速。如果你只是想确保散热正常直接看温度曲线更实用。2.2 Ubuntu 22.04安装ROS2 Humble的完整流程ROS2 Humble的安装最大的坑不是步骤复杂而是很多人一开始就卡在软件源上。网上搜“ubuntu 22.04 安装ros2 e: unable to locate package ros-humble-desktop”能搜出一堆求助帖原因九成是那个致命的错误没有启用universe软件源。因为ROS2的官方软件包依赖universe源里的很多包如果没启用apt就找不到ros-humble-desktop。正确做法是先检查universe源sudo apt update sudo apt install software-properties-common sudo add-apt-repository universe sudo apt update然后添加ROS2官方源sudo apt install 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 sudo apt update sudo apt install ros-humble-desktop如果访问packages.ros.org比较慢可以把源替换成国内镜像这里不展开大家自行选择合适的镜像即可。安装完成后在.bashrc里加上一行source /opt/ros/humble/setup.bash然后验证一下是否装好ros2 run demo_nodes_cpp talker另开一个终端ros2 run demo_nodes_cpp listener能看到对话说明ROS2核心安装成功。这套流程我自己走了两遍只要按顺序来Ubuntu 22.04上就不会再出现找不到软件包的问题。2.3 RKNN工具链与YOLOv8部署这一节是最多人问的也是项目里最耗时间的一块。先说结论我最终把YOLOv8s部署到RK3588的NPU上输入640×640INT8量化单帧推理在二三十毫秒左右足够家庭环境下的实时检测。如果放在CPU上跑同模型单帧要三四百毫秒根本没有可用性。所以NPU迁移是非常值得做的。迁移流程大致是PyTorch训练好的模型先导出成ONNX然后用RKNN-Toolkit2把ONNX转成.rknn格式最后在板子上用RKNN Runtime加载推理。转换代码其实不难核心就几步from rknn.api import RKNN rknn RKNN() rknn.config(mean_values[[0, 0, 0]], std_values[[255, 255, 255]], target_platformrk3588) rknn.load_onnx(modelyolov8s.onnx) rknn.build(do_quantizationTrue, datasetdataset.txt) rknn.export_rknn(yolov8s.rknn)然后板端加载推理rknn RKNN() rknn.load_rknn(yolov8s.rknn) rknn.init_runtime() outputs rknn.inference(inputs[img])这里面有几个坑必须提醒。第一ONNX导出时的opset版本要控制好太高版本在RKNN转换时可能报不支持的操作算子。我这边导出YOLOv8时用的opset 11转换一次通过了。第二量化数据集不能随便给最好选几百张真实场景的图片覆盖你要检测的目标类别。否则量化后精度掉得厉害人站在一米开外都识别不准。第三很多人搜“rk3588部署yolov8”最后卡在工具链版本上。RKNN-Toolkit2对RK3588的支持有版本要求注意配套关系不要拿老版本去转。还有一个容易误导的点网上有不少资料在讲ubuntu 22.04上安装ros2 cuda cudnn yolo8说这个流程需要CUDA。实际上RK3588的NPU推理走的RKNN Runtime跟CUDA完全没关系CPU推理也用不到CUDA。如果你只是在这块板子上做视觉识别根本不用装CUDA和cuDNN别被通用的GPU教程带偏了。3. 机器人核心功能与关键实现3.1 底盘控制从ESP32-S3到ROS2的桥接家庭服务机器人要动底盘是基础。我的方案是差速底盘两个带编码器的直流减速电机加一个万向轮。底层控制板选了ESP32-S3走micro-ROS和主板通信。为什么不用RK3588直接控制电机因为Linux不是实时系统直接用GPIO发PWM、读编码器延迟抖动会很大电机容易一抽一抽的。MCU做底层运动控制RTOS环境能保证PWM波形和编码器采样的时序稳定这是工业上常见的上下位机分工。主板和ESP32-S3之间用串口通信。主板发布ROS2的cmd_vel话题线速度、角速度micro-ROS节点把它打包成串口协议发下去下位机做速度闭环控制再通过串口上报编码器计算出来的odom里程计数据。micro-ROS的配置在VSCode加PlatformIO里做比较方便用官方提供的micro_ros_arduino库先在PC上编译好然后烧录到ESP32-S3。这一块的难点主要在于把串口协议定义好我自己的报文格式大概是帧头、数据长度、线速度、角速度、CRC校验。别小看这个CRC校验没有它串口偶尔遇到一个错字节底盘就会莫名其妙冲一下。底盘装好之后建议先做里程计标定。把机器人放地上直行两米测实际距离如果误差超过2%就要调整轮径参数。再做原地旋转360度看角度误差调整轮距参数。标定好了后面导航的地图质量才有保障。3.2 室内建图与八叉树地图导航导航这块我的实际方案是二维地图建图加Nav2导航再叠加八叉树地图做三维环境表示。建图用的是slam_toolbox相对于Cartographer它的配置更简单对单线激光雷达的支持也更直接。我围着房间推着机器人走了一圈出来的二维栅格地图边界清晰走廊和桌子腿的位置都对得上作为Nav2导航用的基础地图是够的。但如果只做二维导航机器人是看不到悬空障碍物的。比如茶几下面的空间对二维激光雷达来说可能是空的对机械臂和机器人本体来说却可能碰到。所以我叠加了OctoMap也就是八叉树地图。用深度相机的点云通过octomap_server节点把环境建模成三维体素网格体素尺寸我设的是0.05米太大细节丢失太小内存和更新速度都受不了。实际建图时把机器人放在房间中央转一圈OctoMap能明显看出桌面、椅背、墙壁这几个平面层效果很直观。Nav2导航流程看起来复杂拆开其实就四件事map_server加载二维地图AMCL做粒子滤波定位planner_server做全局路径规划controller做局部路径跟踪。AMCL定位一旦漂了导航就会乱跑所以里程计质量很关键。实测下来我这边让机器人从客厅导航到厨房门规划路径一两秒内出结果直线行驶和转弯都挺稳。这里有一个非常重要的经验Nav2的代价地图有2D和3D版本。如果开了3D体素代价地图激光雷达扫到桌面上凸起的物体会把这些悬空区域也标成障碍物机器人就会绕远路甚至觉得无路可走。家庭环境里我建议导航用的代价地图直接用激光雷达的2D数据OctoMap单独作为上层任务感知来用两者不要混在一起。3.3 机械臂抓取与“具身”闭环底盘能导航视觉能识别最后就差机械臂这一哆嗦了。我用的是六自由度舵机机械臂带一个二指夹爪通过串口控制和主板之间走简单的角度指令协议。机械臂运动规划用MoveIt2。流程是先用URDF描述机械臂模型再用MoveIt Setup Assistant生成配置包在Rviz2的Motion Planning插件里手动拖拽末端目标位姿验证无碰撞路径。我调通之后发现MoveIt2在RK3588上跑CPU版运动规划对常见的六轴臂来说规划时间基本在几十毫秒到几百毫秒之间完全够用。真正的难点在抓取闭环。流程是这样的YOLOv8在RGB图像里检测到目标比如一个杯子输出它的2D包围框中心坐标。深度相机取那个像素点的深度值得到它在相机坐标系下的三维位置。通过TF树把相机坐标系下的坐标变换到机械臂基座坐标系。MoveIt2规划机械臂末端移动到目标位置闭合夹爪完成抓取。这里有一个特别容易翻车的点相机和机械臂的相对位置关系。如果不做手眼标定坐标变换就是错的机械臂会一把抓空。我自己用的是eye-to-hand的安装方式相机固定在机械臂外部不动标定起来比eye-in-hand简单。标定时用OpenCV的棋盘格拍摄十几组图像解出相机到机械臂基座的变换矩阵整个标定过程半天以内能完成。抓取闭环实际跑起来之后体验还是很神奇的。你在机器人面前放一个水杯它识别、定位、伸臂、握住整个流程两秒左右完成。虽然速度离工业级还有距离但作为家庭服务机器人原型这个“看到东西并动手拿到”的能力也就是具身智能在硬件上最朴素的表现已经足够说明整套系统是通的。4. 常见问题与排查技巧实录4.1 系统安装与模型部署的典型报错先说环境类问题。Ubuntu 24.04装ROS2我的建议是暂时别碰。虽然ROS2新版本对24.04的支持在逐步推进但很多开发板的底层外设驱动、NPU工具链对24.04的适配还不完整。现在阶段RK3588开发板老老实实用Ubuntu 22.04ROS2 Humble踩坑的人最少。ROS2安装时遇到E: Unable to locate package ros-humble-desktop九成是universe源没开。按照前文2.2的顺序执行一遍问题就没了。NPU工具链方面最常见的报错是模型转换时提示算子不支持或者opset版本不对。排查思路很简单先把ONNX里所有算子的opset版本打出来对照当前rknn-toolkit2支持的算子表逐个确认。实在不支持的算子只能回模型里改结构或者换一个小一点的变体模型。还有一类问题是转换能通过但板端推理结果全乱。这个大概率是量化问题。我遇到过一次换成覆盖真实场景的量化数据集之后检测精度立刻恢复正常。4.2 硬件驱动相关的奇怪报错“RK3588 cant find suitable delayline”这个报错网上搜的人很多。我的理解是它一般出现在HDMI或者MIPI DSI这类高速显示接口上设备树里时钟相位配置不合适驱动找不到合适的延迟线参数。多数情况是接了某个不支持的外接显示器或MIPI屏导致的。我的经验是先把显示相关外设都断开看系统能否正常启动如果能再逐个接回来排查。作为机器人项目的主机其实很多时候不需要外接屏SSH上去操作就行这个问题可以绕过。另一个常见的坑是声卡。RK3588方案经常用ES8388这颗音频Codec系统起来后如果没声音多半是设备树里声卡节点没配好或者ALSA默认声卡设错了。可以用aplay -l看看识别到的声卡列表再用alsamixer调整默认声卡。如果要做语音交互这块值得花时间调但项目初期可以跳过先把视觉和导航调通再说。还有IMU。我用的是BMI088接线时I2C地址容易冲突确认板子上的地址跳线没接错。驱动起来之后在Rviz2里看IMU数据如果静止时数据还在乱飘先检查供电和接线再考虑标定。4.3 导航与感知的调试经验导航跑飞是常见问题我的排查顺序是先看里程计再看AMCL定位最后才看Nav2参数。里程计发飘先确认左右轮编码器方向对不对。如果接反了车直行时会画弧地图直接变形。再就是轮径标定我用的是前文3.1说的直行两米测试法误差控制到2%以内。AMCL定位失效的表现是Rviz2里粒子群发散机器人明明在客厅定位却跳到卧室。这个基本就是里程计误差累积造成的没有太好的捷径回去查底盘标定。八叉树地图更新慢是另一个容易被忽略的问题。深度相机的点云频率如果保持30Hz地图来不及更新CPU占用就上去了。我实测下来把点云频率降到5Hz体素尺寸从0.03米改到0.05米OctoMap的更新速度明显提升同时地图质量也没损失多少。还有YOLOv8推理慢的问题。先确认推理是不是真的跑在NPU上很多人用ONNX Runtime的CPU后端跑那当然慢。用RKNN Runtime加载.rknn模型只要转换正确速度基本就对了。我把这些典型问题整理成一张速查表方便大家对照现象常见原因解决方向apt找不到ros-humble-desktop未启用universe源启用universe源再updateRKNN模型转换算子报错ONNX opset版本过高导出时用opset 10或11NPU推理结果全乱量化数据集不合适换真实场景数据集重新转换cant find suitable delayline显示外设时钟配置异常断开显示设备排查用SSH操作声卡没声音ES8388设备树或默认声卡错误aplay -l查声卡alsamixer设默认底盘直行画弧编码器方向或轮径错误检查电机接线重新标定轮径导航时定位漂移AMCL粒子发散里程计累积误差回到底盘标定检查轮径轮距OctoMap更新慢点云频率过高或体素太小降频率到5Hz体素调到0.05米我个人在实际操作中的体会是这个项目里最耗时、也最容易被低估的不是某个单独的技术点而是各个模块之间的联调。比如YOLOv8单跑没问题机械臂单跑也没问题但放在一起相机一帧一帧识别机械臂一次一次定位抓取整个系统的稳定性就要靠一遍一遍实机跑才能磨出来。最后再分享一个小技巧整个项目过程里我每调通一个环节就会录制一段rosbag。后面出了问题回放bag就能排查不用反复把机器人搬回现场跑。这个习惯救了我好多次强烈建议你也养成。RK3588加ELF 2这套平台能做的事情还有很多先把“感知、决策、执行”这条闭环走通后面插语音大模型也好换更灵活的机械臂也好都会有底气得多。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门