自己攒的机械臂,最难的不是让它动,是让它"看得准"。不少朋友给机械臂加了个摄像头,本想搞视觉抓取,结果相机看到了目标,机械臂却死活夹不到——差那么几厘米,来回调都调不好。别急着全盘推倒重来,八成是卡在"手眼标定"这关。今天就把它讲透:为啥要标定、九点标定怎么跑、误差出在哪。
为什么相机明明"看见了",机械臂就是夹不准
问题的根子在坐标系不统一。摄像头看到的是"像素坐标",图片里一个点是多少行多少列(x,y),单位是像素;可机械臂干活用的是"机械臂坐标",单位是毫米,还要带方向。两套坐标系之间没有换算关系,等于两个说不同语言的人对话,各自以为懂了,其实对不上号。
手眼标定要干的,就是算出这两个坐标系之间的"翻译表"——让你拿到相机里一个点的像素坐标,能反推出它在机械臂工作空间里的毫米坐标,机械臂照着这个坐标去抓,自然就准了。
九点标定是啥,适合什么场景
手眼标定有好几种,九点标定是其中最简单实用的一种,适合"2D平面抓取":机械臂在桌面上捡东西、分拣,相机固定朝下拍,高度不变。它不碰相机内参那套复杂的畸变计算,只算像素平面和机械臂XY平面之间的一个仿射变换关系。
仿射变换听着唬人,说人话就是"平移+旋转+缩放+轻微倾斜"四个动作的组合。一算出来,之后相机视野里任意一个点的像素坐标,都能一键换算成机械臂坐标,指哪打哪。在你还没上大模型、没搞复杂路径规划之前,这是把视觉抓取跑起来的最快路径。
实际操作就三步,别嫌麻烦
第一步准备标定板。拿一张白纸,用绘图软件画九个圆点,排成3乘3的网格,圆点之间间隔要一致,打印出来当标定板。不用买专门的,够用就行。
第二步走点。把标定板平放在机械臂要干活的位置,相机固定好朝下。先让相机识别这九个圆心的像素坐标,记下来;再控制机械臂末端(装上尖针或夹爪)依次去戳这九个圆心的实际位置,每戳一个记录对应的机械臂坐标。这一步是精度关键,机械臂末端和标定板的高度,最好跟你实际抓取时保持一致。
第三步算矩阵。把两套坐标数据丢给程序,用OpenCV的estimateAffine2D求一个仿射矩阵。代码不复杂:准备好像素点集和机械臂点集,调函数算矩阵,再写个坐标换算函数,把任意像素坐标乘进去,出来就是机械臂坐标。跑通之后,相机看到目标,程序换算坐标,机械臂就能去抓了。
误差从哪来,怎么避坑
标定结果准不准,多半看三点。一是"操作高度不同步",标定时的抓取高度和实际干活的抓取高度差太多,九点标定就失效,所以高度一定要统一。二是"点位太少或太偏",九个点尽量铺满相机整个视野,别都挤在一个角落,否则矩阵拟合精度差。三是"相机装得不稳",标定过程中相机哪怕动了一点点,之前的标定就全废,得重来一遍。
另外一个容易踩的坑,是拿一张普通的A4纸就标定,结果打印畸变、纸张不平,圆点间距其实不标准,导致换算出来的坐标有稳定偏差。条件允许可以简约点,但数据输入前最好测一下九个点的实际间距是否一致。
标定完能干啥,往哪进阶
标定跑通后,你最少能做出"颜色识别+机械臂抓东西"的入门级视觉分拣:摄像头识别到红色方块,换算坐标,机械臂过去吸起来放进指定位置。再往后可以加障碍物检测、加目标姿态调整、甚至用大模型理解自然语言指令来指挥机械臂。
九点标定是一个性价比很高的起点,它解决的是"视觉引导机械臂"里最地基的一环。把这个打通了,你的机械臂才算真正从"能动的玩具"升级成"会看的机器"。
总结
总结一句话:机械臂夹不准,先别怀疑机械臂,先怀疑坐标系没对齐。九点标定用一张纸、三组数据、一段几十行的代码,就能把像素坐标稳稳翻译成机械臂坐标。对想入门机械臂视觉抓取的玩家,这是最值得先跑通的一课。
所以关键是像素坐标和机械臂坐标两套坐标系要能切换,懂了,这就是个翻译表的活。
标定完那段直接用矩阵算坐标说得实在。实操党最怕那种讲一半原理留一半代码的,这篇干货够了。
装了摄像头看不懂像素坐标的痛我太懂了,原来问题在没做手眼标定这一步。
机器臂夹不准,先怪坐标系不怪机械臂,哈哈哈哈笑死,太真实了?
九点标定确实是机械臂视觉入门最该先搞懂的东西,我以前就是卡在这,坐标对不上焦虑了好久。高度、点位铺满这两个点记下了。