通过 Marker(视觉标记)获取机器人位姿

文章目录

前言

  我用最简单、最实用的方式讲清楚:怎么从视觉二维码 / 标记 → 算出机器人的位置和朝向(位姿)。

现在的场景和需求是:

  • 机器人上有摄像头
  • 环境里贴了 ArUco 视觉标记(Marker)
  • 想通过摄像头看到 Marker → 解算出机器人在地图中的坐标和朝向

一句话解释如何得到:摄像头看到 Marker → 计算出摄像头相机相对于 Marker 的位姿 → 通过坐标变换(TF)得到机器人相对于地图 / 世界坐标系的位姿。

实现步骤

ROS/ROS2 中,通过视觉 Marker 解算机器人位姿,一般按四个标准步骤实现:

前期标定

首先完成两个关键标定:

  • 相机内参标定
    使用标定板得到相机内参矩阵和畸变系数,用于后续去畸变和位姿解算。
  • 2、手眼标定(外参)
    得到相机相对于机器人本体坐标系(base_link)的变换关系
    T_{base}^{camera} 或 T_{camera}^{base}。
视觉 Marker 检测与位姿解算

使用 ArUco :

1、启动相机驱动usb_cam ,发布图像话题。

2、运行 Marker 检测节点,识别图像中的 Marker ID 与角点。

3、基于 Marker 实际物理尺寸,通过 PnP 算法 解算相机相对于 Marker 的旋转矩阵和平移向量。

4、节点会输出 Marker 的位姿话题(pose),并发布 TF 坐标变换。

构建完整 TF 坐标树

关键是建立一条完整坐标变换链:

bash 复制代码
map → marker → camera  → base_link
复制代码
预先发布 Marker 在地图 / 世界坐标系下的固定位姿 TF
视觉节点发布 marker → camera
手眼标定结果发布 camera → base_link
TF 树会自动闭合,直接可查机器人在世界系下的位姿。
获取并使用机器人位姿

1、 通过 TF 监听 map → base_link,直接得到机器人 6DoF 位姿。

2、 可将该位姿用于:

  • 里程计漂移校正

  • 全局重定位

  • 精准停靠 / 抓取

    工程上通常会与轮速里程计、IMU 进行 EKF/UKF 融合,提升平滑度和鲁棒性。

总结

  整体流程就是:标定 → 检测解算 → TF 坐标变换 → 多传感器融合定位,最终得到机器人在世界坐标系下的精确位姿;

  详细流程总结:

  • 先做相机内参标定和相机与机器人的手眼标定,得到相机内参和坐标系外参。
  • 摄像头识别 ArUco这类 Marker,用PnP 算法解算出相机相对于 Marker 的位姿。
  • 已知 Marker 在世界 / 地图中的固定坐标,通过TF 坐标变换,把坐标系串起来: 世界→Marker→相机→机器人本体。
  • 最终直接得到机器人在世界坐标系下的完整位姿,工程上还会和里程计、IMU 融合,让定位更稳定。

常见问题解答

1、 为什么要用 PnP?

 因为已知 3D 物理点(Marker 角点)和 2D 图像点,

PnP 能唯一求解相机相对于 Marker 的旋转和平移,是视觉定位标准算法。

2、 只有一个 Marker 够吗?

 单个 Marker 可定位,但容易受遮挡、抖动影响。工程上一般用多个 Marker 构成标签板,增加观测约束,提高精度和稳定性。

3、怎么和导航融合?

 将视觉解算的位姿作为观测值,输入到 robot_localization 等滤波节点,与里程计、IMU 融合,输出平滑、连续、抗漂移的定位结果。

PnP 算法详解

  1. PnP 就是已知 2D点、3D点、内参 K,反解外参 R、t。
    简述:PnP 是根据已知的 3D 空间点和对应 2D 图像点,求解相机位姿的算法。在 Marker 定位中,用 Marker 四个角的 3D 坐标和图像 2D 坐标,结合相机内参,通过 PnP 解算出相机相对于 Marker 的旋转和平移,最终推导出机器人位姿

作用:已知N个3D空间点,以及它们在图像上的 2D 投影点,求解相机在空间中的6DoF位姿(旋转 R + 平移 t)。

  • 3D点:Marker 四个角点在Marker 自身坐标系下的坐标(已知);
  • 2D 点:这四个角在图像上的像素坐标(检测出来);
  • 求解:相机相对于 Marker 的 R、t;

2、 核心原理

根据小孔成像模型:

简单解释:

  • 左边:图像 2D 像素点;
  • 右边 K:相机内参(焦距、光心,已标定);
  • R\|t:相机外参 → 就是我们要求的位姿;
  • XYZ:3D 空间点
  1. 需要多少个点?
    P3P:最少 3 个点,可求出 4 组解,再用第 4 点验证
    Marker 正好 4 个角点,非常适合 PnP,点越多,鲁棒性越强,通常配合 RANSAC 去除外点噪声;
  2. 常用求解方法
    1、P3P
    几何解法,速度快,适合实时视觉定位。
    2、EPnP(Efficient PnP)
    精度高、速度快,OpenCV 默认用这个,是工程首选。

5、PnP 到底是怎么算出相机位姿的?

 可以这么理解:我在空间里放了几个已知精确位置的点(就是 Marker 的四个角),相机拍下它们,得到图像上的像素点。因为相机的成像规律是固定的(小孔成像),同一个空间点,相机站在不同位置、不同角度,拍到的像素位置是不一样的。

PnP 就是反过来算:根据这几组 "空间点 ↔ 像素点" 的对应关系,反推出相机当时站在哪儿、朝哪个方向拍;
精简后总结一句话:PnP 就是利用已知的 3D 点和对应的 2D 像素点,根据成像几何关系,反算出相机在空间里的位置和朝向。

用Marker 如何实现自动回充

实现思路:

1、机器人在导航快接近充电桩时,启动视觉检测寻找充电桩上贴的Marker。

2、通过 PnP 算法解算相机相对于 Marker 的精确位姿得到相机到充电桩的距离、偏角、俯仰角。

3、通过坐标变换,得到机器人base_link 相对于充电桩的位姿知道机器人离充电座还有多远、偏了多少角度。

4、进入精细对准阶段

机器人根据视觉位姿,进行小范围平移、旋转,一步步调整姿态,精准对准充电电极。 完成对接后缓慢后退 / 前进,实现自动充电

整个过程就是:

全局导航粗略靠近 → 视觉 Marker 精定位 → 闭环控制对准 → 充电对接

以上讲解如果帮到您请点赞加收藏哦,如有错误欢迎指正!

相关推荐
clorinda3 小时前
OpenCV图像增强基础——图像金字塔、直方图与特征提取
人工智能·opencv·计算机视觉
陈皮波比茶3 小时前
Python项目实战-网络机器人(爬虫)
开发语言·网络·爬虫·python·机器人
zx_741484815 小时前
【计算机视觉入门】基于 OpenCV 的银行卡号识别综合案例
人工智能·opencv·计算机视觉
宏集科技工业物联网6 小时前
微型线性伺服执行器如何驱动人形机器人关节?从驱动原理到实际选型
经验分享·机器人·具身智能·人形机器人·线性伺服执行器
一知半解仙8 小时前
当机器人学会泛化,而我在写Java:一名后端开发者的2026年8月21日观察手记
java·开发语言·机器人
别动我齐刘海18 小时前
机器人运动控制学习2——基础进阶
c++·人工智能·神经网络·学习·目标检测·机器学习·机器人
闻道且行之20 小时前
图片处理助手|泊松融合原理 + C++ 工程实现,seamlessClone 三模式一次讲透
数据库·c++·人工智能·opencv
HBYKKJ1 天前
格雷希尔GFL浮动组件:大范围浮动补偿赋能自动化产线高效柔性对接,兼容大部分对正场景,适配市面常见的机器人末端执行器与工装安装板
人工智能·机器人·自动化
恒锐丰小瑞1 天前
率能SS6810H 32V/1A/双通道H桥驱动芯片,PWM电流控制与混合衰减模式,用于POS打印机/安防相机/机器人
嵌入式硬件·数码相机·机器人·硬件工程
thesky1234561 天前
智能体面试准备(四十三):具身智能体与机器人实操——从 VLA 到 Sim2Real
机器人·导航·操作·具身智能·智能体·vla·视觉语言动作