当前位置: 首页 > news >正文

平面运动机器人的传感器外参标定

简述

对任意两个传感器进行外参标定可以采用手眼标定算法来完成,但是,传统手眼标定算法对于运动具有一定的要求,可以证明,至少需要两个以上轴角方向不同的旋转运动才可以正确估计出外参旋转,因此,如果使用手眼标定算法标定外参,例如标定imu与激光雷达、imu与相机、多激光雷达的外参… 那么需要充分的全方位空间的旋转和平移运动,才可以成功完成标定。

但是如果机器人是处于平面运动的地面机器人呢?那么这个时候很可能很多的外参都是不可观的,准确来说,依然存在一个特殊情况,使得我们可以使用特定的算法标定出除了z轴平移外的全部参数,即其中一个传感器旋转运动时的轴角方向和它的z轴刚好平行,除此之外,也就是说如果你的传感器安装角度不满足这个条件,那么就别指望仅靠平面上运动就能完成标定。

简单来说,对于平面运动机器人的传感器外参标定,有两个结论:
1、如果其中一个传感器的旋转运动的轴角方向与其传感器坐标z轴是平行的,那么可以标定出除了z轴平移外的全部参数。
2、任意安装的两个传感器在平面运动下外参不可观。

例如,平面运动机器人中,轮速计、2d激光雷达等和车体平行安装的传感器都满足结论一的条件。下面将介绍如何通过算法求解出外参。

算法

分为两个步骤 1、先求解出旋转的pitch和roll。2、求解yaw、x,y。

step1:
首先我们知道手眼标定的旋转关系:
q R i R i + 1 ⊗ q R C = q R C ⊗ q C i C i + 1 q^{R_{i+1}} _{R_i}\otimes q^C_R=q^C_R \otimes q^{C_{i+1}}_{C_i} qRiRi+1qRC=qRCqCiCi+1其中R表示任何与车体水平安装的传感器(例如轮速计、2D激光…),C表示任意其他3D传感器如相机、3D激光雷达… 外参旋转为 q R C q^C_R qRC
注意符号 q b a q^a_b qba表示a->b的旋转,即 q b a q_{ba} qba
由上式得:
q R i R i + 1 ⊗ q R C − q R C ⊗ q C i C i + 1 = 0 = > ( Q L ( q R i R i + 1 ) − Q R ( q C i C i + 1 ) ) q R C = 0 (1) q^{R_{i+1}}_{R_i}\otimes q^C_R-q^C_R \otimes q^{C_{i+1}}_{C_i}=0 \\ =>\begin{aligned} (Q_L(q^{R_{i+1}}_{R_i})-Q_R(q^{C_{i+1}}_{C_i}))q^C_R=0 \end{aligned}\tag{1} qRiRi+1qRCqRCqCiCi+1=0=>(QL(qRiRi+1)QR(qCiCi+1))qRC=0(1)

Q L , Q R Q_L,Q_R QL,QR即四元数的左乘、右乘矩阵。
因此转换为了一个齐次线性方程组,在给定约束 ∣ ∣ q R C ∣ ∣ = 1 ||q^C_R||=1 ∣∣qRC∣∣=1下求解该方程的最小二乘解即可解得 q R C q^C_R qRC
但是由于我们的运动被限制为平面运动,上面方程的秩为2,存在多余的零空间维度,因此无法正确求解,因此我们采用别的技巧进行处理,首先将外参旋转表示为z-y-z 欧拉角形式:
q R C = q z ( α ) q y ( β ) q z ( γ ) (2) \begin{aligned} q^C_R=q_z(\alpha)q_y(\beta)q_z(\gamma)\end{aligned}\tag{2} qRC=qz(α)qy(β)qz(γ)(2) q z ( α ) q_z(\alpha) qz(α)即绕z轴旋转 α \alpha α角度 , q y ( β ) q_y(\beta) qy(β)为绕y轴旋转 β \beta β角度。
根据轴角到四元数的转换关系 q = [ c o s α 2 , u s i n α 2 ] q=[cos\frac{\alpha}{2},usin\frac{\alpha}{2}] q=[cos2α,usin2α],可得:
q z ( α ) = [ c o s α 2 , 0 , 0 , s i n α 2 ] T q_z(\alpha)=[cos\frac{\alpha}{2},0,0,sin\frac{\alpha}{2}]^T qz(α)=[cos2α,0,0,sin2α]T q y ( β ) = [ c o s β 2 , 0 , s i n β 2 , 0 ] T q_y(\beta)=[cos\frac{\beta}{2},0,sin\frac{\beta}{2},0]^T qy(β)=[cos2β,0,sin2β,0]T

将(2)带入(1)可得:
q R i R i + 1 ⊗ q z ( α ) q y ( β ) q z ( γ ) − q z ( α ) q y ( β ) q z ( γ ) ⊗ q C i C i + 1 = 0 q^{R_{i+1}}_{R_i}\otimes q_z(\alpha)q_y(\beta)q_z(\gamma)\\-q_z(\alpha)q_y(\beta)q_z(\gamma)\otimes q^{C_{i+1}}_{C_i}=0 qRiRi+1qz(α)qy(β)qz(γ)qz(α)qy(β)qz(γ)qCiCi+1=0关键来了,由于传感器R的旋转轴与z轴平行,因此可将 q R i R i + 1 q^{R_{i+1}}_{R_i} qRiRi+1 q z ( α ) q_z(\alpha) qz(α)的顺序交换,可得下式:
δ = q z ( α ) ⊗ q R i R i + 1 q y ( β ) q z ( γ ) − q z ( α ) q y ( β ) q z ( γ ) ⊗ q C i C i + 1 = q z ( α ) ( q R i R i + 1 q y ( β ) q z ( γ ) − q y ( β ) q z ( γ ) q C i C i + 1 ) \delta =q_z(\alpha) \otimes q^{R_{i+1}}_{R_i} q_y(\beta)q_z(\gamma)\\-q_z(\alpha)q_y(\beta)q_z(\gamma)\otimes q^{C_{i+1}}_{C_i}\\=q_z(\alpha)(q^{R_{i+1}}_{R_i} q_y(\beta)q_z(\gamma)-q_y(\beta)q_z(\gamma)q^{C_{i+1}}_{C_i}) δ=qz(α)qRiRi+1qy(β)qz(γ)qz(α)qy(β)qz(γ)qCiCi+1=qz(α)(qRiRi+1qy(β)qz(γ)qy(β)qz(γ)qCiCi+1)
显然,
q R i R i + 1 q y ( β ) q z ( γ ) − q y ( β ) q z ( γ ) q C i C i + 1 = 0 q^{R_{i+1}}_{R_i} q_y(\beta)q_z(\gamma)-q_y(\beta)q_z(\gamma)q^{C_{i+1}}_{C_i}=0 qRiRi+1qy(β)qz(γ)qy(β)qz(γ)qCiCi+1=0
q y ( β ) q z ( γ ) q_y(\beta)q_z(\gamma) qy(β)qz(γ)记为 q Y Z q_{YZ} qYZ,
q Y Z = [ c o s ( β 2 ) c o s ( γ 2 ) s i n ( β 2 ) s i n ( γ 2 ) s i n ( β 2 ) c o s ( γ 2 ) c o s ( β 2 ) s i n ( γ 2 ) ] (3) \begin{aligned} q_{YZ}=\begin{bmatrix} cos(\frac{\beta}{2})cos(\frac{\gamma}{2})\\sin(\frac{\beta}{2})sin(\frac{\gamma}{2}) \\ sin(\frac{\beta}{2})cos(\frac{\gamma}{2})\\cos(\frac{\beta}{2})sin(\frac{\gamma}{2})\end{bmatrix}\end{aligned} \tag{3} qYZ= cos(2β)cos(2γ)sin(2β)sin(2γ)sin(2β)cos(2γ)cos(2β)sin(2γ) (3)

于是,这个问题转换为一个求解 q Y Z q_{YZ} qYZ的最小二乘问题:
q Y Z = arg min ⁡ q Y Z ∣ ∣ M q Y Z ∣ ∣ 2 M = [ L ( q R i R i + 1 ) − R ( q C i C i + 1 ) . . L ( q R 0 R 1 ) − R ( q C 0 C 1 ) ] q_{YZ}=\argmin \limits_{q_{YZ}}||Mq_{YZ}||^2\\ M=\begin{bmatrix} L(q^{R_{i+1}}_{R_i})-R(q^{C_{i+1}}_{C_i}) \\ .\\.\\L(q^{R_{1}}_{R_0})-R(q^{C_{1}}_{C_0})\end{bmatrix} qYZ=qYZargmin∣∣MqYZ2M= L(qRiRi+1)R(qCiCi+1)..L(qR0R1)R(qC0C1)
可以证明,这个矩阵M的秩为2,证明过程见文献【2】,因此,上述最小二乘解的零空间维度为2,因此我们需要继续寻找约束,根据(3)式可知: q Y Z 1 q Y Z 2 = q Y Z 3 q Y Z 4 q_{YZ1}q_{YZ2}=q_{YZ3}q_{YZ4} qYZ1qYZ2=qYZ3qYZ4另外表示旋转的四元数都是单位四元数: ∣ ∣ q Y Z ∣ ∣ 2 = 1 ||q_{YZ}||_2=1 ∣∣qYZ2=1对于上述齐次线性最小二乘问题,其解为 M T M M^TM MTM最小特征值对应的特征向量,因为M的秩为2,因此有两个为0的最小特征值,这两个0特征值对应的两个线性无关的特征向量记为 t 1 , t 2 t_1,t_2 t1,t2,它们构成了零空间的一组基(实对称矩阵必能对角化,有n个相同的特征值必然存在n个不相关的特征向量),因此解可以表示为: q Y Z = a t 1 + b t 2 q_{YZ}=at_1+bt_2 qYZ=at1+bt2根据上面给出的两个约束即可以求解出 a , b a,b a,b
需要注意的是,由于噪声影响, M T M M^TM MTM最终是满秩的,并不会有两个真正为0的特征值,因此只需要取2个最小的特征值对应的特征向量即可。

step2求解yaw,x,y

根据手眼标定,有关系:
( R ( q R i R i + 1 ) − I ) p R C − R Z ( α ) R ( q Y Z ) p C i C i + 1 + p R i R i + 1 = 0 (R(q^{R_{i+1}}_{R_i})-I)p^C_R-R_Z(\alpha)R(q_{YZ})p^{C_{i+1}}_{C_i}+p^{R_{i+1}}_{R_i}=0 (R(qRiRi+1)I)pRCRZ(α)R(qYZ)pCiCi+1+pRiRi+1=0其中, q Y Z q_{YZ} qYZ即step1求解的结果, R Z ( α ) R_Z(\alpha) RZ(α)即外参旋转待求的一部分, p R C p^C_R pRC为待求外参平移。
由于外参平移中,z发生变化时传感器的运动观测保持不变 ,因此z方向的平移是不可观的,因此将外参平移z设为0,并丢弃上式第3行,
R ( q Y Z ) p C i C i + 1 R(q_{YZ})p^{C_{i+1}}_{C_i} R(qYZ)pCiCi+1即将传感器C的运动投影到运动平面,令: R ( q Y Z ) p C i C i + 1 = [ p i 1 p i 2 p i 3 ] R(q_{YZ})p^{C_{i+1}}_{C_i}=\begin{bmatrix}p_{i_1}\\p_{i_2}\\p_{i_3}\end{bmatrix} R(qYZ)pCiCi+1= pi1pi2pi3
带入上式并忽略第3行,可得: ( R ( q R i R i + 1 ) − I ) 2 × 2 [ p x p y ] − [ c o s α − s i n α s i n α c o s α ] [ p i 1 p i 2 ] + p R i R i + 1 = 0 (R(q^{R_{i+1}}_{R_i})-I)_{2\times2}\begin{bmatrix}p_x\\p_y\end{bmatrix}-\\\begin{bmatrix}cos\alpha&-sin\alpha \\ sin\alpha & cos\alpha \end{bmatrix}\begin{bmatrix} p_{i_1}\\ p_{i_2}\end{bmatrix}+p^{R_{i+1}}_{R_i}=0 (R(qRiRi+1)I)2×2[pxpy][cosαsinαsinαcosα][pi1pi2]+pRiRi+1=0
使用最小二乘法即可解得 p x , p y , α p_x,p_y,\alpha px,py,α,具体细节见参考文献【2】。

reference:

[1] 标定系列一 | 机器人手眼标定的基础理论分析 https://zhuanlan.zhihu.com/p/93183788?utm_psn=1706381723099791360
[2] An Analytical Least-Squares Solution to the Odometer-Camera Extrinsic Calibration Problem

相关文章:

平面运动机器人的传感器外参标定

简述 对任意两个传感器进行外参标定可以采用手眼标定算法来完成,但是,传统手眼标定算法对于运动具有一定的要求,可以证明,至少需要两个以上轴角方向不同的旋转运动才可以正确估计出外参旋转,因此,如果使用…...

【星海随笔】SDN neutron (二) Neutron-plugin(ML2)

Neutron架构之Neutron-plugin Core-plugin(ML2)篇 Neutron-server接收两种请求: REST API请求:接收REST API请求,并将REST API分发到对应的Plugin(L3RouterPlugin)。 RPC请求:接收Plugin agent请求&#…...

野火i.MX6ULL开发板检测按键evtest(Linux应用开发)

之前一直查找不到evtest,因为没有下载成功,很可能是网络不好,下次可以软件源可以换成国内大学镜像网站。 重新断开板子电源启动,再次连接网络,下载evtest成功!!...

k8s存储

nfs 理论上nfs 其实并不是存储设备,它是一种远程共享存储服务。 k8s 存储卷 volume emptyDir:可以实现pod中的容器之间共享数据, 但是存储卷不能持久化数据,且会随着pod的生命周期一起删除。 hostpash:可以实现持久…...

数据分析实战 | 贝叶斯分类算法——病例自动诊断分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 八、模型评价 九、模型调参 十、模型预测 一、数据及分析对象 CSV文件——“bc_data.csv” 数据集链接:https://download.csdn.net/d…...

实用技巧:嵌入式人员使用http服务模拟工具模拟http服务器测试客户端get和post请求

文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/134305752 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…...

P9836 种树

容易想到分解因数。 对于一个数 p p p 的因数个数,假设它可以被分解质因数成 a 1 i 1 a 2 i 2 a 3 i 3 ⋯ a k c k a_1^{i_1} a_2^{i_2} a_3^{i_3}\cdots a_k^{c_k} a1i1​​a2i2​​a3i3​​⋯akck​​ 的形式,则其因数个数为 ( i 1 1 ) ( i 2 1 )…...

C# 查询腾讯云直播流是否存在的API实现

应用场景 在云考试中,为防止作弊行为的发生,会在考生端部署音视频监控系统,当然还有考官方监控墙系统。在实际应用中,考生一方至少包括两路直播流: (1)前置摄像头:答题的设备要求使…...

JAVA开源项目 于道前端项目 启动步骤参考

1. 安装 启动过程有9个步骤: 1.1 安装 Node JS , V18版本的 (安装步骤省略) 1.2 安装 npm install -g yarn ,node JS里边好像自带npm ,通过npm的命令安装 yarn 1.3 切换到项目中去安装,npm install &a…...

深入理解ElasticSearch分片

1. 路由计算 当索引一个文档的时候,文档会被存储到一个主分片中。 Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?当我们创建文档时,它如何决定这个文档应当被存储在分片 1 还是分片 2 中呢?首先这肯定不会是随机的&…...

【Python】AppUI自动化—appium自动化元素定位、元素事件操作(17)下

文章目录 前言一.Appium 元素定位1.定位方式种类2.如何定位2.1 id定位2.2 className定位2.3 content-desc 定位2.4 Android Uiautomator定位4.1 text定位4.2 text模糊定位4.3 text正则匹配定位4.4 resourceId定位4.5 resourceId正则匹配定位4.6 className定位4.7 className正则…...

SpringBoot使用MyBatis多数据源

SpringBoot使用MyBatis多数据源 我们以 Mybatis Xml和注解两种版本为例,给大家展示如何如何配置多数据源。 1、注解方式 数据库文件: DROP TABLE IF EXISTS users; CREATE TABLE users (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键id,userN…...

小程序版本审核未通过,需在开发者后台「版本管理—提交审核——小程序订单中心path」设置订单中心页path,请设置后再提交代码审核

小程序版本审核未通过,需在开发者后台「版本管理—提交审核——小程序订单中心path」设置订单中心页path,请设置后再提交代码审核 因小程序尚未发布,订单中心不能正常打开查看,请先发布小程序后再提交订单中心PATH申请 初次提交…...

Netty入门指南之NIO Selector监管

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者! 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏:Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言问题解…...

Spring Cloud学习(六)【统一网关 Gateway】

文章目录 网关的功能搭建网关服务路由断言工厂Route Predicate Factory路由过滤器 GatewayFilter过滤器执行顺序跨域问题处理 网关的功能 网关功能: 身份认证和权限校验服务路由、负载均衡请求限流 在SpringCloud中网关的实现包括两种: gatewayzuul …...

基于单片机的空调智能控制器的设计

**单片机设计介绍,基于单片机的空调智能控制器的设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的空调智能控制器需要具备输入输出端口、定时器、计数器等模块,以便对空调进行精确控制。下…...

Spring Boot自动配置原理、实战、手撕自动装配源码

Spring Boot自动配置原理 相比较于传统的 Spring 应用,搭建一个 SpringBoot 应用,我们只需要引入一个注解 SpringBootApplication,就可以成功运行。 前面四个不用说,是定义一个注解所必须的,关键就在于后面三个注解&a…...

111111111111111

全局锁 就是对整个数据库进行加锁,加锁之后整个数据库就处于只读状态,后续的DML写语句,DDL语句,以及对更新事务的提交操作都会被阻塞,典型地使用场景就是做整个数据库的逻辑备份,对所有的表进行锁定&#x…...

React动态生成二维码和毫米(mm)单位转像素(px)单位

一、使用qrcode.react生成二维码,qrcode.react - npm 很简单,安装依赖包,然后引用就行了 npm install qrcode.react或者 yarn add qrcode.react直接上写好的代码 import React, {useEffect, useState} from react; import QRCode from qr…...

SpringMvc 常见面试题

1、SpringMvc概述 1.1、什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦&am…...

微信小程序之bind和catch

这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...