机器人手眼标定:从理论推导到工程实践

机器人手眼标定:从理论推导到C++工程实践 本文深入探讨了机器人手眼标定的理论与实践,从数学原理到C++工程实现。详细解析了Eye-to-Hand和Eye-in-Hand两种配置,以及AX=XB方程的求解方法,结合四元数计算提升精度。通过实际案例展示了如何实现毫米级精度的标定系统,并分享了数据采集、算法优化和问题排查的实战经验。 阅读详情

1. 手眼标定:让机器人“看见”并“够到”的关键一步

想象一下,你闭着眼睛去拿桌上的水杯,是不是很难一次就精准地抓到?机器人也一样。它虽然有灵活的“手臂”(机械臂),但如果不知道自己的“眼睛”(相机)看到的东西具体在“手臂”的哪个方位,它就无从下手。手眼标定,就是解决这个“看见”和“够到”之间坐标转换问题的核心技术。简单说,它就是告诉机器人:“你的眼睛看到的那个位置,在你的手臂坐标系里,其实是这里。”

我在工业现场调试过很多次,这个环节要是没做好,后续的抓取、装配、分拣全都会乱套。机器人要么抓空,要么撞到工件,场面一度非常尴尬。所以,无论你是做机器人应用开发的工程师,还是对自动化感兴趣的技术爱好者,理解手眼标定都是绕不开的一课。这篇文章,我就结合自己多年的实战经验,从最核心的数学原理开始,一步步带你推导,并最终把它变成一个稳定、可运行的软件模块。我们会避开那些纯理论的空中楼阁,直接聚焦于“如何从公式写到代码,再到实际跑通”的完整路径。

手眼系统主要有两种经典布局,这也是所有问题的起点。第一种叫“眼在手外”(Eye-to-Hand),相机固定在一个地方,比如工作台的上方,静静地看着机械臂和整个工作区域。这种布局下,我们需要标定出相机坐标系和机器人基座坐标系之间的固定关系。第二种叫“眼在手上”(Eye-in-Hand),相机直接装在机械臂的末端,跟着机械臂一起运动。这时候,我们需要标定的是相机坐标系和机械臂末端工具坐标系之间的关系。别看只是安装位置不同,这两种模式下的数学推导思路一致,但工程实现和数据采集流程上会有不少细节差异,我们后面会详细展开。

2. 核心理论:AX=XB方程到底在说什么?

几乎所有手眼标定方法,最终都会归结到求解一个矩阵方程:AX = XB。这个看似简洁的方程,是连接视觉感知和机器人运动的数学桥梁。很多资料一上来就扔出这个公式,让人摸不着头脑。今天,咱们就把它彻底拆开,看看每个字母背后具体代表什么。

2.1 从物理场景到数学方程

我们以更常见的“眼在手外”(Eye-to-Hand)系统为例。假设机器人末端夹着一个工具(比如吸盘或夹爪),在工作台上有一个固定的标定板(比如棋盘格)。现在,我们让机器人运动到两个不同的位姿(位置和姿态),分别记为姿态1和姿态2。

在这个过程中,有几个坐标系和变换关系是始终不变或可以测量的:

  1. baseHcam (即我们要求的 X):机器人基座坐标系到相机坐标系的变换。因为相机是固定的,所以这个变换矩阵是恒定不变的,也正是我们标定的目标。
  2. toolHbase_i:在姿态 i 时,机器人基座坐标系到末端工具坐标系的变换。这个数据可以直接从机器人控制器里读取,非常可靠。
  3. camHcal_i:在姿态 i 时,相机坐标系到标定板坐标系的变换。这个可以通过相机拍摄标定板的图像,然后经过视觉算法计算出来。

还有一个隐含的、不变的关系:末端工具坐标系到标定板坐标系的变换 toolHcal。因为工具和标定板都是刚体,它们之间的相对位置关系在机器人运动时是不变的(假设标定板固定)。

好了,现在我们用变换矩阵的连乘来描述姿态1和姿态2下的情况:

  • 姿态1时:toolHcal = toolHbase_1 * baseHcam * camHcal_1
  • 姿态2时:toolHcal = toolHbase_2 * baseHcam * camHcal_2

既然 toolHcal 不变,上面两个等式右边也相等: toolHbase_1 * baseHcam * camHcal_1 = toolHbase_2 * baseHcam * camHcal_2

接下来就是一点矩阵运算的“魔法”了。我们把 baseHcam(即 X)移到一边。对上式两边同时左乘 toolHbase_2 的逆矩阵,右乘 camHcal_1 的逆矩阵,经过整理后,就能得到那个经典的形式: (toolHbase_2)^{-1} * toolHbase_1 * baseHcam = baseHcam * camHcal_2 * (camHcal_1)^{-1}

看!我们令:

  • A = (toolHbase_2)^{-1} * toolHbase_1
  • B = camHcal_2 * (camHcal_1)^{-1}
  • X = baseHcam

于是,方程 AX = XB 就活生生地摆在我们面前了。这里的 A 完全由机器人自身两个姿态决定,B 完全由相机“看到”的两个标定板姿态决定,而 X 就是我们梦寐以求的手眼变换矩阵。

2.2 方程求解的挑战与主流思路

方程写出来了,但求解它并不简单。因为矩阵乘法不满足交换律,这本质上是一个非线性问题。直接求解会非常复杂且不稳定。工程师和数学家们想出了两大类主流方法。

第一类方法是 “分步线性化”。其核心思想是利用旋转矩阵的特殊性质(正交性),将旋转和平移分开求解。典型代表是Tsai-Lenz方法。它先利用旋转轴、旋转角的关系构造线性方程组,单独解出旋转矩阵R,然后再把求得的R代入方程,去求解平移向量t。这种方法推导出的公式相对简洁,计算速度快。但缺点也很明显:它是两步走,第一步求解旋转的误差会不可避免地传递到第二步的平移求解中,对数据噪声比较敏感。而且,这类方法要求机器人的两次运动旋转轴不能平行,否则方程会出现退化,解不唯一。

第二类方法是 “整体优化”。它把旋转和平移作为一个整体,构建一个非线性优化问题,通过迭代算法(如李代数、四元数结合最小二乘)寻找一个最优的X,使得所有观测数据下的 AX - XB 的误差最小。这类方法的优点是精度高,理论上能获得全局最优解,对噪声的鲁棒性更好。但缺点就是计算量大,速度慢,而且优化结果严重依赖于迭代的初始值,如果初始值给得不好,很容易陷入局部最优解。在实时性要求高的在线标定场景中,这种方法往往不太适用。

在实际项目中,我通常会根据需求来选择。如果追求速度和实现的简洁性,且现场条件能保证机器人做非平行轴运动,我会用Tsai这类线性方法。如果对精度要求极高,比如在高精度装配场景,并且有好的初始值估计方法,我会考虑非线性优化。不过,经过大量实践,我发现一种基于四元数的线性方法——Chou和Kamel提出的方法,在精度、速度和稳定性上取得了很好的平衡,也是我接下来要重点分享的工程实现方案。

3. 工程实践:将Chou-Kamel方法变成可运行的代码

理论很美,但能让代码跑起来、结果正确才是硬道理。我们选择Chou-Kamel方法进行工程化,就是看中了它用四元数巧妙地将旋转部分线性化,形成一个统一的线性方程组,一次性求解旋转和平移,避免了误差传递,同时保持了计算的高效性。

3.1 四元数:旋转表示的利器

首先得理解为什么用四元数。在三维空间中,描述旋转可以用3x3的旋转矩阵,也可以用由三个数组成的欧拉角,但都存在缺陷:旋转矩阵有9个数但只有3个自由度,存在冗余和约束;欧拉角则有著名的“万向节死锁”问题。四元数是一个四维数,能紧凑、无奇异地表示三维旋转,非常适合计算。

Chou-Kamel方法的精髓在于,他们将旋转方程 RA * RX = RX * RB(对应矩阵方程 AX=XB 的旋转部分)用四元数乘法重新表达:qA * qX = qX * qB。其中 qA, qB, qX 分别是矩阵A, B, X的旋转部分对应的四元数。

然后,他们利用四元数乘法的性质,将这个等式变换为:(qA - qB_conjugate) * qX = 0。这里 qB_conjugate 是 qB 的共轭。对于多组数据(比如机器人运动了N个位姿,我们可以得到M组A, B),我们就能构建一个形如 M * qX = 0 的齐次线性方程组。这里的M是一个 4M x 4 的矩阵(因为每组数据提供一个四元数方程,每个四元数有4个分量)。

3.2 构建与求解线性系统

具体到编程,我们需要做以下几步:

  1. 数据采集:控制机器人走到N个不同的位姿。在每个位姿i,记录:
    • 从控制器读取的末端位姿 toolHbase_i(4x4齐次矩阵)。
    • 通过视觉算法识别标定板得到的 camHcal_i(4x4齐次矩阵)。
  2. 构造A, B矩阵:通常我们使用相邻位姿来构造一对(A, B),即用位姿i和i+1。这样可以得到N-1组方程。当然也可以用任意两个不同位姿组合,那样会得到 C(N,2) 组方程,数据量更大,但矩阵也会更大。工程上,相邻位姿构造更常用,也更稳定。
    // 伪代码示例:构造第i组A和B
    Matrix4d A_i = H_base_tool[i+1].inverse() * H_base_tool[i]; // (toolHbase_{i+1})^{-1} * toolHbase_i
    Matrix4d B_i = H_cam_cal[i+1] * H_cam_cal[i].inverse(); // camHcal_{i+1} * (camHcal_i)^{-1}
    
  3. 提取旋转,转换为四元数:从A_i和B_i中提取出3x3的旋转矩阵 RA_i 和 RB_i,然后将它们转换为四元数 qA_i 和 qB_i。
  4. 构建大矩阵M:对于每一组 qA_i 和 qB_i,计算 (qA_i - qB_i_conjugate),这是一个1x4的行向量。将所有的N-1个这样的行向量堆叠起来,形成一个 4*(N-1) x 4 的矩阵 M。
  5. 奇异值分解(SVD)求解:我们的方程是 M * qX = 0。这等价于寻找矩阵 M 的右奇异向量中,对应最小奇异值的那个向量。因为理论上,在无噪声的情况下,M 的秩为3,其零空间(对应奇异值为0)的向量就是 qX。在有噪声的情况下,最小奇异值对应的右奇异向量就是最优解。在C++中,我们可以使用Eigen库轻松完成:
    #include <Eigen/Dense>
    using namespace Eigen;
    // 假设我们已经构建了矩阵 M,尺寸为 rows x 4
    JacobiSVD<MatrixXd> svd(M, ComputeThinU | ComputeThinV);
    MatrixXd V = svd.matrixV(); // 右奇异向量矩阵
    Vector4d qX = V.col(3); // 取最后一列,对应最小奇异值
    // 注意:需要对 qX 进行归一化,确保它是单位四元数
    qX.normalize();
    
  6. 求解平移向量:得到旋转四元数 qX 后,可以将其转换回旋转矩阵 RX。然后,利用原始的 AX=XB 方程中平移部分的关系,可以构造一个关于平移向量 tX 的线性方程组。这个方程组同样可以通过最小二乘法(例如SVD或QR分解)来求解。具体推导是利用 RA * tX + tA = RX * tB + tX 这个关系,其中 tA, tB 是A, B的平移部分。将所有数据代入,形成超定方程组求解 tX。

3.3 一个完整的仿真验证流程

在写C++代码怼到真机器人上之前,我强烈建议先在MATLAB或Python里做一个仿真验证。这能快速验证你的算法推导和流程是否正确,避免在硬件调试阶段抓瞎。

我的仿真步骤通常是这样的:

  1. 虚拟建模:在MATLAB里用机器人工具箱(如Peter Corke的Robotics Toolbox)创建一个六轴机器人模型。随意设定一个固定的“相机坐标系”相对于机器人基座的位置(这就是我们想求的“标准答案” X_true)。再随意设定一个“工具-标定板”之间的固定变换。
  2. 模拟数据采集:随机生成一系列机器人关节角,计算每个位姿下的 toolHbase_i。然后利用公式 camHcal_i = (baseHcam)^{-1} * toolHbase_i * toolHcal 反向计算出相机“看到”的标定板位姿。这里可以人为加入一点高斯噪声,模拟真实传感器的误差。
  3. 运行算法:将模拟得到的 toolHbase_i 和 camHcal_i 输入到我们实现的 solve_hand_eye_equation 函数中。
  4. 对比结果:将算法计算出的 X_calc 与最初设定的 X_true 进行对比。计算它们之间的旋转误差(如轴角误差)和平移误差(欧氏距离)。如果误差在可接受范围内(例如旋转<0.1度,平移<0.5mm),说明算法实现基本正确。

这个仿真闭环是开发过程中性价比极高的一步,能帮你排除掉大部分算法逻辑上的错误。

4. 从算法到健壮模块:工程化的挑战与技巧

把算法跑通只是万里长征第一步。要把手眼标定做成一个能在不同车间、不同机器人、不同光照条件下都稳定可靠的软件模块,还需要解决一大堆工程问题。

4.1 数据质量是生命线:如何采集“好”的数据?

“垃圾进,垃圾出”在标定里体现得淋漓尽致。算法再精巧,如果输入的数据质量差,结果肯定不准。我踩过不少坑,总结出几条黄金法则:

  • 运动规划要“充分”:机器人的运动必须激发所有自由度。特别是旋转,要确保有多组运动之间的旋转轴是明显不平行的。最简单的方法是让末端工具在保持姿态大致不变的情况下走一个矩形路径,然后再绕不同的轴进行旋转运动。绝对避免只在同一平面内或只绕同一轴做小幅运动。
  • 标定板要“清晰可见”:在每一个采集位姿,必须确保相机能完整、清晰地看到标定板。视野中最好有超过70%的标定板图案,且成像不能有严重模糊或过曝。自动采集时,可以加入图像清晰度检测,不合格的位姿自动重采或报警。
  • 位姿数量要“适中”:太少(如<5个)会导致方程病态,解不稳定;太多(如>50个)不仅耗时,矩阵过大也可能引入更多累计误差,且计算变慢。根据经验,15到25个均匀分布在机器人工作空间内的位姿是一个比较好的范围。
  • 引入“运动学验证”:采集完数据后,可以做一个快速校验。用求得的 X 和一组未参与计算的数据,预测一下机器人的末端位置,和实际读取的位置对比。如果误差突然变大,说明这组数据可能是异常点。

4.2 异常处理与鲁棒性提升

真实环境充满意外。视觉识别标定板可能偶尔失败,机器人通信可能丢包,某个位姿的数据可能就是噪点。我们的程序必须能处理这些情况。

  • 数据有效性检查:在构造A, B矩阵前,检查每一个变换矩阵的有效性。例如,旋转矩阵的行列式是否接近1(防止数值误差导致非正交),平移向量是否在合理范围内(比如,相机不可能出现在机器人基座后方10米处)。
  • 基于RANSAC的鲁棒求解:这是提升标定鲁棒性的“大杀器”。我们可以将多组数据(A_i, B_i)视为观测样本。RANSAC算法的思想是:随机从所有数据中选取最小样本集(对于AX=XB,理论上2组非平行运动就能解,但为了稳定通常选3-5组)来计算一个 X。然后用这个 X 去测试所有数据,计算 AX - XB 的误差(如旋转和平移的残差),将误差小于某个阈值的点标记为“内点”。重复这个过程几百上千次,最后选择内点数量最多的那个模型,并用所有内点重新计算最终的 X。这样可以有效剔除由于误识别、剧烈抖动等原因产生的“外点”数据。
  • 结果验证与迭代优化:标定完成后,不要直接投入使用。应该用另一组独立的、未参与标定的验证数据,计算重投影误差。将标定板角点通过求得的 X 投影到机器人坐标系,再与通过机器人运动学计算出的实际位置比较。如果平均误差满足应用要求(例如,装配场景要求0.1mm以内,分拣场景可以放宽到1mm),才算通过。

4.3 代码实现与性能优化

将上述所有考虑封装成一个健壮的类,是工程化的最后一步。以C++为例,一个基本的手眼标定模块类可能长这样:

class HandEyeCalibrator {
public:
    struct CalibrationParams {
        Eigen::Matrix4d transform; // 最终的手眼变换矩阵 X
        double rotation_error;      // 平均旋转误差(弧度或度)
        double translation_error;   // 平均平移误差(米或毫米)
        int inliers_count;          // RANSAC内点数量
        bool is_valid;              // 标定结果是否有效
    };

    // 添加一组观测数据
    bool addObservation(const Eigen::Matrix4d& base_to_tool,
                        const Eigen::Matrix4d& cam_to_cal);

    // 执行标定,可选择使用RANSAC
    CalibrationParams calibrate(bool use_ransac = true,
                                double ransac_threshold = 1e-3,
                                int max_iterations = 1000);

    // 验证标定结果
    double evaluate(const std::vector<Observation>& validation_data);

    void clearData();

private:
    std::vector<Eigen::Matrix4d> base_to_tool_poses_;
    std::vector<Eigen::Matrix4d> cam_to_cal_poses_;

    // 核心求解函数
    bool solveAXXB(const std::vector<Eigen::Matrix4d>& A_vec,
                   const std::vector<Eigen::Matrix4d>& B_vec,
                   Eigen::Matrix4d& X);

    // RANSAC实现
    CalibrationParams calibrateRANSAC(double threshold, int max_iters);
};

在性能上,对于几十个位姿的数据量,即使使用RANSAC,在普通工控机上也能在秒级完成计算,完全满足离线标定的需求。如果追求极致的在线标定速度,可以考虑预先编译好矩阵运算库(如Eigen),并利用多线程来并行计算RANSAC的不同假设模型。

5. 不同应用场景下的实战策略

手眼标定不是一成不变的,在不同的工业应用场景下,侧重点和策略也需要调整。

5.1 高精度装配场景

在手机芯片贴装、精密齿轮装配等场景,精度要求常在0.05mm甚至更高。这时:

  • 标定板是关键:必须使用高精度、高平整度的陶瓷或玻璃基标定板,特征点加工精度要达到微米级。棋盘格尺寸要精确测量并输入。
  • 环境要稳定:避免振动、温漂。最好在恒温车间进行,并在机器人热机稳定后再标定。
  • 视觉算法要准:使用亚像素级别的角点提取算法,并且要考虑相机的镜头畸变,进行精确的相机内参标定。
  • 多次标定取平均:可以进行多次独立的标定流程,将结果取平均或中值,以抑制随机误差。

5.2 物流分拣场景

在快递包裹、箱体分拣等场景,精度要求相对较低(1-5mm),但场景复杂、目标多样、节拍要求高。

  • 标定流程需简化:可能无法使用固定的高精度标定板。可以采用“工具示教法”或“三点法”进行快速粗略标定。例如,让机器人末端工具尖端依次触碰工作区域内三个已知的物理点,同时相机识别工具尖端的像素位置,通过三点建立坐标系对应关系。这种方法精度稍差,但速度快,适合现场快速部署。
  • 动态补偿:如果相机安装在移动的AGV上(Eye-to-Hand但基座移动),或者需要抓取传送带上的物体,那么标定关系可能不是固定的。这时需要引入手眼+输送链跟踪的联合标定,或者使用动态视觉伺服,在运动中实时补偿。
  • 鲁棒性优先:光照变化、背景杂乱是常态。视觉识别部分要足够鲁棒,标定算法也要能容忍更大的噪声和异常点。

5.3 “眼在手上”(Eye-in-Hand)的特殊考量

当相机安装在机械臂末端时,标定流程和“眼在手外”有所不同:

  • 数据采集方式:通常固定标定板,然后移动机器人,让移动的相机从不同角度拍摄固定的标定板。此时,方程 AX=XB 中的 A 是机器人末端坐标系的变化,B 是相机坐标系的变化(因为相机在动),X 是末端到相机的变换。
  • 标定板视野:要特别注意规划机器人运动,确保在每一个位姿,相机都能看到完整的标定板,同时要避免机器人本体或线缆遮挡镜头。
  • 线缆影响:末端相机的线缆可能会随着运动拉扯,轻微改变相机相对于末端的姿态。对于超高精度应用,需要考虑线缆管理或使用无线图传。

6. 调试与故障排查:当标定结果不准时

即使按照所有步骤操作,第一次标定结果也可能不尽如人意。别慌,这是常态。我们可以像老中医一样“望闻问切”。

  • 症状:平移误差很大,但旋转还行。

    • 可能原因1:标定板尺寸输入错误。检查你在视觉算法中输入的棋盘格格子物理尺寸(单位:米/毫米)是否正确。这是最常见的错误之一。
    • 可能原因2:机器人运动范围太小,且主要平移运动,旋转激励不足。尝试让机器人末端在更大空间范围内运动,并加入更多绕不同轴的旋转。
    • 可能原因3:用于求解平移的线性方程组病态。可以尝试使用不同的数据配对方式(如非相邻位姿组合),或者增加数据量。
  • 症状:旋转误差很大,结果完全不对。

    • 可能原因1:机器人位姿数据 (toolHbase) 和视觉位姿数据 (camHcal) 的时间戳没有对齐。确保在机器人到达指定位置并稳定后,再触发相机拍照并记录机器人数据。
    • 可能原因2:坐标系定义混乱。务必清晰定义并统一所有坐标系:机器人基座坐标系、末端工具坐标系、相机坐标系、标定板坐标系。检查从机器人控制器读出的数据是基于哪个坐标系,视觉算法输出的又是基于哪个坐标系。一个常见的坑是:机器人厂家定义的末端坐标系原点可能不在工具尖点,你需要一个“工具坐标系”(Tool Center Point, TCP)标定来补偿。
    • 可能原因3:四元数转换错误。在从旋转矩阵到四元数,或从四元数到旋转矩阵的转换过程中,符号(四元数的正负表示同一旋转)或顺序(标量在前还是在后)搞错了。仔细检查你使用的数学库(如Eigen)的约定。
  • 症状:结果不稳定,每次标定都不一样。

    • 可能原因:数据噪声太大,或存在异常点。启用RANSAC,并观察内点率。如果内点率很低(比如低于50%),说明很多数据质量差。需要检查视觉识别成功率、机器人重复定位精度、现场是否有振动干扰等。
    • 对策:增加数据量,确保每个位姿采集多帧图像取平均,改善光照条件,在机器人停止并稳定后再采集数据。

我自己的习惯是,在标定程序里内置一个完整的诊断日志。它会记录每一次数据采集的位姿、视觉识别置信度、构造的A/B矩阵的条件数、SVD分解后的奇异值分布、RANSAC的内点索引等等。当结果不佳时,翻看这些日志,往往能迅速定位到问题环节。手眼标定是一个典型的“理论引导,工程实现,调试优化”三者紧密结合的技术。理解 AX=XB 是基础,但把它变成一个在产线上稳定、可靠、易用的工具,才是真正价值的体现。这个过程需要耐心、细致的实验和对每一个细节的深究。希望我分享的这些从理论到实战的经验,能帮你少走些弯路,更快地让机器人“眼明手快”起来。

机器人手眼标定 文章目录前言手眼标定标的是什么手眼标定原理眼在手上(Eye_in_hand)眼在手外(Eye_to_hand)怎么求解AX=XB误差分析以及如何减少误差 前言   前阵子由于参与一个自动加油机器人的项目,研究了一下机器人的手眼标定。借着写博客的机会把整个过程理通顺、消化消化(其实就是健忘~_ ~) 手眼标定标的是什么   我们开门见山,手眼标定标的是相机到机器人坐标系的变换矩阵。那么为什么要标这个呢?我们以加油机器人为例,要实现对加油盖的准确抓取,我们需要知道加油盖的位姿相对于机器人基坐标系下的位姿。这个 阅读详情

相关推荐

【OpenCV】机器人手眼标定原理及calibrateHandEye使用

1. 眼在手上 标定过程 标定板放置在固定位置,机器人变换不同的姿态,相机获取不同姿态下的标定板图像 目标 上图中描述了闭环的坐标系空间关系,包含以下部分: baseHtool^{base}H_{tool}baseHtool​​​​​​ 机器人末端的工具坐标系到机器人基坐标系的变换矩阵​。 可变量 camHtool^{cam}H_{tool}camHtool​ 机器人末端的工具坐标系到相机坐标系的变换矩阵。 不变量 camHcal^{cam}H_{cal}camHcal​​​​​​ 标定板坐标系到

zhy29563 1万+

UCI 心脏病数据集Heart Disease Data Set

在UCI机器学习库中,Heart Disease Data Set一共包含4个关于心脏病诊断的数据库。 其中数据分别来源自: Cleveland Clinic Foundation (cleveland.data) Hungarian Institute of Cardiology, Budapest (hungarian.data) V.A. Medical Center, Long Beach, CA (long-beach-va.data) University Hospital, Zurich,

m0_51732188的博客 2万+

基于ROS的机械臂手眼标定-Aruco使用与相机标定

基于ROS的机械臂手眼标定-Aruco使用与相机标定 折腾了一段时间的机械臂的手眼标定,相关资料挺多的,但使用起来都比较复杂,新手一般比较难搞懂。于是想做一个比较简单易懂易用的手眼标定程序。 程序都是Copy的开源代码,所以也开源出来: 开源地址:https://gitee.com/ohhuo/handeye-calib 作为手眼标定中的重要一环,相机中标定板位姿关系获取直接影响标定精度,我们使用aruco这个开源程序来实现坐标的获取。 #mermaid-svg-WkFpFkV4QqzXMvJ4 .labe

生活不止眼前的苟且 1万+

手眼标定_全面细致的推导过程

本文解决的问题: 机械手搭载双目相机,手眼标定。本文有细致的推导过程,非常全面。 什么是手眼标定?为什么会存在这个?使用李群李代数的方法求解AX=XB。

weixin_41074793的博客 3万+

手眼标定学习总结:原理、Tsai方法和Matlab代码

本文仅用于记录自己学习手眼标定过程的一些总结。 目录手眼标定基本原理求解AX=XBTsai方法Tsai的Matlab代码实现后记参考文献 手眼标定基本原理 符号统一: TxyT_x^yTxy​或T_y_x表示将一个点从x系的坐标转移到y系的坐标,后面一律用T_y_x形式,方便编辑。 T_c_t:从target(棋盘格)坐标系到camera坐标系,从图像计算得到 T_g_c:从camera到gripper(机械臂末端坐标系),这是手眼标定需要求的参数 T_b_g:从gripper到base(机械臂基底坐标

larrydong的博客 1万+

机械臂手眼标定-使用AUBO机械臂自动标定

机械臂手眼标定-使用AUBO机械臂自动标定 通过上两节的我们已经知道怎么使用已经获取的坐标数据进行计算手眼位姿,以及怎么获取标记物在相机中的位姿了,这一节我们来讲一下怎么使用AUBO的机械臂获取机械臂的位姿,以及如果使用我们的标定程序进行自动化的标定。 程序都是Copy的开源代码,所以也开源出来: https://gitee.com/ohhuo/handeye-calib #mermaid-svg-l3Ug2XnZPXqCnjEF .label{font-family:'trebuchet ms', ver

生活不止眼前的苟且 9329

标定学习笔记(四)-- 手眼标定详解

本文主要介绍了机器人手眼标定的相关原理与思路,介绍了两种不同安装条件下如何通过同组固定点进行手眼标定,及通过解决 问题进行手眼标定,最后给出了手眼标定的相关评价方式。文章重在进行标定过程的梳理以及相关公式的推导,主要目的还是为了厘清什么是手眼标定,以及如何进行手眼标定。

不学会C++不改名 5万+

ABB机器人安装双目相机后实现相机手眼标定der步骤详记

文章目录1、手眼标定需要从ABB机器人获得的所有数据信息2、手眼标定在OpenCV中所有需要使用的函数3、ABB机器人安装双目相机后手眼标定的步骤描述4、计算得到手眼矩阵后的后续5、写啥呢 1、手眼标定需要从ABB机器人获得的所有数据信息 1、如下图,abb机器人能够实时的读取到TCP点相对于工件坐标或者基坐标或者大地坐标(世界坐标)的空间坐标点(描述TCP点的平移向量)与四元数(描述TCP在该坐...

hello 7112

机器人手眼标定原理介绍(含详细推导过程)使用Tsai-Lenz算法

手眼标定原理及常用算法Tsai-Lenz介绍 上几节主要介绍了手眼标定程序的使用,但没有对手眼标定原理进行介绍,所以本文主要介绍手眼标定的原理,并介绍手眼标定算法Tsai-Lenz(实际是作者的名字)的计算过程,以及AX=XB的推导过程。 下一篇文章将会使用Python实现该算法 该算法适用于将相机装在手抓上和将相机装在外部两种情况 论文已经传到git上,地址: 本文中所说的夹爪=机器人末端执行器=机器人末端 如果你要进行手眼标定,可以参考我的其他文章: 手眼标定-基础使用 手眼标定-JAKA机械臂

生活不止眼前的苟且 3万+

相机标定、手眼标定(理论)

文章目录一、理论篇1.1 齐次变换矩阵(homogeneous transformation matrix )1.2 摄像机成像模型1.3 成像相关坐标系定义1.4 图像坐标系到相机坐标系的转换关系1.5 摄像机标定1.6 手眼标定 一、理论篇 1.1 齐次变换矩阵(homogeneous transformation matrix ) 我们知道,在三维空间准确描述执行器的状态,不仅要包括位置信息,也要包含姿态信息,即位姿(Pose)。齐次变换矩阵就是在机器人学中描述一个坐标系到另一个坐标系的变换关系的矩阵

qq_41184910的博客 2410

嚼一嚼Halcon中的3D手眼标定

要让机器人的手抓住杯子,就必须知道杯子跟手的相对位置关系,而杯子的位置则是通过机器人的眼睛看见的,所以,我们只需要知道机器人的手和眼睛的转换关系,就可以随时抓取机器人眼睛所看到的物体了。

Z's Palace 7234

手眼标定之基本原理

文章目录一 前言二 Eye-in-Hand2.1 基础知识准备2.2 Eye-in-Hand基本原理三 跋 原文首发于微信公众号【视觉IMAX】。 一 前言 机器人的视觉系统分为固定场景视觉系统和运动的「手-眼」视觉系统。摄像机与机器人的手部末端,构成手眼视觉系统。根据摄像机与机器人相互位置的不同,手眼视觉系统分为Eye-in-Hand系统和Eye-to-Hand系统。Eye-in-Hand...

3D视觉工坊 3万+

Netty UDP

UDP是一种无连接的协议,它并不在通信双方之间建立连接,而是直接将数据包从发送端发送到接收端。UDP不保证数据包的可靠传输,也不保证数据包的顺序,因此其传输速度通常比TCP快,且系统开销较小。然而,这也意味着UDP在某些情况下可能会丢失数据包或数据包到达的顺序错乱。

王小工小工历程 2028

python 手眼标定OpenCV手眼标定(calibrateHandeye())一

以下代码来源 本篇博客通过该代码,附上记录的公式与查找连接,方面以后调用能弄懂各个参数的意思 1.参数说明 calibrateHandeye() 参数描述如下:R_gripper2base,t_gripper2base是机械臂抓手相对于机器人基坐标系的旋转矩阵与平移向量,需要通过机器人运动控制器或示教器读取相关参数转换计算得到;R_target2cam , t_target2cam 是标定板相对于双目相机的齐次矩阵,在进行相机标定时可以求取得到(calibrateCamera()得到), 也可以通过sol

weixin_43134049的博客 2万+

大开眼界的十大开源人工智能项目

这是一个强大的开源工具,能让你在不同框架之间自由切换,无需重写代码。它是一个开源工具,能用简单的SQL语言同时处理数据和AI模型,让一切变得有序而高效。Rasa是我开发智能聊天机器人时的首选,它让你轻松掌控机器人对话的每个细节。我经常用它快速验证模型在不同框架下的表现,省去了大量烦躁的调试过程。最近发现的Vapi是一个以API方式提供的语音AI工具,开发者友好程度超乎想象。KNIME是一个以拖拽方式构建数据分析流程的开源工具,仿佛是数据界的乐高积木。它像个忠诚的守门员,确保你的模型始终健康运行。

wjianwei666的专栏 1108

利用正射影像对斜射图像进行反向投影

因此,RANSAC算法可以通过计算inliners和outliers的数量来评估估计关键点的质量,确保与其他点不一致的点不会在Homography矩阵中被估计。然后,它通过考虑关键点周围区域中图像的梯度大小和方向来计算每个提取的关键点的方向。由于单应性矩阵的计算可能会受到两个图像中异常值的存在的影响,这将导致矩阵的不正确估计并导致沿图像的对准和映射不良。FLANN匹配器的方法基于K近邻搜索的概念,即从图像中找到k个近邻。找到相机在正射影像坐标系中的位置并在正射影像上绘制重叠区域的边界框。

gis收藏家的博客 1513

机械臂手眼标定原理及代码

描述 本文将简要介绍机械臂手眼标定原理及相关知识 基础知识 了解手眼标定原理,就必须先了解一句话,叫做“右乘连体左乘基” 这句话实际上是读硕士期间,机器人学课程上老师讲的,我会专门写一篇文章来介绍这个定则,这篇我们先不介绍,只用最后的结论。 公式 Tobject−in−base  =Thand−in−baase⋅Tcamera−in−hand⋅Tobject−in−cameraT_{object-in-base\; }=T_{hand-in-baase}\cdot T_{camera-in-hand}\cd

weixin_42156097的博客 1万+

Sigrity Power DC Resitance Network Model Generation模式生成电阻SPICE模型操作指导

Sigrity Power DC Resitance Network Model Generation模式是用于提取负载每个pin电阻SPICE模型的,结果以spice网表形式展现,仍然以Motherboard.spd为例进行说明。目的是模拟实际情况,via的孔壁电镀1mil,中间是空心的,让via不完全被填充金属成为实心via。Upper/lower Tolerance:上下公差,设置为5%,也就是压降允许的范围。P/F Mode:通过/失败模式,选择Worst,最差的情况。

weixin_54787054的博客 420

线激光手眼标定

这篇文章聚焦于激光视觉传感器的构成和与焊接机器人之间的标定算法。研究的核心在于手眼标定,通过传感器与六自由度工业机器人的组合形成Eye-in-Hand系统。通过手眼标定,可以获得激光平面坐标系与法兰盘坐标系之间的齐次变换矩阵,从而将激光平面坐标系下的坐标值转换到机器人基坐标系下。这样,我们可以通过像素坐标值计算出特征点在机器人基坐标系下的坐标值。标定的精度直接影响着焊缝跟踪实验的准确性,因此标定算法是后续进行焊缝跟踪的基础。

antonw163com的博客 8397

AgentScope Java 2.0 最佳实践:9 个完整示例手把手带你开发 Java‑Agent

本文基于9 个完整示例,深入剖析从基础对话(BasicChatExample)、工具调用(@Tool 注解)、结构化输出(POJO Schema)、ToolGroup 自主管理、MCP 外部工具集成、Hook 生命周期监控、Spring Boot SSE 流式 Web、JsonSession 会话持久化到中断恢复的全链路实战教程。

program哲学 1671

AWR1843+DCA1000通过mmwave studio采集数据遇到的问题及解决方法

确保DCA1000的拨钮拨在了RADAR_5V_IN一边,这代表DCA1000通过与其相连的雷达板子供电,如果拨到了DC_JACK5V_IN一边,表示DCA1000用单独的电源供电。

qq_50974341的博客 4165

手眼标定原理

手眼标定

weixin_44356969的博客 1万+

PyQt5简介和安装

在initUI方法中,设置了窗口的标题和大小,并创建了一个按钮。PyQt5是一个功能强大的Python界面开发框架,可以轻松创建跨平台的图形用户界面应用程序。本文介绍了PyQt5的简介和安装方法,并提供了一个简单的示例应用程序来演示PyQt5的基本用法。PyQt5是一个功能强大的Python界面开发框架,它提供了丰富的工具和组件,用于创建跨平台的图形用户界面(GUI)应用程序。信号是控件发出的事件,槽是与之关联的处理函数。接下来,我们将编写一个简单的PyQt5应用程序,以演示PyQt5的基本用法。

XdKwargs的博客 225
上一篇: Windows下electron-builder打包超2G应用报错ERR_ELECTRON_BUILDER_CANNOT_EXECUTE的深度解析与根治方案
下一篇: FMCW毫米波雷达性能参数实战解析:从理论到应用场景优化
人间清醒863
博客等级 码龄3年 33粉丝 1544原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值