移动抓取机器人从 0 到 1:雷达导航、深度相机识别、机械臂自主抓取一次讲清
移动抓取机器人从 0 到 1雷达导航、深度相机识别、机械臂自主抓取一次讲清项目配套仓库https://github.com/lelala271/mobile-manipulation-nav-grasp这篇文章讲清一个完整移动抓取机器人系统怎么拆、怎么连、怎么部署、怎么联调。GitHub 仓库用于持续维护工程文档、源码目录、配置模板、启动文件、故障排查表和后续示例代码。0. 这篇文章解决什么问题很多移动抓取项目一开始会被简单描述成“给移动小车加一个机械臂”。这个说法能帮助理解外观但不能指导工程实现。真正做系统时问题会立刻变复杂小车能导航不代表能停在机械臂可抓的位置。 相机能识别目标不代表能输出机械臂可用的三维坐标。 机械臂能运动不代表能根据视觉目标自动抓取。 单个模块能跑不代表整套系统能自主完成任务。移动抓取机器人至少包含四条主线主线解决的问题典型模块底盘导航机器人怎么从当前位置移动到抓取区域地图、定位、Nav2、cmd_vel雷达避障移动过程中如何感知障碍、规划路径和避障激光雷达、SLAM、代价地图RGB-D 感知目标在图像中哪里、在三维空间哪里RGB 图、Depth 图、相机内参、点云机械臂抓取末端怎么到目标点并完成夹取IK、轨迹规划、夹爪、MoveIt任务状态机什么时候导航、什么时候识别、什么时候抓、失败后怎么办Behavior Tree、Action、自定义状态机一句话结论自主抓取不是一个单独算法而是导航、三维感知、手眼标定、逆运动学、轨迹规划、夹爪控制和任务状态机共同构成的系统工程。本文按工程落地顺序讲先分清系统结构 再讲雷达导航链路 再讲深度相机三维定位 再讲机械臂逆解抓取 再讲 ROS 2 部署和联调 最后给排错表和 GitHub 仓库组织方式1. 系统总览移动抓取到底由哪些部分组成移动抓取机器人可以按“感知、定位、规划、执行、任务编排”理解。任务目标任务状态机底盘导航地图 / 定位 / 路径规划 / 避障抓取决策目标筛选 / 抓取位姿 / 失败恢复激光雷达SLAM / 定位里程计IMU/cmd_vel移动底盘RGB-D 深度相机目标检测深度图 / 点云三维定位手眼标定坐标转换逆运动学轨迹规划机械臂夹爪图 1移动抓取系统总结构。雷达解决底盘导航问题深度相机解决目标三维定位问题机械臂解决局部操作问题任务状态机把所有动作串成闭环。完整任务链路可以写成下面这条流程雷达建图或加载地图 - 底盘定位 - 导航到抓取区域 - 深度相机采集 RGB 和 Depth - 目标检测输出二维框 - 深度图提供目标距离 - 相机内参完成像素反投影 - 手眼标定把目标转到机械臂基座坐标系 - 抓取策略生成预抓取位姿和抓取位姿 - IK 求解关节角 - 轨迹规划生成可执行路径 - 夹爪闭合 - 抬升验证 - 导航到放置区 - 放置并回安全位这条链里任何一段缺失系统都只能算局部功能可用不能叫完整自主抓取。2. 先把容易混淆的概念分清机器人系统最怕“名词混用”。下面这张表先把核心概念分开名词它是什么它不是什么在系统中的位置ROS 2机器人中间件负责节点通信、参数、TF、Action 等不是导航算法也不是机械臂算法系统通信骨架TF坐标变换系统不是普通日志也不是可选配置所有几何计算的基础CartographerSLAM 建图和位姿估计算法不是完整自主导航框架雷达建图模块Nav2ROS 2 导航框架不是目标检测算法底盘导航与避障AMCL静态地图定位算法不是在线建图算法已有地图中的定位RGB-D 相机同时输出彩色图和深度图的相机不直接控制底盘或机械臂目标三维定位手眼标定求相机坐标系与机械臂坐标系的关系不提升检测模型精度坐标统一IKInverse Kinematics逆运动学不等于完整轨迹规划末端位姿到关节角MoveIt机械臂运动规划框架不负责底盘导航IK、规划、碰撞检测任务状态机编排导航、识别、抓取、放置和失败恢复不是单个算法模型系统总控如果只能记一句雷达让车知道怎么走深度相机让系统知道目标三维位置机械臂负责局部操作状态机负责把它们按顺序组织起来。3. 雷达导航链路它解决“车怎么过去”雷达在移动抓取系统中的主要作用是服务移动底盘而不是识别要抓的物体。雷达导航链路通常包含激光雷达驱动 - 里程计 / IMU - TF - SLAM 建图 - 地图保存 - 静态地图定位 - 全局路径规划 - 局部避障 - 底盘速度控制3.1 SLAM 解决什么SLAM 是 Simultaneous Localization And Mapping同步定位与建图。机器人在未知环境移动时一边估计自己在哪里一边建立环境地图。常见 2D SLAM 输入/scan激光扫描 /odom轮速里程计 /imuIMU可选 /tf传感器和底盘坐标关系常见输出/map地图 map - odom全局修正 机器人轨迹Cartographer 的核心思想是局部 SLAM 负责实时扫描匹配和子图构建 全局 SLAM 负责回环检测和位姿图优化它擅长建图和位姿估计但它不负责完整导航行为。导航到目标点、局部避障、速度控制通常交给 Nav2。3.2 Nav2 解决什么Nav2 是 ROS 2 生态里的导航框架。它负责加载地图 在地图中定位 生成全局路径 根据局部障碍实时避障 输出 /cmd_vel 控制底盘 用行为树组织导航流程Nav2 常见组件组件作用map_server加载并发布静态地图amcl在静态地图中定位planner_server生成全局路径controller_server跟踪路径并输出速度behavior_server执行恢复行为bt_navigator使用行为树组织导航lifecycle_manager管理节点生命周期在移动抓取中Nav2 的职责边界要明确Nav2 只负责把底盘送到抓取区域附近 是否开始抓取要由任务状态机结合视觉和机械臂状态判断3.3 导航阶段验收标准雷达导航链路至少要满足地图没有明显重影 机器人定位和真实位置一致 全局路径合理 局部代价地图能看到障碍 底盘能稳定到达抓取区域 到点后姿态误差在可接受范围内底盘到点精度非常重要。机械臂工作空间有限如果底盘停得太远目标即使识别正确也可能不可达。4. 深度相机链路它解决“目标三维位置在哪里”深度相机不是底盘底层控制模块。它在自主抓取中的核心价值是把二维视觉结果转换成机械臂能使用的三维目标点。4.1 RGB 检测只能得到二维信息目标检测模型通常输出类别 class 置信度 confidence 二维框 bbox例如class bottle confidence 0.91 bbox [u_min, v_min, u_max, v_max]这只能说明目标在图像中的位置不能直接用于机械臂抓取。机械臂需要的是目标在 arm_base_link 坐标系下的 x, y, z 抓取方向 预抓取点 抓取点 夹爪开口 抬升方向4.2 深度图提供距离深度图每个像素存储该像素对应空间点的距离。检测到目标框后不能简单取框中心点深度因为框中心可能是空洞、反光点、边缘或背景。更稳的处理方式取目标框中心区域 ROI 过滤深度为 0 或 NaN 的像素 过滤过近和过远的异常值 取中位数或截尾均值 得到目标代表深度中位数常比均值更稳因为它不容易被少量异常深度拉偏。4.3 像素反投影把二维点变成三维点相机内参通常包含fx, fy焦距 cx, cy主点像素点(u, v)和深度Z可以反投影到相机坐标系X (u - cx) * Z / fx Y (v - cy) * Z / fy Z depth这一步之后得到的是相机坐标系下的三维点不是机械臂坐标系下的点。4.4 手眼标定把相机坐标转成机械臂坐标机械臂通常以arm_base_link为基准执行运动。相机输出的是camera_color_optical_frame或类似坐标系下的目标点。两者必须通过手眼标定建立变换关系P_arm_base T_arm_base_camera * P_camera常见两种安装方式类型相机安装位置优点难点eye-to-hand相机固定在底盘、支架或外部位置视野稳定适合先识别再抓取相机和机械臂外参必须准确eye-in-hand相机固定在机械臂末端可近距离二次定位标定和运动补偿更复杂如果手眼标定错了表现通常是目标点左右反 目标高度不对 机械臂总是抓偏固定距离 目标明明可见但转换后不可达5. 机械臂链路它解决“怎么抓”机械臂抓取不是“给一个点就过去”。完整抓取至少包括目标可达性判断 抓取姿态生成 逆运动学求解 轨迹规划 碰撞检测 夹爪闭合 抓取结果验证 失败恢复5.1 正运动学和逆运动学正运动学 FK输入关节角 输出末端位姿逆运动学 IK输入末端目标位姿 输出关节角抓取时视觉系统先给出目标位姿所以机械臂需要 IK。IK 可能失败常见原因目标超出机械臂工作空间 末端姿态约束太严格 关节限位冲突 机械臂接近奇异位形 碰撞检测不允许该姿态5.2 IK 有解不等于能执行IK 只说明某个末端位姿可能对应一组关节角不代表机械臂能安全从当前位置运动过去。真正执行前还要做轨迹规划和碰撞检测。轨迹规划需要考虑机械臂自身碰撞 机械臂与底盘碰撞 机械臂与环境碰撞 关节速度限制 关节加速度限制 末端路径是否穿过障碍5.3 抓取动作要拆阶段建议抓取流程拆成阶段作用Home回到安全初始姿态Pre-grasp到达目标前方或上方的预抓取位Approach低速接近目标Close夹爪闭合Lift抬升并判断是否抓稳Retreat撤离到安全运输姿态Place到放置区打开夹爪阶段化设计的好处是失败时知道失败发生在哪一步。识别失败、IK 失败、夹爪失败、放置失败对应的恢复动作完全不同。6. ROS 2 工程结构建议一个可维护的工程不应该把所有逻辑写在一个脚本里。建议按模块拆包mobile_manipulation_ws/ ├── src/ │ ├── navigation_bringup/ │ ├── perception_3d/ │ ├── arm_bringup/ │ ├── grasp_planner/ │ └── task_manager/ ├── maps/ ├── calibration/ ├── model_weights/ ├── config/ └── launch/模块职责包职责navigation_bringup底盘、雷达、SLAM、Nav2 启动perception_3d目标检测、深度处理、三维定位arm_bringup机械臂驱动、夹爪驱动、MoveIt 启动grasp_planner抓取点和抓取姿态生成task_manager导航、识别、抓取、放置状态机6.1 话题、服务、Action 怎么选通信方式适合内容示例Topic高频连续数据图像、雷达、里程计、关节状态Service短请求短响应保存地图、切换模式、查询状态Action耗时任务有反馈可取消导航到点、执行抓取、机械臂轨迹自主抓取建议设计成 Action因为它包含多个耗时阶段需要反馈和取消。7. 推荐部署路线推荐主线Ubuntu 22.04 ROS 2 HumbleROS 2 Humble 安装参考官方文档ROS 2 Humble Ubuntu 安装文档常用工作空间编译流程mkdir-p~/mobile_manipulation_ws/srccd~/mobile_manipulation_ws rosdepinstall--from-paths src --ignore-src-r-ycolcon build --symlink-installsourceinstall/setup.bash常用检查命令ros2nodelist ros2 topic list ros2 topic hz /scan ros2 topicecho/odom ros2 run tf2_tools view_frames8. 联调顺序不要一开始就全系统一起跑。推荐按下面顺序验收底盘能响应/cmd_vel。雷达能稳定发布/scan。里程计和 TF 正常。建图成功并能保存地图。Nav2 能在静态地图中导航到指定点。深度相机 RGB、Depth、CameraInfo 正常。目标检测能稳定输出二维框。深度反投影输出目标三维点。手眼标定能把目标点转到机械臂基座坐标。机械臂能对固定点执行抓取。IK 和轨迹规划可用。任务状态机串联导航、识别、抓取和放置。这个顺序的核心思想是先局部闭环 再模块联调 最后做全系统闭环9. 常见问题排查表现象常见原因检查方法解决方向地图重影TF 错、时间不同步、里程计跳变看 TF 树、看/odom是否连续修 TF、同步时间、降低建图速度导航能规划但不走/cmd_vel没到驱动、Nav2 未激活ros2 topic echo /cmd_vel检查 remap 和 lifecycle机器人贴墙footprint 太小、膨胀半径太小看 costmap调整 footprint 和 inflationRGB 正常但深度无效相机参数或对齐模式错误看 Depth 图和 CameraInfo修相机启动参数识别到目标但抓不到只有二维框没有三维坐标或手眼标定打印目标点和 TF加深度反投影和坐标转换目标点左右反optical frame 用错检查相机坐标系区分camera_link和光学坐标系IK 无解目标不可达、姿态约束过严RViz 显示目标点调整底盘站位或抓取姿态轨迹规划失败碰撞模型错误、关节状态不同步看 PlanningScene修 URDF/SRDF 和 joint state抓取后掉落抓取点不对、夹爪力不足看抓取视频和夹爪状态调整抓取策略和夹爪参数单模块正常全系统失败状态机缺等待、超时和恢复看任务日志时间线明确每个状态的成功和失败条件10. GitHub 仓库应该放什么CSDN 适合讲清路线GitHub 适合维护工程。推荐仓库包含mobile-manipulation-nav-grasp/ ├── README.md ├── docs/ │ ├── csdn/ │ ├── architecture/ │ ├── deployment/ │ └── troubleshooting/ ├── src/ │ ├── navigation/ │ ├── perception/ │ ├── manipulation/ │ └── task_manager/ ├── config/ ├── launch/ ├── scripts/ └── assets/这个结构的好处CSDN 负责讲清整体思路 GitHub 负责维护源码、配置、脚本、图片和后续更新 读者先读文章建立理解再进仓库看工程细节项目配套仓库https://github.com/lelala271/mobile-manipulation-nav-grasp11. 最终记忆表问题结论雷达做什么建图、定位、导航、避障深度相机做什么把目标从二维图像变成三维坐标机械臂做什么IK、轨迹规划、夹爪抓取手眼标定做什么统一相机坐标系和机械臂坐标系Nav2 做什么路径规划、局部避障、速度输出Cartographer 做什么SLAM 建图和位姿估计MoveIt 做什么机械臂运动规划和碰撞检测状态机做什么串联完整任务并处理失败最后用一句话收束移动抓取系统的关键不是堆算法名而是让导航、感知、坐标、机械臂规划和任务状态机形成可靠闭环。12. 参考资料ROS 2 Humble Ubuntu 安装文档ROS 2 TutorialsNavigation2 官方文档Cartographer ROS 文档Cartographer ROS 算法讲解Cartographer ROS 配置文档MoveIt 2 官方文档

相关新闻