ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

UR5避障实战:深度相机手眼标定与点云对齐全流程解析

UR5避障实战:深度相机手眼标定与点云对齐全流程解析 做UR5避障项目时很多朋友问我同一个问题相机明明拍到了障碍物机械臂为什么还是会撞上去答案十有八九是坐标没有对齐。你手上的深度相机有自己的坐标系机械臂也有自己的坐标系光靠肉眼看不出偏差但MoveIt规划路径时差一厘米就可能撞坏工件。这一篇就专门讲UR5、MoveIt和深度相机配合中最容易翻车的环节——手眼标定从标定板怎么摆到手眼矩阵怎么算再到最后用点云对齐来验证整个链路是否打通我会把走过的弯路和能直接抄作业的步骤全部写出来。内容主要面向已经能用ROS和MoveIt控制UR5、但卡在相机坐标转机器人坐标的朋友。如果你是刚入门的小白也别急着划走前两章把原理讲得很白话后面实操也能照做只是需要一点ROS和Python基础。1. 为什么你的UR5需要手眼标定1.1 从“看见”到“抓到”缺的一环先理清一个最容易被忽略的事实深度相机眼中的世界和UR5眼中的世界完全不是同一个坐标系。相机输出的是图像坐标系下的数据深度图每个像素能还原出相机坐标系下的三维点坐标而UR5的MoveIt规划依赖的是机器人基座坐标系base_link机械臂末端在世界里怎么移动全部围绕这个坐标系展开。要让相机看到的障碍物、目标工件被MoveIt理解就必须建立从相机坐标系到机械臂基座坐标系的变换关系。这个变换关系的求取过程就是手眼标定。说得再生活化一点。你坐在工位前眼睛看到桌上有杯水伸手去抓你的大脑早已默默完成了“眼睛坐标→手部坐标”的换算。手眼标定干的就是大脑这活儿。UR5和深度相机之间没有大脑只能靠一组精确的变换矩阵否则你看到的点和机械臂实际到达的点永远对不上。实际项目中很多团队上来就调用相机的SDK拿到点云后直接塞给MoveIt的规划场景结果机械臂全程乱闪或者规划出来的路径完全不能用。这就是因为点云虽然采集到了但它还停留在相机坐标系下机械臂根本不知道这些点到底在自己右侧还是左侧、距离多远。把这一步想清楚后面所有工作才有意义。1.2 手眼标定的两种模式与选型手眼标定按相机安装方式分为两种眼在手上eye-in-hand和眼在手外eye-to-hand。名字很形象前者相机装在机械臂末端跟着机械臂一起动后者相机固定在外界某个位置机械臂在相机视野里活动。两种模式需要求解的变换矩阵完全不同千万别搞混。眼在手上的情况我们需要求的是相机坐标系相对于机械臂末端坐标系tool0或法兰盘的固定变换眼在手外的情况我们需要求的是相机坐标系相对于机械臂基座坐标系base_link的固定变换。UR5避障项目中两种都有人用。眼在手上的优势是相机视野范围大机械臂走到哪、相机就拍到哪适合近距离识别和精细抓取眼在手外的优势是相机固定后视野稳定整个机械臂的工作空间都能被监控适合做全局避障把环境点云一次性灌给MoveIt。我在实际项目里更倾向于眼在手外做全局避障因为UR5避障场景通常需要提前感知环境中新增的障碍物固定相机可以持续观察工作区域标定一次就能长期使用。眼在手上虽然灵活但每次更换末端工具后标定关系可能都要重新确认调试成本更高。下面这个表可以帮你快速选型模式相机安装位置求取矩阵优点缺点典型场景眼在手上机械臂末端法兰相机→tool0视野随臂移动灵活近距精度高标定结果受臂变形和工具更换影响抓取、装配、移动检测眼在手外外界固定支架相机→base_link视野稳定一次标定长期用有遮挡风险工作空间边缘精度可能下降全局避障、工作区监控我后面的实战流程都以眼在手外为例因为与MoveIt避障的配合最直接。眼在手上的流程也类似只需要把坐标系名称替换一下。1.3 为什么需要标定板和点云对齐有了相机安装方式怎么拿到那组变换矩阵传统方式是准备一块标定板比如棋盘格或者ArUco码让机械臂带着标定板眼在手外或者让相机观察固定标定板眼在手上在不同位置、不同姿态下拍摄多组数据然后通过数学方式求解相机与机械臂之间的固定变换。标定板在流程里的作用是为相机提供一个已知尺寸和结构的空间参照物。深度相机虽然能直接出点云但单个点云缺少明确的特征点很难精确对应到机械臂末端的位姿。棋盘格角点或者ArUco码的中心点则可以被高精度提取配合已知格子的物理尺寸就能反推出相机在空间里的姿态。而点云对齐则是我用来做最终验证的手段。标定完成后你会得到一个相机到机器人的变换矩阵。这个矩阵对不对不能只看数字最好的办法是让相机采集一帧工作台的点云变换到机器人基座坐标系下再和已知的机器人模型或者激光扫描模型做配准肉眼确认点云是否与机械臂位置重合。如果对齐良好说明整个坐标链路是通的如果出现明显偏移就需要回头排查标定参数。点云对齐也不只是验证工具。在MoveIt避障里我们经常要把相机实时点云转换到机器人坐标系然后和环境中已知模型做融合这个过程本质上也是点云对齐的问题。所以把标定板到点云对齐整条链路走通你已经顺手解决了一半的避障地图构建问题。2. 手眼标定原理不把AXXB背下来出事你根本查不出来2.1 手眼标定方程的推导逻辑手眼标定背后是一个经典的数学问题解AXXB。很多教程会直接把公式甩出来让你用现成工具解完交差但我建议还是要把这个方程理解透。因为一旦标定结果不对你能用来排查的线索都在这里面。先说符号约定。在眼在手外的场景下我们设T_cam_to_base我们最终要求的变换即相机坐标系到机器人基座坐标系的固定变换。T_gripper_to_base机械臂末端tool0到机器人基座坐标系的变换这个从机械臂控制器或者MoveIt的TF树里可以直接拿到。T_target_to_cam标定板坐标系到相机坐标系的变换这个通过识别标定板上的角点/ArUco码可以直接解算。T_target_to_gripper标定板坐标系到机械臂末端坐标系的变换这是固定的因为标定板固定在机械臂末端或者眼在手外时标定板固定在环境中某处。机械臂每次移动到某个姿态都会形成一个闭环从基座到末端从末端到标定板从标定板到相机从相机回到基座。用矩阵乘法写出来T_target_to_gripper T_gripper_to_base^(-1) * T_cam_to_base * T_target_to_cam这个式子说明无论机械臂怎么动等号左边都是一个常量因为标定板和机械臂末端的相对关系不变眼在手外时也可以构造类似闭环。取两个不同的机械臂姿态两边分别相乘经过化简就得到A * X X * B其中X就是T_cam_to_base。A和B都可以从两组位姿中构造出来。这就是AXXB的来源。实际求解时这个方程会拆成旋转和平移两部分分别解。旋转部分常见解法有Tsai-Lenz、Park-Martin等平移部分在旋转解出来后用最小二乘求解。工具库比如OpenCV、easy_handeye、HALCON内部都封装好了这些算法你不需要自己写但一定要知道输入数据是机械臂末端位姿和标定板在相机下的位姿输出是相机到基座或相机到末端的变换矩阵。如果有小伙伴问为什么不能只拍一张标定板就解因为一个姿态只能建立有限个约束解不出6自由度位姿。至少要3组以上不同姿态而且姿态差异要大不能只是平移变化。标定板姿态过于相似时A和B矩阵会退化求出来的解会非常不稳定。这也是我后来反复强调“多采几个夸张角度”的原因。2.2 深度相机内参、外参与点云对齐的关系手眼标定求出的T_cam_to_base属于相机的外参外部参数它描述的是相机坐标系在世界/机器人坐标系中的位置和朝向。但深度相机要把每个深度像素变成三维点还离不开内参内部参数。深度相机输出一张深度图每个像素值代表该点沿相机光轴方向到相机平面的距离。内参就是相机的焦距f_x、f_y主点c_x、c_y可能还有畸变系数。已知深度值d和像素坐标(u, v)可以用下面公式反算相机坐标系下的三维点x_cam (u - c_x) * d / f_x y_cam (v - c_y) * d / f_y z_cam d这些点在相机坐标系下再乘上标定得到的T_cam_to_base就变成了机器人基座坐标系下的三维点p_base T_cam_to_base * p_cam到了这一步MoveIt才能真正“理解”点云。很多人的点云转换后出现严重错位内参错误也是常见原因之一。所以标定外参之前最好先用相机官方SDK校准一次内参保证深度值单位是毫米还是米也提前确认好。点云对齐的关键是在转换后的机器人坐标系点云与已知模型点云之间找到刚体变换。常用的方法是ICPIterative Closest Point迭代最近点。ICP做的事情很简单假设两组点云已经大致对齐然后不断寻找最近点对求出一个更优的刚体变换迭代到误差收敛。它很适合用来验证手眼标定结果因为标定的残余误差会以点云整体偏移的形式暴露出来。需要说明的是ICP只能做精配准不能做大范围粗配准。如果手眼标定误差大到厘米级直接把两组点云丢给ICP大概率会陷入局部最优得到很离谱的结果。所以点云对齐验证通常分为两步先用人工或标志物粗略对齐再用ICP精修最后评估均方根误差。2.3 用ArUco码标定板和棋盘格怎么选深度相机做手眼标定标定板可以选择棋盘格也可以选择ArUco码更简单的方式是直接用AprilTag。我的实验对比下来棋盘格角点检测经典亚像素精度高适合彩色相机做2D标定。但在深度相机上如果光照不佳或者标定板倾斜角度较大角点提取容易失败。ArUco码自带编码信息一个板子上放多个码就能知道每个码的ID和位姿非常适合动态识别。鲁棒性比棋盘格好尤其在少量遮挡或大角度下。实心圆形标定板部分深度相机SDK支持圆形中心提取配合Halcon手眼标定流程用得多精度不错但OpenCV生态支持差点。我个人在UR5项目中用的是ArUco板因为可以生成多码板姿态解算稳定而且ROS里集成很方便。精度上对于避障应用已经足够如果你要做0.1毫米级别的精确定位建议换成工业级陶瓷标定板配合Halcon但这不是我们今天的重点。还有一点需要强调标定板的物理尺寸一定要拿尺子量准别光看打印参数。打印纸有热胀冷缩我遇到过标称边长10cm实际只有9.8cm的情况解算出来的平移矩阵直接偏了2毫米点云对齐时末端偏差非常明显。标定板尽量贴在平整的铝板或者亚克力板上不要只用胶带粘在纸箱上。3. 实战流程从标定板到点云对齐3.1 软硬件准备清单先列我这次用到的环境方便你对照机械臂UR5控制频率125Hz使用ROS驱动 ur_robot_driver运动规划框架MoveItNoetic版本深度相机Intel RealSense D435i用“大白深度相机”或者其他RGB-D相机也可以核心是能出彩色图和深度图标定板打印的ArUco板4x4_50字典板子打印在A3纸上贴在硬铝板上实测格子边长3.2cm手眼标定工具ROS的easy_handeye包以及OpenCV的calibrateHandEye函数做对照点云处理库Open3D用于点云对齐和误差评估运行系统Ubuntu 20.04 ROS Noetic这套组合的好处是全部开源不需要买额外商业授权而且与MoveIt生态的兼容性很好。如果你用的是大白深度相机或者其它国产深度相机需要先去厂家官网下载Linux SDK确认ROS包是否提供再决定是否走RealSense的流程。3.2 第一步采集标定板数据这一步偷懒后面全白干手眼标定最耗时间也最影响结果的就是数据采集。我依次做以下这些事先把深度相机固定在支架上尽量让机械臂工作区域完整落在相机视野里。固定好后整个标定过程不要再去碰相机支架一点点位移都会让标定结果作废。把ArUco板固定在机械臂末端。注意板子要尽量与法兰盘平面平行不要有明显的弯折锁紧螺丝后可以用水平尺检查一下。启动ROS驱动确认机械臂能正常上报/pose状态启动相机节点确认彩色和深度图像的话题都在发布。让机械臂带着标定板移动到多个位置。我一般采集1520个不同姿态。姿态不要全部聚集在一个区域要覆盖相机视野的近、中、远距离以及左右上下不同位置。同时每个位置让标定板相对相机有大角度变化比如绕X轴、Y轴、Z轴都有明显转动。每到一个位置先等机械臂完全停稳再录制一帧图像和机械臂当前末端位姿。为什么不停稳因为手眼标定假设所有输入都是静态的机械臂还在抖动时末端位姿和图像数据不同步矩阵解算出来必然有误差。保存数据时我会用Python脚本分别订阅机械臂的tftool0→base_link和相机的图像话题在同一个时间戳附近截取。如果两个话题时间戳对不上宁可不存这一帧也不要用时间差大的数据硬凑。一个常见的坑是标定板与相机的角度太小。如果你只会平移标定板三个姿态都是正对着相机那解算出来的旋转矩阵会非常脆弱外部看起来标定通过了实际点云一转到机器人坐标系就偏。我自己至少留下3个“特别奇怪”的姿态比如标定板斜着45度对着相机甚至接近侧视这能让方程组得到更充分的约束。3.3 第二步用easy_handeye求解手眼矩阵并发布TF数据采完我用的是ROS的easy_handeye包省去自己写位姿收集逻辑的麻烦。如果你倾向用OpenCV直接算也可以但easy_handeye的TF发布和与MoveIt的对接更顺手。一个可行的命令行流程大致如下# 启动相机驱动 roslaunch realsense2_camera rs_camera.launch # 启动UR5的驱动和MoveIt roslaunch ur_robot_driver ur5_bringup.launch roslaunch ur5_moveit_config moveit_planning_execution.launch # 启动easy_handeye注意选择eye_on_hand或eye_on_base roslaunch easy_handeye ur5_eye_on_base.launch打开easy_handeye的Rviz界面后它会自动识别相机和标定板你只需要在机械臂移动到一个新姿态后点击“规划并执行”或者远程控制机械臂到达位置然后在界面里点击“获取样本”。程序会记录当前的机械臂末端位姿和标定板在相机坐标系下的位姿。采完所有样本后点击“计算”就会输出标定结果通常是一个4x4变换矩阵。同时在eas_handeye的配置目录下会生成一个YAML文件类似这样eye_on_base: trans_matrix: [0.012, -0.998, 0.055, 0.372, 0.984, 0.021, 0.176, -0.161, -0.177, 0.051, 0.983, 0.643, 0.0, 0.0, 0.0, 1.0]这个矩阵就是把相机坐标系下的点变换到base_link坐标系。你别直接手抄进代码我建议在launch文件里通过easy_handeye的发布器自动发布这个TF。方便起见也可以写一个静态TF发布节点rosrun tf2_ros static_transform_publisher 0.012 -0.998 0.055 0.984 0.021 0.176 0.051 0.983 0.372 -0.161 0.643 camera_color_optical_frame base_link但需要注意Tait-Bryan角的排列顺序最好用四元数而不是欧拉角否则容易把自己绕晕。发布完成后用下面的命令验证TF树rosrun tf tf_echo camera_color_optical_frame base_link如果输出的平移和旋转与标定矩阵一致说明TF链路已经建立。到这一步手眼标定本身的“求矩阵”任务就完成了。3.4 第三步点云对齐验证标定准不准一眼看出来矩阵求出来只是开始接下来必须验证。我的习惯是先让相机采集一帧静态场景点云场景里放一个已知尺寸的箱子然后写一个Python节点订阅点云话题把它从相机坐标系转换到base_link坐标系。代码逻辑很简单import open3d as o3d import numpy as np # 假设pcl_cam是相机坐标系下的Nx3点云T_cam_to_base是手眼标定矩阵 # 齐次坐标变换 pcl_cam_h np.hstack([pcl_cam, np.ones((pcl_cam.shape[0], 1))]) pcl_base_h (T_cam_to_base pcl_cam_h.T).T pcl_base pcl_base_h[:, :3]转换后的点云配合UR5的URDF模型一起丢到Rviz里显示。如果手眼标定正确你会看到点云中的箱子和UR5的3D模型在工作台面上是吻合的机械臂末端也刚好落在点云中对应位置附近。更进一步的验证是用Open3D做点云配准。我把转换后的场景点云与一个从CAD模型采样的箱体点云做ICP对齐然后输出配准分数和最近邻距离均方根误差。我的经验是如果RMSE小于3毫米说明标定精度足够支撑MoveIt避障如果大于1厘米一定是标定数据质量或者TF发布有问题不要继续往MoveIt里灌数据。下面是一段用Open3D做ICP参考的简化代码import open3d as o3d source o3d.geometry.PointCloud() # CAD模型点云 source.points o3d.utility.Vector3dVector(cad_points) target o3d.geometry.PointCloud() # 手眼变换后的场景点云 target.points o3d.utility.Vector3dVector(pcl_base) # 初始粗略对齐可以用已知箱体位置手动平移或使用global_registration reg_p2p o3d.pipelines.registration.registration_icp( source, target, max_correspondence_distance0.02, initnp.eye(4), estimation_methodo3d.pipelines.registration. TransformationEstimationPointToPoint() ) print(reg_p2p.fitness, reg_p2p.inlier_rmse)如果fitness过低或者inlier_rmse很大就是标定矩阵有问题。这时候不要相信ICP能救回来回到数据采集环节去检查。我用这个方法实际排掉过好几次问题。有一次标定结果看起来正常但点云转换后机械臂位置整体偏右3厘米后来发现是标定板的物理尺寸量错了ArUco边长填了35mm但实际是32mm整个平移矩阵比例就不对。换成正确尺寸后RMSE一下子从15mm降到2mm。3.5 第四步把点云接入MoveIt规划场景点云验证过关后我们还要把它接入MoveIt的Planning Scene让避障规划真正用上。在MoveIt中环境障碍物通常以Collision Object的形式加入Planning Scene点云可以用PointCloud Object或者Octomap表示。我习惯把实时点云转成Octomap这样既能做碰撞检测占用的计算量也更小。一个简单的流程是相机采集点云→手眼矩阵变换到base_link→过滤掉工作台平面以及机械臂自身点云→体素滤波降采样→发布成PointCloud2话题→MoveIt的occupancy map monitor订阅这个话题并更新Octomap。避障效果的关键在于点云转换的准确性。如果手眼标定偏移几个毫米MoveIt规划时可能紧贴着真实障碍物走甚至发生不必要碰撞。所以每次重新安装相机或移动相机支架后我会快速用手眼标定流程复查一遍再继续跑避障实验。4. 常见问题与排查技巧实录4.1 手眼标定常见的“翻车”现场我在多个项目里遇到过的典型问题整理成一张速查表现象可能原因排查方法标定出的旋转矩阵不正交行列式不为1输入位姿有噪声姿态变化不足求解算法数值不稳定检查机械臂是否走满不同姿态剔除明显离群样本平移矩阵量级离谱比如3米或-5米标定板尺寸填错相机坐标系和机器人坐标系单位不一致标定板与末端的固定关系有误重新测量标定板实际尺寸检查深度相机内参对照TF树确认坐标系点云转换后整体旋转偏移箱子像被拧过TF发布时旋转轴顺序/四元数顺序写错相机外参矩阵方向搞反用静态TF工具逐项检查矩阵和四元数在Rviz里同时显示相机坐标系和base_link观察两者轴向是否合理标定板识别不稳定时而丢失光照变化、板面反光板子太远ArUco字典尺寸设置错误调整相机曝光和增益靠近一些换大尺寸标定板easy_handeye计算时报“无法求逆”或“无效姿态”同一姿态采集了多组几乎相同的数据机械臂并未真正移动到目标位置重新采集确保每组姿态的末端位置和朝向差异明显检查机械臂是否使能点云和机械臂模型有固定平移偏差深度相机内参标定不准确标定板坐标系与机械臂末端坐标系不平行相机支架在采集过程中被碰动重标定相机内参确保标定板贴装面平整重新固定支架并重复标定流程这个表里最容易被忽略的就是标定板尺寸和机械臂姿态差异。很多团队在数据采集中只走了形式没有真的让标定板做大幅旋转导致方程组近似奇异算出来的矩阵虽然能过数学检查但物理上完全不对。4.2 点云对齐时坐标不准先查这五件事如果你的手眼标定流程走完点云还是和机械臂错位我建议按以下顺序排查查时间戳同步。深度相机的彩色图、深度图、点云话题以及机械臂的TF话题时间戳是否一致。尤其在使用ROS时不同话题的时间戳差个几十毫秒在机械臂高速运动时就会造成明显偏移。查单位。深度相机的深度单位是毫米还是米Open3D里经常混用定要先统一单位再计算变换矩阵。UR5的MoveIt用的是米RealSense默认发布点云是米但有的国产相机是毫米。单位错了平移量直接差1000倍一眼就能发现。查内参文件。相机内参是否正确加载如果没有用相机出厂标定文件或者相机在运输中受过冲击内参可能已经偏移导致三维点坐标有系统误差。建议定期用标定板重新标定相机内参。查TF树。发布手眼变换时是从camera_color_optical_frame到base_link还是从camera_link到base_link相机里不同frame之间还有小的光学平移如果选错父坐标系等于是叠加了一个固定偏移。最好在Rviz中同时显示两个坐标系确认相机光轴指向和机械臂模型一致。查标定板的姿态范围。采集时是否只移动了机械臂末端位置而几乎没有改变姿态这样即使采集了20组数据信息量也等同于2组数据。补采几组大角度、大旋转的姿态会让矩阵解算稳定很多。4.3 我踩过的几个“深坑”和对应心得第一个坑是关于标定板反光。普通的喷墨打印纸在强光下会反光ArUco码边缘亮一块暗一块角点检测精度会大幅下降。后来我把标定板换成哑光相纸并调整相机的曝光时间识别稳定了很多。如果你用深度相机自带的红外补光注意ArUco码在红外下可能也有差异最好用同一个相机实拍确认。第二个坑是机械臂本身的奇异点或关节限位。UR5在标定过程中如果某个目标姿态超过关节限位机械臂会报错停止此时我强制记录了一组不完整位姿导致标定矩阵偏差很大。后来我先用手动拖拽确认所有姿态点都在机械臂可达空间内再用程序依次执行就不再折腾。第三个坑是相机支架的稳定性。我在一次实验中标定完成后中途有同事碰了一下相机支架虽然肉眼看不出来但点云整体偏移了1.5厘米。手眼标定最怕的就是“标定完又动了”所以固定相机后我会在支架底座上画上定位线每次开机前用激光笔检查是否还对准同一位置。这个习惯帮我节省了大量排查时间。5. 从标定到MoveIt避障的联动经验5.1 手眼矩阵如何参与MoveIt规划手眼标定的最终目的是让MoveIt基于真实环境点云做避障。MoveIt本身不直接吃相机数据它需要你通过Planning Scene接口来更新环境信息。在实际系统中我会单独写一个点云预处理节点任务是订阅深度相机的原始点云通过手眼矩阵把点云变换到base_link使用VoxelGrid降采样比如体素大小0.01米减少点云数量用PassThrough滤波去掉远离机械臂工作区域的点用RANSAC平面分割去掉桌面点云因为桌面通常已经在MoveIt的碰撞环境中声明了重复添加反而容易让规划器误判把剩下的点云发布到MoveIt的感知话题MoveIt侧通过配置occupancy map monitor来订阅点云话题并构建Octomap。Octomap的分辨率一般设置在0.01~0.02米。分辨率太高会拖慢规划速度太低又会让避障失去意义。针对UR5这种规格0.015米是一个比较均衡的选择。避障规划时MoveIt会把Octomap中的占据体素当作碰撞障碍物处理所以只要点云坐标和机械臂坐标一致规划器就知道该绕开哪里。这里有个容易忽略的点如果你直接把包含机械臂本体的点云发给了MoveItMoveIt会认为自己身上长满了障碍物规划常常失败。所以滤除机械臂本身的点云非常重要。常用的办法是根据URDF模型生成一个虚拟包围盒或者直接对相机点云做欧式聚类剔除位于机械臂模型内部的点。5.2 我的几个“省钱”经验先说明我不是反对买高精度工业相机和标定板只是想说你完全可以从低成本方案起步把整条链路跑通后再升级。ARUco板用一张A3哑光打印纸完全够做避障实验点云对齐的精度取决于标定质量而不是板子价格。等你要做精密装配再考虑陶瓷板也不迟。再一个经验就是标定的过程要尽量自动化减少人工干预。我用Python脚本加上MoveIt的API写了一个自动采集函数机械臂每到一个预置点停1秒采集图像和TF然后移动到下一个点。这样不仅能保证姿态多样性还能重复跑同样的数据采集流程对比不同算法参数的影响。最后我记得第一次在MoveIt里真正跑通避障时机械臂自动绕开桌面上临时放的一个纸箱那一刻才觉得前面所有标定工作都值了。如果你也在折腾UR5、MoveIt和深度相机别跳过验证这一步尤其是点云对齐的指标。手眼标定不是“算完矩阵就结束”而是“端到端验证通过才结束”。这套从标定板到点云对齐的流程背后最核心的逻辑就是让所有传感器数据都统一到机器人的坐标系里。你如果理解了这一点将来换相机、换机械臂、换标定板都只是换工具核心思路是完全一样的。后续我还会深入写MoveIt避障的Octomap参数调优和动态场景更新感兴趣的话可以继续关注。
返回列表