2026 ROS 2 Lyrical 工程实例(三):让 AMR 真正搬起货物——视觉定位、SCARA 抓取与移动操作闭环
系列: 2026 ROS 2 Lyrical 工程实例
环境: Windows 11、WSL2、Ubuntu 26.04、ROS 2 Lyrical、Gazebo Sim 10.4、Nav2、AMCL、RViz2
项目名称:03-mobile-manipulator
完整代码: zephastra/robotics:03-mobile-manipulator
关键词: ROS 2、Lyrical、AMR、移动机械臂、SCARA、机器视觉、Nav2、Gazebo
前言
一台 AMR 能够建图、定位和导航之后,仍然只能解决“移动到哪里”的问题。要让它完成真正的搬运任务,还要回答更多问题:
货物在哪里?
机械臂应该移动到什么位置?
货物是否已经抓起?
运输过程中货物如何保持在车上?
到达目标区域后应该放在哪里?
任务完成后如何准确回到起点?
这意味着系统必须把底盘导航、相机定位、机械臂运动学、关节控制、抓取约束、任务状态和结果验收连接成一个闭环。
本次工程构建了一套独立的移动机械臂视觉搬运仿真:差速底盘先前往取料台,通过俯视 RGB 相机寻找蓝色物料,四自由度 SCARA 机械臂将物料抓起并放到车载托盘;随后底盘把物料运往目标台,机器人再次通过相机识别红色放置标记并完成卸货,最后返回起点并利用地面视觉标记进行精对位。
这里所说的“真正搬起货物”,指的是仿真中的物体会经历抓起、抬升、装载、随车运输、再次抓取和释放的完整物理状态变化,不是直接修改物体坐标制造动画效果。但本项目仍是仿真教学实例,并不等同于真实机械臂已经具备相同能力。
一、工程三是做什么的?
工程三是一套可以独立运行的 ROS 2 移动机械臂视觉搬运仿真。系统在 Gazebo 中构建差速移动底盘、四自由度 SCARA 机械臂、双指夹爪、车载托盘、俯视 RGB 相机以及取放工作台;使用 AMCL 与 Nav2 完成远距离移动,使用实际相机图像和相机内参计算近距离抓放位置,再通过解析逆运动学驱动机械臂完成取料、装车、运输、卸货和返航。整个任务带有超时、取消、速度联锁、失败报告与物理结果验收,不依赖前两个工程的文件或运行进程。
二、完整任务流程
工程默认执行一个物料配送任务:
起点 Home
↓
Nav2 导航到取料台附近
↓
RGB 相机寻找蓝色物料
↓
解析逆运动学计算关节目标
↓
SCARA 机械臂下降、夹取并抬升
↓
将物料放到车载托盘并固定
↓
Nav2 携货导航到目标台
↓
相机寻找红色放置标记
↓
从托盘重新抓取物料并放到目标位置
↓
Nav2 返回起点附近
↓
识别紫红色地面标记并精对位
↓
检查放置、返航和最终物理状态
任务配置位于 config/mission.yaml:
mission_id: material_delivery_003
source:
navigation: [1.5, 0.0, 0.0]
object_top_z: 0.75
table_center: [2.20, 0.0]
destination:
navigation: [1.5, 3.0, 0.0]
place_center: [2.20, 3.0, 0.70]
home: [0.0, 0.0, 0.0]
navigation_timeout: 240.0
wall_timeout: 900.0
object_size: 0.10
vision_timeout: 12.0
这里把底盘导航点和机械臂最终操作点分开了。机器人不需要让底盘精确停到货物中心,而是先停在机械臂能够覆盖的区域,再由相机重新测量目标相对于 base_link 的位置。
三、系统架构
完整的数据与控制链如下:
┌──────────────┐
静态地图 ──────────────► │ AMCL + Nav2 │
└──────┬───────┘
│ NavigateToPose
▼
任务执行器 ──行驶许可──► 速度联锁 ──► 差速底盘
│ ▲
│ │ JointState / 心跳
│
├──► RGB + CameraInfo ──► 颜色目标检测
│ │
│ ▼
│ 已知平面反投影
│ │
│ ▼
├──► SCARA 解析逆运动学 ──► 关节控制器
│
└──► 辅助抓取插件 ──► 抓取/托盘约束与物理验收
主要组件的职责如下:
| 组件 | 职责 |
|---|---|
| Gazebo Sim | 仿真场景、机器人动力学、传感器与货物物理状态 |
| ros_gz_bridge | 桥接时钟、里程计、激光、相机、关节和控制命令 |
| AMCL + Nav2 | 底盘定位、路径规划、局部控制和恢复行为 |
| Vision | 根据 RGB 图像、CameraInfo 与已知平面计算目标位置 |
| Kinematics | 完成 SCARA 正逆运动学和工作空间检查 |
| Mission | 串联导航、观察、抓取、装载、运输、放置和返航 |
| Runtime | 发布 TF、过滤本体激光回波并执行关闭式速度联锁 |
| GuardedGrasp | 在满足几何、夹爪和停车条件后建立辅助抓取约束 |
| Report | 保存任务阶段、检查结果、视觉数据、失败原因和最终状态 |
项目没有读取 Gazebo 中的底盘真实坐标来替代 AMCL,也没有读取货物真实坐标后直接控制机械臂。仿真真值只用于抓取约束判定、停车检查和最终验收。
四、项目目录结构
03-mobile-manipulator/
├── README.md
├── run_demo.sh # 一键构建、启动仿真并执行任务
├── CMakeLists.txt # 构建 Gazebo 辅助抓取插件
├── config/
│ ├── bridge.yaml # ROS 2 与 Gazebo 消息桥接
│ ├── mission.yaml # 取料、放置和返航任务参数
│ ├── nav2.yaml # AMCL、Costmap、Planner、Controller
│ └── view.rviz # RViz2 显示配置
├── description/
│ └── robot.urdf # 机器人几何和运动学树
├── worlds/
│ └── workcell.sdf # Gazebo 工作场景
├── maps/ # 静态地图
├── launch/
│ └── bringup.launch.py # Bridge、TF、AMCL 与 Nav2 启动
├── src/mobile_manipulator/
│ ├── mission.py # 完整任务状态与执行流程
│ ├── vision.py # 颜色检测与平面反投影
│ ├── kinematics.py # SCARA 正逆运动学
│ ├── runtime.py # TF、激光过滤与速度联锁
│ ├── scan_filter.py # 本体激光回波过滤
│ └── map_visual.py # RViz 兼容地图显示
├── src/plugins/
│ └── guarded_grasp.cc # 辅助抓取与物理验收插件
├── scripts/ # 环境、构建、测试和诊断脚本
├── tools/ # 资源生成与报告工具
├── tests/ # 自动化测试
└── docs/ # 架构、截图和实测证据
世界、地图和 URDF 由 tools/generate_assets.py 统一生成。调整机器人尺寸或场景后,应该修改生成器并重新生成,不要只修改生成结果,否则下一次启动可能覆盖手工修改。
五、克隆并启动项目
完整代码地址:
https://github.com/zephastra/robotics/tree/main/projects/03-mobile-manipulator
克隆仓库:
git clone https://github.com/zephastra/robotics.git
cd robotics/projects/03-mobile-manipulator
先检查环境:
bash scripts/doctor.sh
启动完整演示:
bash run_demo.sh
脚本会自动完成以下工作:
- 加载 ROS 2 Lyrical 与本项目环境;
- 生成机器人、场景、地图与 Bridge 配置;
- 编译 Gazebo 辅助抓取插件;
- 启动 Gazebo;
- 启动 ros_gz_bridge、TF、静态地图、AMCL 与 Nav2;
- 启动 RViz2;
- 自动执行一次完整搬运任务;
- 保存日志、相机画面与 JSON 报告。
首次 CMake 配置可能需要几分钟。任务执行期间不要再从 RViz2 手动发送 Nav2 Goal,否则可能干扰任务执行器正在管理的目标。
任务完成后,仿真场景会保留,方便检查最终状态。按 Ctrl+C 关闭本次脚本启动的进程。
当前仓库发布的是首个公开仿真版本,已经在作者本机环境完成验证,但从空白系统安装全部依赖及跨机器复现尚未完成。因此现阶段不能保证每台电脑克隆后都能直接运行。
六、远距离移动交给 Nav2
任务执行器使用 NavigateToPose Action 向 Nav2 提交目标:
request = NavigateToPose.Goal()
request.pose.header.frame_id = "map"
request.pose.pose.position.x = float(target[0])
request.pose.pose.position.y = float(target[1])
request.pose.pose.orientation.z = math.sin(target[2] / 2)
request.pose.pose.orientation.w = math.cos(target[2] / 2)
future = nav_client.send_goal_async(request)
当前导航配置使用:
- AMCL 静态地图定位;
- NavFn 全局规划器;
- Regulated Pure Pursuit 局部控制器;
- 期望线速度
0.25 m/s; map → odom → base_link标准坐标链;- Local 和 Global Costmap 共同处理静态地图与激光障碍物。
Nav2 负责把底盘送到工作台附近,但它不负责计算夹爪应该落在哪里。真正进入抓放阶段以前,任务执行器会停止底盘并重新观察目标。
这一层次划分非常重要:
Nav2:解决米级范围内“怎样到达工作区域”
视觉:解决近距离“目标相对机器人在哪里”
机械臂:解决“各关节应该运动到什么位置”
七、RGB 相机如何计算抓取位置?
相机固定在底盘上方,垂直向下观察工作台。系统订阅:
/camera/image_raw
/camera/camera_info
视觉处理首先把 RGB 图像转换到 HSV 空间,再根据任务阶段检测蓝色物料、红色放置标记或紫红色返航标记。
核心检测流程如下:
RGB 图像
↓
HSV 颜色阈值
↓
连通域分析
↓
拒绝面积太小的噪声
↓
要求画面中只有一个有效目标
↓
检查目标没有被图像边缘裁剪
↓
计算目标中心像素 (u, v)
当前相机在 base_link 下的位置为:
(CAMERA_X, CAMERA_Y, CAMERA_Z) = (0.30, 0.0, 1.80)
已知目标位于水平工作台上,就可以利用相机内参把像素射线与该平面求交。简化后的计算为:
height = CAMERA_Z - target_plane_z
x = CAMERA_X - (v - cy) * height / fy
y = CAMERA_Y - (u - cx) * height / fx
其中:
fx、fy:相机焦距参数;cx、cy:图像主点;u、v:目标中心像素;target_plane_z:已知桌面或目标表面的高度;x、y:目标在base_link下的平面位置。
为了避免单帧噪声,任务不会检测一次就立即抓取。当前实现要求获得四个新鲜画面样本,检查测量波动不超过阈值,再取中位数作为最终结果。相机画面超过一秒未更新时也不会继续沿用旧数据。
实际取料画面如下:

必须强调,这不是通用机器视觉系统。它依赖:
- 颜色明确的单个目标;
- 已标定的俯视相机;
- 已知且水平的支撑平面;
- 固定的工作场景;
- 目标没有严重遮挡。
它不支持任意物体检测、未知桌面高度、倾斜物体、深度估计或六自由度抓取位姿。
八、SCARA 解析逆运动学
机械臂由肩关节、肘关节、升降轴和腕关节组成,平面两段臂长为:
L1 = 0.42
L2 = 0.40
对于目标位置 (x, y, z),先计算肘关节:
c = (x² + y² - L1² - L2²) / (2 × L1 × L2)
elbow = acos(c)
再计算肩关节:
shoulder = atan2(y, x)
- atan2(L2 × sin(elbow), L1 + L2 × cos(elbow))
垂直方向由 Prismatic Joint 完成:
lift = z - TCP_Z_ZERO
最后使用腕关节补偿末端方向:
wrist = target_yaw - shoulder - elbow
实现中会先判断:
- 输入是否包含
NaN或无穷值; c是否位于[-1, 1];- 升降轴是否超出
0~0.55 m行程; - 目标是否位于机械臂工作空间。
不可达目标会直接产生失败,而不是把它强行裁剪到某个“看起来接近”的位置继续执行。
九、机械臂如何避免拖着货物横向扫过?
本工程没有使用 MoveIt 进行完整碰撞规划,而是针对固定工作台场景采用受限动作:
张开夹爪
↓
保持高位移动到目标上方
↓
垂直下降
↓
闭合夹爪并确认抓取
↓
垂直抬升
从托盘取放和向目标台放置时也遵循:
升高 → 平移 → 下降
每次机械臂运动前,任务执行器都会确认:
- 当前不处于行驶状态;
- 底盘实际速度低于阈值;
- 目标位于工作空间;
- JointState 持续更新。
关节目标发布后,程序不会简单等待固定秒数,而是检查实际反馈:
abs(actual_position - target_position) < 0.012
等待过程中每隔约 0.15 s 刷新一次绝对目标,降低启动阶段 DDS 或 Bridge 尚未完成发现时丢失单次命令的影响。关节在规定时间内无法到位,任务会超时失败并停止,而不是继续进入下一步。
这种方法适合当前受约束场景,但不是通用避障规划。改变工作台位置、在机械臂工作范围内增加障碍物或随意修改目标点,都需要重新验证动作是否安全。
十、抓取不是“修改物体坐标”
很多仿真演示为了让画面顺利,会在抓取时直接修改物体坐标,让货物跟着夹爪移动。这样能够生成动画,却没有验证夹爪是否真正到达了货物附近。
本项目没有使用 set_pose 搬运货物,而是实现了 GuardedGrasp Gazebo 插件。它只在满足以下条件时允许建立固定刚体约束:
货物距离夹爪参考点不超过 4.5 cm
+
双指夹爪已经闭合
+
底盘已经停止
↓
创建 DetachableJoint 固定约束
如果条件不满足,插件会返回明确原因,例如:
base_moving
outside_capture_volume
fingers_not_closed
already_held
holder_mismatch
任务开始时还会尝试进行一次远距离抓取自检,确认货物不在夹爪附近时,系统会拒绝“隔空抓取”。
不过这仍然属于辅助抓取模型。货物被抓住后使用固定约束保持,不是依靠夹爪接触面、摩擦力和力矩闭环完成的纯物理夹持。文章和项目都不应把它描述成已经实现工业级抓取仿真。
十一、为什么运输阶段还需要车载托盘?
机械臂长时间伸出并夹着货物行驶,会扩大机器人轮廓、改变重心,还可能让夹爪进入 LiDAR 扫描平面。因此本工程采用“抓取后装车”的流程:
机械臂抓起物料
↓
放到车载托盘
↓
确认货物位于托盘附近
↓
建立托盘运输约束
↓
机械臂收拢
↓
底盘获得行驶许可
到达目标台后执行相反流程:
停止底盘
↓
解除托盘运输约束
↓
机械臂从托盘重新抓取
↓
相机定位红色标记
↓
将货物放到目标台
托盘固定同样有距离条件,只有货物确实已经放到托盘附近时才能建立约束。
十二、两段式返航:Nav2 粗定位加视觉精对位
Nav2 返回目标点成功,不代表机器人实际位置一定与理想起点完全重合。里程计、AMCL、局部控制器和目标容差都会带来误差。
如果只需要回到充电区域,Nav2 的精度通常已经足够。但如果下一步需要对接充电触点、传送机构或固定工装,还需要最后一段精对位。
本工程在起点前方 0.70 m 处放置一个紫红色长方形标记:

返航流程分为两段:
第一段:Nav2 返回起点附近并大致对准方向
↓
第二段:相机识别矩形标记的位置与长轴方向
↓
计算相对于理想位置的位置误差和角度误差
↓
通过当前 TF 转换为新的 map 坐标目标
↓
Nav2 执行小幅修正,并重新观察
系统最多执行三次导航修正,每次修正后都重新获取相机画面。当位置误差和方向误差都小于阈值时,才标记视觉对位完成。
矩形长轴的方向存在 180° 对称性,所以粗导航必须已经让机器人基本朝向正确方向。视觉精对位负责修正最后的小误差,不负责从完全相反的朝向恢复。
这一设计没有读取 Gazebo 底盘真值来修改机器人坐标。相机负责测量,TF 负责坐标转换,Nav2 仍通过正常速度指令完成移动。
十三、底盘与机械臂之间的关闭式联锁
移动机械臂最危险的状态之一,是机械臂仍在外伸或正在抓取时,底盘突然开始导航。
本工程没有让 Nav2 直接控制最终 /cmd_vel,而是增加了一层独立联锁:
Nav2
↓
/nav_cmd_vel
↓
速度联锁
↓
/cmd_vel
↓
Gazebo 差速底盘
只有下面的条件同时成立,导航速度才会被转发:
- 任务执行器明确允许行驶;
- 机械臂已经回到收拢位置;
- 行驶许可心跳仍然新鲜;
- JointState 仍然新鲜;
- Nav2 速度消息仍然新鲜。
任意条件不满足,联锁节点都会输出零速度:
okay = (
drive_permitted
and arm_is_stowed
and permit_is_fresh
and joint_state_is_fresh
and velocity_command_is_fresh
)
cmd_vel.publish(nav_command if okay else Twist())
这种设计是“关闭式”的:任务进程退出、心跳中断、关节状态停止更新或者机械臂未收拢时,默认结果都是不允许移动。
这只是教学仿真中的软件联锁,不是经过认证的工业安全功能。真实设备仍然需要急停、安全 PLC、驱动器 STO、区域扫描和符合规范的风险评估。
十四、取消、超时与失败处理
工程提供取消服务:
ros2 service call /mission/cancel std_srvs/srv/Trigger
取消发生后,系统会:
- 取消当前 Nav2 Goal;
- 撤销底盘行驶许可;
- 输出零速度;
- 将任务状态记录为
CANCELLED; - 保留当前货物的附着状态。
取消时不自动释放货物,是为了避免夹爪或托盘上的物体突然掉落。重新执行任务前应该启动一个新场景,而不是在未知物理状态下继续旧任务。
其他失败策略包括:
| 异常 | 处理方式 |
|---|---|
| 找不到目标 | 保存失败画面,停止任务 |
| 同时识别到多个目标 | 拒绝使用不明确结果 |
| 视觉数据过期或不稳定 | 等待新帧,超时后失败 |
| 目标超出机械臂工作空间 | 拒绝执行 |
| 关节无法到位 | 超时并停止 |
| Nav2 拒绝目标或导航失败 | 停止并记录结果 |
| 抓取条件不满足 | 返回具体拒绝原因 |
| 任务进程或心跳失联 | 速度联锁输出零速度 |
当前策略强调安全停止和可诊断报告,不承诺自动恢复所有异常。
十五、任务报告如何证明“真的完成了”?
每次运行都会创建独立目录:
logs/<run-id>/
reports/<run-id>/
其中:
logs/保存构建、Gazebo、ROS/Nav2、RViz 和任务日志;mission.json保存任务状态、阶段、检查结果和最终物理状态;- PNG 文件保存任务实际使用的相机画面。
任务只有在下列检查全部通过后才会写入 COMPLETED:
拒绝远距离隔空抓取
取料后货物实际抬升
货物实际装上托盘
货物随车到达目标台
机械臂从托盘再次抓起
货物在目标位置释放并保持稳定
返航视觉精对位完成
底盘实际回到起点范围
查看最近一次任务摘要:
python3 tools/report_summary.py
这种报告比“Gazebo 画面看起来跑完了”更可靠。发生失败时,它可以回答机器人停在哪个阶段、为什么失败、最终货物在哪里以及底盘是否已经停止。
十六、测试与本机实测结果
运行不启动仿真的自动测试:
bash scripts/test.sh
当前测试基线为:
28 passed
测试覆盖:
- SCARA 正逆运动学与工作空间边界;
- 颜色目标检测、缺失目标和多目标拒绝;
- 矩形返航标记方向计算;
- 轮轴与机械臂速度上限分离;
- LiDAR 本体回波过滤和真实近距离障碍保留;
- 底盘速度联锁与消息新鲜度;
- 工程资源独立性;
- RViz 兼容地图几何。
无界面完整仿真:
MM_HEADLESS=1 MM_AUTO_EXIT=1 bash run_demo.sh
取消停车测试:
bash scripts/test_integration.sh cancel
当前仓库归档的本机验证结果如下:
| 验证项目 | 结果 |
|---|---|
| 自动化测试 | 28 passed |
| 无界面完整任务 | COMPLETED,约 157 秒 |
| 带 Gazebo/RViz 完整任务 | COMPLETED,约 345 秒 |
| 无界面取消测试 | PASS |
| 图形界面取消测试 | PASS |
| 无界面放置水平误差 | 约 1.6 cm |
| 图形界面放置水平误差 | 约 1.5 cm |
| 无界面返航水平误差 | 约 3.5 cm |
| 图形界面返航水平误差 | 约 3.0 cm |
这些数字是两次归档仿真的单次测量结果,不是长期成功率统计,也不是对真实硬件精度的承诺。跨机器复现和从空白系统安装依赖的验证仍待补充。
十七、诊断模式与常见问题
1. 只启动场景,不自动执行任务
MM_DIAGNOSTIC_ONLY=1 bash run_demo.sh
这个模式适合单独检查相机、LiDAR、TF、JointState 和 Nav2。
2. 新终端看不到项目 Topic
本工程默认使用:
ROS_DOMAIN_ID=43
GZ_PARTITION=mobile_manipulator_003
另一个终端必须先加载同一环境:
cd /path/to/robotics/projects/03-mobile-manipulator
source scripts/env.sh
ros2 topic echo /mm/status
3. 提示工程已经运行
run_demo.sh 会为当前 ROS Domain 建立锁,防止两个实例互相干扰。先回到原终端按 Ctrl+C,确认旧实例退出后再重新启动。
4. 一直等待相机标定
检查:
ros2 topic hz /camera/image_raw
ros2 topic echo --once /camera/camera_info
本工程使用 Gazebo 实际发布的 /mm/camera_info 作为 Bridge 来源。相机图像存在,不代表 CameraInfo 一定桥接正确。
5. 关节目标超时
检查:
ros2 topic hz /joint_states
ros2 topic echo /joint_states
如果垂直升降轴无法保持高度,还要检查移动质量、力上限、PID 与重力补偿。不要只增加固定等待时间。
6. Costmap 中有障碍物跟着机器人移动
同时在 RViz2 中观察 /scan_raw 和 /scan。相机立柱、升降柱或处于扫描高度的夹爪可能被 LiDAR 当成障碍物。本工程会按照当前几何进行过滤;修改机械结构或雷达位置后,必须同步调整过滤几何。
7. RViz 的传统 Map 显示出现纹理着色器错误
项目默认使用 Map (compatible geometry) 显示同一份 OccupancyGrid 数据。它只替换 RViz 的显示方式,不修改 Nav2 使用的地图。
十八、项目边界与下一步升级
这个版本已经打通移动操作闭环,但仍然有非常明确的边界:
- 只处理单个物料和单次任务;
- 视觉依赖颜色标记与已知水平面;
- 没有 RGB-D、点云分割或六自由度姿态估计;
- 机械臂使用解析逆运动学,不使用 MoveIt 场景碰撞规划;
- 抓取与托盘运输使用受条件保护的固定约束;
- 没有实现摩擦接触夹持和力控抓取;
- 没有经过长期重复运行的成功率统计;
- 没有验证实体硬件、多机器人和工业安全。
向真实系统演进时,可以按照下面的顺序升级:
- 使用 RGB-D 相机和深度点云替代已知平面假设;
- 增加手眼标定与相机外参在线校验;
- 使用目标检测、分割或姿态估计替代单纯颜色阈值;
- 使用 MoveIt 2 构建 Planning Scene 与碰撞规划;
- 使用 ros2_control 接入真实关节驱动与反馈;
- 增加夹爪电流、力矩或触觉反馈;
- 增加任务重试、断点恢复和多物料队列;
- 增加真实急停、安全控制器和区域防护。
升级时仍然可以保留当前工程的分层思想:
Nav2 负责底盘移动
视觉负责目标测量
运动学/规划器负责机械臂轨迹
任务执行器负责步骤与失败处理
独立安全层决定动作是否允许执行
十九、总结
工程实例(三)完成了从“AMR 到达目标区域”到“移动机器人完成物料操作”的升级。
本项目实现了:
- 独立的 Gazebo 移动机械臂与工作台场景;
- AMCL 与 Nav2 底盘定位导航;
- 基于 RGB 图像、CameraInfo 和已知平面的目标定位;
- 四自由度 SCARA 解析正逆运动学;
- 受限的“升高—平移—下降”抓放动作;
- 带距离、夹爪和停车检查的辅助抓取约束;
- 车载托盘装载与运输;
- Nav2 粗返航与视觉精对位;
- 机械臂收拢、消息新鲜度和任务心跳组成的速度联锁;
- 取消、超时、失败报告和物理结果验收;
- 自动化测试、无界面仿真和图形界面实测证据。
它最重要的价值并不是“画面中有一台机械臂把方块搬走”,而是建立了一条能够解释、检查和失败的完整链路:
导航到站
↓
真实相机测量
↓
运动学求解
↓
关节反馈到位
↓
有条件抓取
↓
运输与放置
↓
视觉返航对位
↓
独立结果验收
当每一步都有输入、条件、反馈和失败出口时,移动机械臂才从一段仿真动画变成一个可以继续测试和扩展的工程实例。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)