【NexArm ROS机械臂】夹取偏差调整:从现象定位到补偿原理

产品图示

适用于产品 : JETSON NANO机械手臂NexArm树莓派5 深度AI视觉大模型 ROS机器人

前言

这篇帖子解决一个很具体的问题:机械臂能识别到色块,但夹下去总是偏一点——要么偏左偏右,要么啃到方块边缘,要么高度不对压不住。 很多人的第一反应是去改代码里的坐标,结果越改越乱。真正有效的做法是先判断偏差属于哪一层,再动对应的那一组参数。
下面这套内容来自 NexArm(Pi5)官方使用手册的「1.9 物品夹取调节方法」,以及仓库里 src/app/config/calibration.yaml、src/app/app/calibrated_pose.py 的实际实现。读完你应该能做到:看着夹取结果,就知道该调 X 还是 Y、该改偏移还是改缩放。

开始前的三个前提:机械臂底座必须用 G 字夹固定在桌面(手册明确要求,底座晃动会直接导致偏差且可能倾倒);使用与当前沙盘一致的场景(scene_0 到 scene_5);调完参数一定要点「保存」并「复位」再抓一次,否则你看到的是旧参数的效果。

一、先判断偏差属于哪一层

偏差不是一种病,是四种。对症才能下药,调错了只会把问题挪到别处。

你看到的现象 真正的原因 该动的地方
整块都偏,换个位置也偏同样的量 视觉坐标到机械臂坐标的原点没对齐 像素定位(或深度定位)里的 X/Y 偏移
中间准,越靠边越偏,夹爪只夹到方块一角 尺度不对,误差随距离放大 对应的 缩放,主要是 Y 缩放
水平对了,但夹爪高了压不住、或低了撞块 抓取高度是写死的值,需要补偿 Z 方向的偏移
整个臂的姿态就歪,六个方向都偏 连杆参数或舵机零位偏了 运动学校准,或舵机「校准中位」

判断顺序建议从下往上:先排除最底层的机械与运动学问题,再调视觉补偿。否则你在偏移上改了半天,实际是臂长参数错了。

二、 坐标是怎么算出来的

要理解为什么「偏移」和「缩放」是两个旋钮,得先看识别到抓取之间发生了什么。源码里的链路是这样的(calibrated_pose.py):

  1. 像素反投影。用相机内参和标定得到的外参矩阵,把图像上点中的那个像素反投影成相机坐标系下的三维点。
  2. 转到沙盘坐标系。乘上白区(沙盘工作区)的位姿矩阵,把点换到以地图为基准的局部坐标。这一步依赖地图上那个标签码——手册里说它是「机械臂位置校准时的参照物」,就是这个用途。
  3. 高度被写死。代码里有一行 position[2] = float(height),默认 height=0.02,也就是抓取时 Z 永远按 20 mm 算,不再相信视觉测到的高度。这就是为什么 Z 方向必须靠偏移补——它本来就不是测出来的。
  4. 仿射补偿。最后过一遍校准函数,把偏移和缩放作用到坐标上,再交给逆运动学解出六个舵机的脉宽。

先按比例缩放,再整体平移。公式里 scale 解决「量级对不对」,offset 解决「原点在哪」,两者是乘法与加法关系,所以必须按顺序调——中心没对准之前调缩放,等于在错误基准上量比例。

三、 六个参数,三组通道

打开位置调节工具,右下角有六个输入框:定位 X/Y/Z 偏移、定位 X/Y/Z 缩放。它们不是存在一个地方,而是分成三组独立通道,分别管三种抓取方式:

通道 管什么 当前出厂值(offset)
pixel RGB 图像上点选色块的抓取 -0.020 / -0.006 / 0.0
depth 深度点云图上点选色块的抓取 -0.012 / 0.0 / -0.005
kinematics 运动学解算后的整体补偿 -0.008 / 0.0 / 0.0

对应的配置文件结构是这样,三组的 scale 出厂全是 1.0:

pixel:
  offset: [-0.020, -0.006, 0.0]
  scale:  [1.0, 1.0, 1.0]
depth:
  offset: [-0.012, 0.0, -0.005]
  scale:  [1.0, 1.0, 1.0]
kinematics:
  offset: [-0.008, 0.0, 0.0]
  scale:  [1.0, 1.0, 1.0]

单位是米,不是毫米。 出厂值 -0.020 就是 -2 cm,这个量级很关键:如果你照着「看起来差一点点」去填 5、10 这样的数,机械臂会直接飞出工作区。经验上单次调整从 0.002(2 mm)起步,一次只改一个轴。

另外要清楚影响范围:这六个数改完之后,手机 APP 和命令行启动的颜色分拣、标签分拣、垃圾分类玩法会一起改(手册专门标注了这一点)。它们不是当前界面的私有参数,而是全局抓取基准。

四、正确顺序:标定、中心、四角、保存

手册给的流程是「标定 → 像素定位 → 深度定位」,但真正决定成败的是每一步里先调什么、看什么。整理成可执行版本如下:

  1. 固定与进场。G 字夹固定底座,进入位置调节工具,确认场景选对(比如无沙盘场景选 scene_0)。
  2. 相机标定。功能选「标定」,点「标定」按钮,直到画面出现黄色方框、角落显示 Calibration finished!。这一步只做全局对齐,不产生偏差补偿。

  1. 中心点调偏移。功能切到「像素定位」,把色块放在正中心,鼠标点它,机械臂会自动去抓。看偏差方向,只改对应的一个轴,保存、复位、重抓。重复到中心能夹正为止。这一步只动偏移,不要动缩放。




  1. 四角调缩放。中心准了之后,把色块依次放到工作区四个角,再点。如果此时边上偏、中心不偏,说明尺度不对,改 Y 缩放(手册原话:这是调整 Y 轴方向的夹爪大小)。手感是:往大调,边缘的位移变大;往小调,边缘位移变小。


  1. 深度通道再来一遍。功能切到「深度定位」,把色块放在中心(二维码位置附近),在深度点云图上点选,同样先偏移后缩放。深度通道的 Z 偏移直接参与深度修正,压不住高度的问题优先在这里调。
  2. 运动学校准只作兜底。只有当上面都调不动、或更换过结构件时才碰它。手册明确写着运动学参数「一般不建议随意修改,除非更换结构件或进行标定」。

五、 方向与手感:认准三个箭头

调之前先记住正方向,否则符号会反。以机械臂第一视角为准:

  • X 为正:机械臂向前(朝物体方向)移动。设大了就往前多走。
  • Y 为正:机械臂向左侧移动。
  • Z 为正:机械臂向上移动。夹爪压不住块,就说明 Z 偏小。

三组通道的 Z 语义不完全一样:pixel 通道的 Z 是在已写死的 0.02 m 基础上再补,depth 通道的 Z 则参与深度值修正,所以水平问题优先在 pixel 里解决,深度和贴地问题优先在 depth 里解决,不要两边同时改,否则你会失去参照。

六、什么时候不该在这里调

情况 说明 该去哪
六个舵机回中位置就不对 机械零位偏了,视觉补偿救不回来 舵机调试界面的「校准中位」,ID 1 到 6 从下往上
换过连杆、改造过结构 连杆长度与底座尺寸变了,逆解就错 运动学参数:连杆长度、偏移量、底座半径、底座高度
换了相机或动过相机支架 手眼关系变了,属于外参问题 camera_info.yaml 里的 hand2cam_tf_matrix,需要重新手眼标定
换沙盘后整体偏 每个场景的标签码位置不同 calibration_scene.yaml 里对应场景的标签中心与初始位姿

七、总结

特别说一句手眼矩阵:camera_info.yaml 里那个 4×4 矩阵描述的是相机相对机械臂末端的位置和姿态,它错了会表现为「所有方向系统性偏,且旋转姿态也跟着歪」。这种偏差用偏移量硬压,只能压好一个点。

把这件事压缩成三句话:偏差分四层,先排机械再排视觉;补偿是「乘比例、加原点」,所以必须先中心后边缘;偏移单位是米,一次一个轴,改完保存再复位。

如果调完之后偏差还会随使用时间漂移,那通常不是标定问题,而是底座松动或舵机温漂——这时候回到物理层检查,比继续在参数里找更省时间。

八、资源下载

:globe_with_meridians: 官方在线课程与资料库: 幻尔科技官网在线教程

:speech_balloon: 客服领取:联系你购买设备的店铺客服(淘宝/京东/官网客服),提供订单号即可免费领取最新版本资料包。