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

自动驾驶两个传感器之间的坐标系转换

有两种方式可以实现两个坐标系的转换。
车身坐标系下一个点p_car,需要转换到相机坐标系下,旋转矩阵R_car2Cam,平移矩阵T_car2Cam。点p_car在相机坐标系下记p_cam.

方法1:先旋转再平移

p_cam = T_car2Cam * p_car + T_car2Cam
需要注意的是,这里的平移矩阵T_car2Cam是车身坐标系原点在相机坐标系下面的坐标!
用具体数值表示如下:

import numpy as nprot = np.array([[ 4.6776832e-04, -9.9942386e-01, -3.3936482e-02],[ 3.1350527e-02,  3.3934463e-02, -9.9893224e-01],[ 9.9950832e-01, -5.9665786e-04,  3.1348340e-02]])tran = np.array([0.106073,  1.411398, -1.971551])p_veh = np.array([3, 6, 8]).reshape(3, 1)
p_cam_1 = rot.dot(p_veh) + tran.reshape(3,1)
print(p_cam_1)#[[-6.16055871]#[-6.28240156]#[ 1.27418073]]

方法2:先平移再旋转

在方法1中, 是把p经过旋转,转到相机坐标系, 再加上平移向量,这个平移向量就是相机坐标系的,所以可以直接相加减。
同样的,我们这里的方法2是需要先平移,就要求平移的向量是车身坐标系下的才能相加减。就是我们如果现在需要先平移,那么就要求这个平移向量是在车身坐标系下的才能直接相加减。
即需要知道相机坐标原点相对于车身坐标系。

如图就是把左边的相机坐标系原点(0,0,0)先平移到车身坐标系的原点(0,0,0)处,注意平移后的还是在相机坐标系下,现在tran = np.array([0.106073, 1.411398, -1.971551])是相机坐标系下,car坐标系原点的位置。
就是在相机坐标系下一个点Q(0.106073, 1.411398, -1.971551),我现在就要把我相机坐标系原点挪到这个Q点。就是Q点在新相机坐标系下是(0, 0, 0). 所以之前的点n转到以Q点为原点的新相机坐标系需要经过n-(0.106073, 1.411398, -1.971551),

比如之前的原点(0,0,0)转到新平移后的Q为原点相机坐标系下是:(0,0,0)-(0.106073, 1.411398, -1.971551)

相机坐标系原点平移到车身坐标系原点,这个时候还差一步旋转。旋转,注意这个时候的旋转矩阵是需要相机坐标系到车身坐标系的,因为我们现在点都在相机坐标系下,只是平移了,需要相机到车身的旋转矩阵,直接R_car2Cam取个逆就是。

Cam_0_to_car = inv(R_car2Cam) * (Cam_0 - T_car2Cam)

import numpy as npR_car2Cam = np.array([[ 4.6776832e-04, -9.9942386e-01, -3.3936482e-02],[ 3.1350527e-02,  3.3934463e-02, -9.9893224e-01],[ 9.9950832e-01, -5.9665786e-04,  3.1348340e-02]])T_car2Cam = np.array([0.106073,  1.411398, -1.971551])p_car = np.array([3, 6, 8]).reshape(3, 1)
p_cam_1 = R_car2Cam.dot(p_car) + T_car2Cam.reshape(3,1)
print(p_cam_1)#旋转矩阵的逆等于其转置
Cam_0_to_car = (np.dot(R_car2Cam.T, (np.array([[0, 0, 0]]).T - T_car2Cam[..., np.newaxis])).T).reshape(3,1)
p_cam_2 = R_car2Cam.dot(p_car - Cam_0_to_car)
print(p_cam_2)
输出:
[[-6.16055871][-6.28240156][ 1.27418073]]
[[-6.16055872][-6.28240152][ 1.27418082]]

RT矩阵的逆

import numpy as npR_car2Cam = np.array([[ 4.6776832e-04, -9.9942386e-01, -3.3936482e-02],[ 3.1350527e-02,  3.3934463e-02, -9.9893224e-01],[ 9.9950832e-01, -5.9665786e-04,  3.1348340e-02]])T_car2Cam = np.array([0.106073,  1.411398, -1.971551])p_car = np.array([3, 6, 8]).reshape(3, 1)
p_cam_1 = R_car2Cam.dot(p_car) + T_car2Cam.reshape(3,1)
print(p_cam_1)Cam_0_to_car = (np.dot(R_car2Cam.T, (np.array([[0, 0, 0]]).T - T_car2Cam[..., np.newaxis])).T).reshape(3,1)
p_cam_2 = R_car2Cam.dot(p_car - Cam_0_to_car)
print(p_cam_2)rt = np.eye(4)
rt[:3, :3] = R_car2Cam
rt[:3, -1] = T_car2Cam
rt_1 = np.linalg.inv(rt)print("===>rt")
print(rt)
print("===>inv rt")
print(rt_1)print("==>>Cam_0_to_car")
print(Cam_0_to_car)
[[-6.16055871][-6.28240156][ 1.27418073]]
[[-6.16055872][-6.28240152][ 1.27418082]]
===>rt
[[ 4.6776832e-04 -9.9942386e-01 -3.3936482e-02  1.0607300e-01][ 3.1350527e-02  3.3934463e-02 -9.9893224e-01  1.4113980e+00][ 9.9950832e-01 -5.9665786e-04  3.1348340e-02 -1.9715510e+00][ 0.0000000e+00  0.0000000e+00  0.0000000e+00  1.0000000e+00]]
===>inv rt
[[ 4.67768326e-04  3.13505285e-02  9.99508364e-01  1.92628402e+00][-9.99423904e-01  3.39344610e-02 -5.96657759e-04  5.69405203e-02][-3.39364847e-02 -9.98932217e-01  3.13483392e-02  1.47529553e+00][ 0.00000000e+00  0.00000000e+00  0.00000000e+00  1.00000000e+00]]
==>>Cam_0_to_car
[[1.92628394][0.05694051][1.47529556]]

这里求相机坐标原点在车身坐标系下的坐标, 其实用RT矩阵再求逆就可以得到。

相关文章:

自动驾驶两个传感器之间的坐标系转换

有两种方式可以实现两个坐标系的转换。 车身坐标系下一个点p_car,需要转换到相机坐标系下,旋转矩阵R_car2Cam,平移矩阵T_car2Cam。点p_car在相机坐标系下记p_cam. 方法1:先旋转再平移 p_cam T_car2Cam * p_car T_car2Cam 需要注…...

信号——进程间通信(20250225)

1. 信号 管道:进程间数据通信(同步通信) 信号:进程间通信,用来发送通知(异步通信,中断) 1)同步通信:发送端和接收端,使用同一时钟通信 异步通信:发送端和接收端使用不同时钟通信 …...

transformer架构嵌入层位置编码之动态NTK-aware位置编码

前文,我们已经构建了一个小型的字符级语言模型,是在transformer架构基础上实现的最基本的模型,我们肯定是希望对该模型进行改进和完善的。所以我们的另外一篇文章也从数据预处理、模型架构、训练策略、评估方法、代码结构、错误处理、性能优化等多个方面提出具体的改进点,但…...

东信营销科技巨额补贴仍由盈转亏:毛利率大幅下滑,现金流告急

《港湾商业观察》施子夫 近期,东信营销科技有限公司(以下简称,东信营销科技)递表港交所,联席保荐机构为海通国际和中银国际。 东信营销科技的国内运营主体为深圳市东信时代信息技术有限公司。尽管期内收入规模有所提…...

[电感、磁珠、0欧姆电阻]的区别与应用特性

1. 电感(Inductor) 基础特性: 储能元件:通过磁场存储能量,阻碍电流突变()。 核心参数:电感值(L)、额定电流、直流电阻(DCR)、自谐振频率(SRF)。 频率特性:感抗 ,(通直流、阻交流),低频时阻抗低,高频时阻抗高(但受SRF限制)。 电路符号及实物:多为绕线结…...

车载诊断架构 --- LIN节点路由转发注意事项

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…...

前端 AJAX 二、AJAX使用

环境准备: 使用AJAX技术我们需要用到HTML/CSS/JS/jQuery/JavaWeb相关知识,原生的JS也可以进行AJAX的操作,但是相对比较繁琐也没有必要,故此我们使用jQuery封装后的AJAX技术来进行学习; 创建AJAX请求 $.ajax({url : "ajax/getName?id"id,// ajax请求的…...

Windows - 通过ssh打开带有图形界面的程序 - 一种通过计划任务的曲折实现方式

Windows(奇思妙想) - 通过ssh打开带有图形界面的程序 - 一种通过计划任务的曲折实现方式 前言 Windows启用OpenSSH客户端后就可以通过SSH的方式访问Windows了。但是通过SSH启动的程序: 无法显示图形界面会随着SSH进程的结束而结束 于是想到了一种通过执行“计划…...

Android ViewStub延迟初始化加载布局View,Kotlin

Android ViewStub延迟初始化加载布局View&#xff0c;Kotlin activity_my.xml: <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_…...

Web自动化之Selenium下Chrome与Edge的Webdriver常用Options参数

目录 引言 说明 Add_argument() 添加方式 常用参数 Add_experimental_option() 添加方式 常用方法 任务结束后仍然保持浏览器打开 禁用“Chrome 正受到自动测试软件的控制”提示 设置下载路径 禁用弹窗拦截 禁用图片加载 禁用 JavaScript 注意 引言 …...

数据安全_笔记系列05:数据合规与隐私保护(GDPR、CCPA、中国《数据安全法》)深度解析

数据安全_笔记系列05&#xff1a;数据合规与隐私保护&#xff08;GDPR、CCPA、中国《数据安全法》&#xff09;深度解析 在全球数据跨境流动和隐私保护强监管的背景下&#xff0c;企业需同时满足多法域合规要求。以下从 法规要点、核心差异、实施策略、跨境传输、典型案例 等维…...

AF3 DataPipeline类process_multiseq_fasta 方法解读

AlphaFold3 data_pipeline 模块DataPipeline类的 process_multiseq_fasta 方法用于处理多序列 FASTA 文件,生成 AlphaFold3 结构预测所需的特征,适用于多链复合物的预测。它结合了 Minkyung Baek 在 Twitter 上提出的“AlphaFold-Gap”策略,即通过在多链 MSA 中插入固定长度…...

中国的Cursor! 字节跳动推出Trae,开放Windows版(附资源),开发自己的网站,内置 GPT-4o 强大Al模型!

Trae是什么 Trae 是字节跳动推出的免费 AI IDE&#xff0c;通过 AI 技术提升开发效率。支持中文&#xff0c;集成了 Claude 3.5 和 GPT-4 等主流 AI 模型&#xff0c;完全免费使用。Trae 的主要功能包括 Builder 模式和 Chat 模式&#xff0c;其中 Builder 模式可帮助开发者从…...

图片爬取案例

修改前的代码 但是总显示“失败” 原因是 修改之后的代码 import requests import os from urllib.parse import unquote# 原始URL url https://cn.bing.com/images/search?viewdetailV2&ccidTnImuvQ0&id5AE65CE4BE05EE7A79A73EEFA37578E87AE19421&thidOIP.TnI…...

Go语言中的信号量:原理与实践指南

Go语言中的信号量&#xff1a;原理与实践指南 引言 在并发编程中&#xff0c;控制对共享资源的访问是一个经典问题。Go语言提供了丰富的并发原语&#xff08;如sync.Mutex&#xff09;&#xff0c;但当我们需要灵活限制并发数量时&#xff0c;信号量&#xff08;Semaphore&am…...

Qt如何将数据传入labview,Qt又如何从labview中读取数据?

Qt如何将数据传入labview,Qt又如何从labview中读取数据? Qt如何将数据传入labviewQt如何从labview中读取数据 Qt如何将数据传入labview Qt如何从labview中读取数据...

vue3学习2

ts定义接口&#xff1a; 引入的时候要加type&#xff1a; 调用&#xff1a; ts创建自定义type类型&#xff0c;引入的时候也要加type&#xff1a; reactive可以直接传泛型&#xff1a; 加?声明不强制&#xff1a; defineProps接收父组件传递的props&#xff0c;其中defineProp…...

spring中手写注解开发(创建对象篇)

说明&#xff1a; 在spring底层中并不是我写的如此&#xff0c;这篇只是我用我自己的方式实现了使用注解组件扫描并且 创建对象&#xff0c;方法并不是很难&#xff0c;可以看一看&#xff0c;欢迎大佬评论 第一步&#xff1a; 我们需要自己写一个注解&#xff0c;我用的是idea…...

Android OpenGLES2.0开发(十一):渲染YUV

人生如逆旅&#xff0c;我亦是行人 Android OpenGLES开发&#xff1a;EGL环境搭建Android OpenGLES2.0开发&#xff08;一&#xff09;&#xff1a;艰难的开始Android OpenGLES2.0开发&#xff08;二&#xff09;&#xff1a;环境搭建Android OpenGLES2.0开发&#xff08;三&am…...

在linux中利用conda安装blast

在 Linux 中使用 conda 安装 BLAST 非常简单。conda 是一个流行的包管理工具&#xff0c;可以轻松安装和管理生物信息学工具&#xff0c;包括 BLAST。以下是具体步骤&#xff1a; 1. 确保已安装 Conda 如果你还没有安装 conda&#xff0c;可以参考以下步骤安装 Miniconda&…...

终极React Native Permissions测试与调试指南:从Jest模拟到真机调试的完整手册

终极React Native Permissions测试与调试指南&#xff1a;从Jest模拟到真机调试的完整手册 【免费下载链接】react-native-permissions An unified permissions API for React Native on iOS, Android and Windows. 项目地址: https://gitcode.com/gh_mirrors/re/react-nativ…...

嵌入式系统课程设计:基于STM32和CLIP-GmP-ViT-L-14的智能分类垃圾桶

嵌入式系统课程设计&#xff1a;基于STM32和CLIP-GmP-ViT-L-14的智能分类垃圾桶 1. 项目缘起&#xff1a;一个有趣又实用的想法 你有没有想过&#xff0c;家里的垃圾桶要是能自己“认”垃圾就好了&#xff1f;可回收的瓶子扔进去&#xff0c;它自动打开可回收桶的盖子&#x…...

Qwen3-TTS-12Hz-1.7B-Base真实案例:为无障碍考试系统生成标准化语音试卷

Qwen3-TTS-12Hz-1.7B-Base真实案例&#xff1a;为无障碍考试系统生成标准化语音试卷 你有没有想过&#xff0c;对于视障人士来说&#xff0c;参加一场普通的考试有多困难&#xff1f;传统的纸质试卷对他们来说是无法逾越的障碍&#xff0c;而人工朗读试卷又存在效率低、成本高…...

从理论到实践:深入剖析LightGaussian如何实现3DGS的极致压缩与加速

1. LightGaussian为何能成为3DGS压缩的颠覆者 去年还在为3D高斯泼溅&#xff08;3DGS&#xff09;的存储问题头疼的我&#xff0c;第一次看到LightGaussian论文时差点从椅子上跳起来。这个来自德克萨斯大学奥斯汀分校和厦门大学团队的工作&#xff0c;直接把3DGS模型从782MB压缩…...

React Native应用发布苹果商店:解决hermes.framework的dSYM缺失问题

1. 为什么React Native应用发布苹果商店会报dSYM缺失错误 最近在帮团队处理React Native应用上架苹果商店时&#xff0c;遇到了一个让人头疼的问题。打包上传后&#xff0c;苹果商店后台报错提示&#xff1a;"The archive did not include a dSYM for the hermes.framewor…...

深入解析Buildroot:从零构建定制化Linux根文件系统

1. Buildroot入门&#xff1a;嵌入式开发的瑞士军刀 第一次接触Buildroot是在2015年开发智能家居网关时&#xff0c;当时我们需要一个仅占用8MB存储空间的轻量级Linux系统。传统发行版动辄几百MB的体积完全不适合资源受限的嵌入式设备&#xff0c;而手动构建根文件系统又像在走…...

CSS文本渲染在不同操作系统差异_使用font-smoothing平滑化

-webkit-font-smoothing 在 macOS 和 Windows 上表现不一致&#xff0c;因依赖系统渲染机制&#xff1a;macOS 默认 subpixel 抗锯齿更柔&#xff0c;Windows 用 grayscale 更硬&#xff1b;该属性仅 WebKit 有效&#xff0c;且受 font-weight、transform 等限制&#xff0c;全…...

JavaScript 递归调用栈深度解析与层级遍历陷阱详解

本文深入剖析 javascript 中递归函数的执行栈行为&#xff0c;结合二叉树遍历实例&#xff0c;揭示因边界检查顺序不当导致的空指针异常、输出截断问题&#xff0c;并对比说明递归实现的“伪层级遍历”与真正 bfs 层序遍历的本质区别。 本文深入剖析 javascript 中递归函数…...

从婴儿学步到AI进化:具身智能如何模仿人类学习过程?

从婴儿学步到AI进化&#xff1a;具身智能如何模仿人类学习过程&#xff1f; 在东京大学的一个实验室里&#xff0c;一台人形机器人正尝试用机械手指捏起桌上的积木。它失败了37次&#xff0c;却在第38次成功时将动作数据上传至云端——这个场景像极了人类婴儿第一次成功抓取玩具…...

【2026奇点大会权威解码】:多模态内容生成的5大技术拐点与企业落地避坑指南

第一章&#xff1a;2026奇点智能技术大会&#xff1a;多模态内容生成 2026奇点智能技术大会(https://ml-summit.org) 核心突破&#xff1a;统一跨模态表征架构 本届大会首次公开了“OmniBridge-3”基础模型&#xff0c;该模型摒弃传统模态专用编码器设计&#xff0c;采用动态…...