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

用Python和Nuscenes数据集,手把手教你搞懂自动驾驶的6大坐标系转换

用Python和Nuscenes数据集实战自动驾驶6大坐标系转换第一次接触自动驾驶感知系统时最让人头疼的莫过于各种坐标系之间的转换关系。记得去年参与一个多传感器融合项目时团队花了整整两周时间调试坐标系对齐问题——雷达检测到的行人位置总是比摄像头看到的偏移两米。后来发现是某个外参矩阵的旋转顺序写反了。本文将用Nuscenes数据集和Python代码带您亲手实现六大坐标系的相互转换避开那些年我们踩过的坑。1. 环境准备与数据加载1.1 安装必要工具包在开始前需要配置以下环境建议使用Python 3.8pip install nuscenes-devkit matplotlib numpy opencv-python pyquaternion注意pyquaternion库用于处理三维旋转比手动计算旋转矩阵更可靠1.2 加载Nuscenes数据集样本我们从数据集中选取一个包含相机和激光雷达数据的样本from nuscenes.nuscenes import NuScenes nusc NuScenes(versionv1.0-mini, dataroot/path/to/dataset, verboseTrue) sample nusc.sample[10] # 选取第10个样本 # 获取前视摄像头(CAM_FRONT)数据 cam_data nusc.get(sample_data, sample[data][CAM_FRONT]) # 获取激光雷达数据 lidar_data nusc.get(sample_data, sample[data][LIDAR_TOP])2. 坐标系定义与可视化2.1 六大坐标系精解在自动驾驶系统中这些坐标系构成了感知的骨架坐标系类型维度原点位置轴方向典型用途像素坐标系2D图像左上角u向右, v向下图像标注图像坐标系2D图像中心x向右, y向下镜头畸变校正相机坐标系3D相机光心X右, Y下, Z前三维重建激光雷达系3D雷达中心X右, Y前, Z上点云处理车体坐标系3D车辆中心X前, Y左, Z上传感器融合世界坐标系3D地图原点依地图定义全局定位2.2 使用Matplotlib可视化坐标系让我们绘制出各坐标系的关系示意图import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig plt.figure(figsize(12, 8)) ax fig.add_subplot(111, projection3d) # 绘制坐标系箭头 def draw_axis(ax, origin, directions, color, label): for i, (dir, c) in enumerate(zip(directions, [r, g, b])): ax.quiver(*origin, *dir, colorc, arrow_length_ratio0.1) ax.scatter(*origin, ccolor, labellabel) # 示例坐标系实际应用中需替换为真实外参 draw_axis(ax, [0,0,0], [[1,0,0], [0,1,0], [0,0,1]], k, World) draw_axis(ax, [2,2,2], [[0.7,0.7,0], [-0.7,0.7,0], [0,0,1]], b, Camera) draw_axis(ax, [3,0,1], [[0.8,0,0.6], [0,1,0], [-0.6,0,0.8]], r, Lidar) ax.set_xlim([0, 5]); ax.set_ylim([0, 5]); ax.set_zlim([0, 5]) ax.set_xlabel(X); ax.set_ylabel(Y); ax.set_zlabel(Z) ax.legend(); plt.tight_layout(); plt.show()3. 核心转换实战3.1 相机内参从3D到2D的桥梁相机内参矩阵K将相机坐标系下的3D点投影到2D图像平面import numpy as np # 从Nuscenes获取相机内参 cam_calib nusc.get(calibrated_sensor, cam_data[calibrated_sensor_token]) K np.array(cam_calib[camera_intrinsic]) # 3x3内参矩阵 def project_3d_to_2d(points_3d, K): 将相机坐标系下的3D点投影到像素坐标系 points_2d K points_3d.T points_2d points_2d / points_2d[2, :] # 齐次坐标归一化 return points_2d[:2].T # 测试投影 test_point np.array([10, 0, 50, 1]) # 相机前方50米右侧10米 uv project_3d_to_2d(test_point.reshape(1,-1), K) print(f投影像素坐标: {uv.squeeze()})3.2 外参矩阵坐标系间的空间关系外参矩阵描述传感器之间的相对位姿# 获取相机到车体的变换矩阵 cam2ego np.eye(4) cam2ego[:3, :3] np.array(cam_calib[rotation]) cam2ego[:3, 3] np.array(cam_calib[translation]) # 获取激光雷达到车体的变换 lidar_calib nusc.get(calibrated_sensor, lidar_data[calibrated_sensor_token]) lidar2ego np.eye(4) lidar2ego[:3, :3] np.array(lidar_calib[rotation]) lidar2ego[:3, 3] np.array(lidar_calib[translation]) # 计算相机到激光雷达的变换 cam2lidar np.linalg.inv(lidar2ego) cam2ego3.3 完整转换链路示例实现世界坐标系到像素坐标系的完整转换def world_to_pixel(point_world, cam_data, nusc): 世界坐标 - 像素坐标 # 获取各变换矩阵 calib nusc.get(calibrated_sensor, cam_data[calibrated_sensor_token]) K np.array(calib[camera_intrinsic]) ego2global nusc.get(ego_pose, cam_data[ego_pose_token]) # 构建变换矩阵 world2ego np.eye(4) world2ego[:3, :3] Quaternion(ego2global[rotation]).rotation_matrix world2ego[:3, 3] np.array(ego2global[translation]) ego2cam np.linalg.inv(np.eye(4)) ego2cam[:3, :3] np.array(calib[rotation]) ego2cam[:3, 3] np.array(calib[translation]) # 坐标变换 point_cam ego2cam np.linalg.inv(world2ego) point_world uv K point_cam[:3] uv / uv[2] return uv[:2] # 使用示例 point_world np.array([20, 5, 0, 1]) # 齐次坐标 uv world_to_pixel(point_world, cam_data, nusc)4. 典型问题排查指南4.1 常见错误排查表现象可能原因检查方法投影位置偏移外参平移量错误验证传感器安装位置参数物体变形旋转顺序错误检查欧拉角转旋转矩阵的顺序深度异常坐标系Z轴方向不一致确认各坐标系Z轴正方向定义尺度不符单位不统一检查平移量单位(m/mm)4.2 调试技巧可视化中间结果在每个转换步骤后输出并可视化坐标值print(fCamera坐标系下的点: {point_cam})使用已知几何体验证# 创建立方体点云验证投影 cube_points np.array([[0,0,0], [1,0,0], [0,1,0], [0,0,1], [1,1,0], [1,0,1], [0,1,1], [1,1,1]])检查矩阵可逆性assert np.linalg.det(rotation_matrix) ≈ 1.0, 旋转矩阵行列式应为1在真实项目中坐标系对齐问题往往需要结合标定板数据反复验证。最近我们在处理一个雨天场景时发现激光雷达和相机的坐标转换在50米外会出现厘米级偏差后来发现是温度变化导致雷达支架轻微变形所致。这类问题没有银弹扎实的基础加细致的调试才是王道。

相关文章:

用Python和Nuscenes数据集,手把手教你搞懂自动驾驶的6大坐标系转换

用Python和Nuscenes数据集实战自动驾驶6大坐标系转换第一次接触自动驾驶感知系统时,最让人头疼的莫过于各种坐标系之间的转换关系。记得去年参与一个多传感器融合项目时,团队花了整整两周时间调试坐标系对齐问题——雷达检测到的行人位置总是比摄像头看到…...

告别SSH断连焦虑:手把手教你用Screen在Linux后台挂起任务(含源码编译避坑)

告别SSH断连焦虑:Linux后台任务守护神器Screen实战指南凌晨三点,服务器上的深度学习模型训练到第18个小时,突然笔记本电量耗尽——这是许多开发者经历过的噩梦。当重新连接SSH时,那些本应持续运行的任务早已随着终端关闭而终止。这…...

通过Docker部署FastAPI应用程序

🌞欢迎来到PyTorch深度学习实战的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 📆首发时间:🌹2026年5月24日🌹 ✉️希望可以和大家…...

Win7专业版电脑重启后时间服务总停止?三步设置让它稳定运行(附命令详解)

Win7时间服务异常终极修复指南:从原理到实战每次重启Win7电脑后,右下角的时间总是停留在过去?这可能是Windows时间服务(w32time)在捣鬼。作为系统核心组件之一,时间服务不仅影响时钟显示,更会干…...

鸿蒙数理体系创作说明 (鸿蒙数学一阶完结后更新说明)

本套鸿蒙数学体系,并非凭空独创,而是站在华夏千年古数根基之上,融合西方近代数理实证体系,双向重构、文明合一所诞生的全新本源数理框架。一、本体系继承、吸纳的【华夏传统古数核心本源】整套体系的底层大道骨架、思维范式、宇宙…...

在CentOS7服务器上装Win10?手把手教你用Ventoy搞定双系统(附网卡驱动安装避坑指南)

在CentOS7服务器上实现Win10双系统:Ventoy实战与驱动避坑指南 当Linux服务器遇上Windows需求,双系统成为了一种优雅的解决方案。本文将带你深入探索在CentOS7生产环境中部署Win10双系统的完整流程,特别针对服务器硬件特性提供定制化指导。 …...

2026电工杯数学建模竞赛A题论文、代码、数据

2026年电工杯数学建模竞赛A题完整论文 摘要 随着” 双碳” 战略深入推进,新能源消纳难的问题日益凸显,绿电直连型电氢氨园区成为解决新能源就近消纳和化工行业深度脱碳的重要路径。本文针对绿电直连型电氢氨园区的优化运行问题,基于风电 40MW…...

文章三:Elasticsearch 集群恢复和索引分布

集群恢复网关与集群索引分布必要性了解在 Elasticsearch(简称 ES)集群运维中,集群重启恢复、残余索引处理、索引分片分布是保障集群稳定性、数据完整性、读写性能的三大核心基础能力。多数集群故障、数据丢失、分片异常、读写卡顿问题&#x…...

Codex入门19-数据库操作(解放双手:用自然语言写SQL、建表和数据迁移)

Codex入门19-数据库操作(解放双手:用自然语言写SQL、建表和数据迁移) 📌 文章简介:写 SQL 是后端开发的日常,但复杂的 JOIN、子查询、窗口函数总让人头疼。本文教你用 Codex CLI 实现:自然语言直接生成 CREATE TABLE、复杂 SQL 查询、数据库迁移脚本(Prisma/Knex/Alem…...

Codex入门18-批量文件操作(效率神器:一句话批量重命名、格式化、清理几百个文件)

Codex入门18-批量文件操作(效率神器:一句话批量重命名、格式化、清理几百个文件) 📌 文章简介:手动改100个文件名?逐个格式化代码?一个个加版权声明?这些重复劳动该结束了。本文带你用 Codex CLI 一句话搞定批量重命名、批量格式化、批量添加文件头注释、批量清理垃圾…...

Codex入门17-上下文管理(高手秘技:如何让AI精准理解你的百万行大型项目)

Codex入门17-上下文管理(高手秘技:如何让AI精准理解你的百万行大型项目) 📌 文章简介:上下文窗口是 AI 编程的"生命线"——它决定了 AI 能"看到"多少代码、"理解"多少架构。本文深入解析上下文窗口的本质,详解 Codex 如何自动收集项目信息…...

从0开始打造自己的压缩软件(仅文字适配)上——文本的压缩

一、理清步骤 首先作为一个程序,我们必然是要一个输入的,可能是个文本,也可能是其他的内容。那么这个输入输出不能是像过去一样在终端中输入,所以这里要引入我们的io流——即为我们的输入和输出的具体办法。 然后,我们…...

if语句

含义if就是判断条件,满足就执行,不满足就跳过,相当于“如果……就……”代码基础格式:if 条件:满足条件才运行的代码(打完冒号之后要按回车键自动缩进,直接顶格写会报错,手动缩进不符…...

2026最好用的图片处理工具推荐:去水印 / 抠图 / 高清化实测对比

2026最好用的图片处理工具推荐:去水印 / 抠图 / 高清化实测对比 前言:一张图片毁掉一个项目?别让烂工具耽误你 2026年,AI图片处理技术早已不是三年前的水平。发丝级抠图、去水印无痕、超分辨率重建……这些功能听起来很美好&…...

Claude Code 接入 DeepSeek

安装 Claude Code DeepSeek 文档: 使用如下命令安装 Claude Code: npm install -g anthropic-ai/claude-code安装完成后,可以输入下面的命令检查是否安装成功。 claude --version购买 DeepSeek API 创建 Api Key 点击如下链接创建 DeepSeek API Ke…...

P15895 [TOPC 2025] One-Way Abyss 题解

P15895 [TOPC 2025] One-Way Abyss Link: https://www.luogu.com.cn/problem/P15895 题目描述 米蒂是一位勇敢的冒险家,正在探索一个名为“深渊”的神秘地下洞穴系统。深渊由 nnn 条垂直的竖井和 mmm 条水平的隧道组成。每条隧道恰好连接同一深度上的两条竖井。所…...

一文讲清楚规则、Skill、MCP

想象一下,你要开一家餐厅,并招聘了一位AI员工。这三样东西,就是你管理这位新员工的完整装备。1. 规则 —— 餐厅的“企业文化手册”• 这是什么:这是你给AI员工的第一份文件,一本总纲领、总章程。它不教具体怎么做菜&a…...

别再手动下载DLL了!用Windows自带工具SFC/SCANNOW一键修复kernel32.dll错误

别再手动下载DLL了!用Windows自带工具SFC/SCANNOW一键修复kernel32.dll错误当电脑屏幕上突然弹出"无法定位程序输入点kernel32.dll"的红色警告框时,大多数人的第一反应是打开浏览器搜索"如何下载kernel32.dll"。这个看似合理的操作背…...

告别.bash_profile:在macOS Ventura/Sonoma上为Maven配置环境变量的几种新方法(含Zsh教程)

macOS Ventura/Sonoma时代:Maven环境变量配置的现代实践指南如果你最近升级到了macOS Ventura或Sonoma,可能会发现那些教你修改.bash_profile来配置Maven环境变量的教程突然不灵了。这不是你的问题——而是macOS的Shell环境已经悄然进化。作为长期在macO…...

企业官网后台的工程化设计:内容建模、所见即所得与源码自主可控

企业官网后台的工程化设计:内容建模、所见即所得与源码自主可控 “网站做完我们自己能改吗?要不要技术?”——这个业务问题,在工程层面其实是问:这套 CMS 的内容模型、编辑体验、权限和可维护性设计得怎么样。 后台&qu…...

Win10桌面右键新建菜单丢了记事本?别慌,手把手教你用注册表找回来(附权限设置详解)

Win10右键新建菜单丢失记事本?三步精准修复与权限管理指南刚泡好的咖啡还在冒热气,你像往常一样在桌面右键点击"新建",却发现那个最常用的"文本文档"选项凭空消失了。这不是个例——微软官方社区数据显示,每月…...

Bi-LSTM vs CNN-BiLSTM:实战对比哪个模型更适合你的时间序列预测任务?

Bi-LSTM与CNN-BiLSTM实战抉择:时间序列预测的黄金选择法则当面对时间序列预测任务时,选择正确的模型架构往往能决定项目的成败。Bi-LSTM和CNN-BiLSTM作为两种主流的深度学习模型,各自在特定场景下展现出独特优势。本文将带您深入剖析这两种模…...

别再为立体匹配发愁了!手把手教你用Fusiello法搞定双目相机极线校正(附Python代码)

双目视觉实战:Fusiello极线校正算法详解与Python实现在计算机视觉领域,立体匹配是获取三维场景信息的关键步骤。但原始双目图像由于相机位置差异,导致匹配搜索空间复杂,计算效率低下。本文将深入解析Fusiello极线校正算法的数学原…...

避坑指南:在openEuler 22.03上配置vsftpd虚拟用户,解决gdbmtool替代db_load的认证问题

深度解析:在openEuler 22.03上配置vsftpd虚拟用户的最佳实践 最近在openEuler 22.03上配置vsftpd虚拟用户时,我发现了一个让不少从CentOS/RHEL迁移过来的管理员头疼的问题:传统的 db_load 方法在这里行不通了。经过一番探索和踩坑&#xff…...

MacBook新手福音:用Final Cut Pro 10.6.5搞定你的第一门视频课(附保姆级设置与导出指南)

MacBook新手福音:Final Cut Pro 10.6.5视频课制作全流程精解第一次打开Final Cut Pro时,那个布满陌生术语的界面是否让你望而却步?作为Mac用户专属的视频剪辑利器,它其实远比想象中友好。本文将带你用最直接的方式,从零…...

别再让Ubuntu卡成PPT!手把手教你用swapfile把交换空间从1G扩容到64G(附权限修复)

Ubuntu系统Swap空间扩容实战:从1G到64G的完整解决方案当你在Ubuntu上运行内存密集型任务时,是否遇到过系统突然变得异常缓慢,甚至完全卡死的情况?很多拥有大内存(如32GB或更高)的用户可能会惊讶地发现&…...

别再只认ldd了!盘点5种查看Linux程序动态库依赖的方法(含静态/交叉编译场景)

超越ldd:Linux二进制依赖分析的5种专业方法解析在Linux系统管理和开发中,遇到"不是动态可执行文件"的错误提示时,很多工程师的第一反应是困惑——明明是可执行文件,为什么ldd无法识别?这个问题背后隐藏着Lin…...

【程序源代码】答题微信小程序(含源码)

关键字:答题,小程序,OCR, 题目识别,题库,练习,错题集,微信小程序,Vue项目名称:答题微信小程序答题小程序是面向学生群体打造的轻量化在线答题学习平台,基于微…...

交通顶刊TR Part C 2026年6月论文导读(下)

一期刊简介Transportation Research Part C (TR-C): Emerging Technologies 是交通领域顶刊,由 Elsevier 出版,中科院与 JCR 均为 1 区,近年影响因子约8–9.6。该期刊以交通系统为核心,聚焦 AI、大数据、运筹学等新兴技术对交通规…...

AI应用开发岗面经

1、请先做一下自我介绍。2、你的毕设作品,从产品需求设计到后续开发全流程,都是你一个人独立完成的吗?3、你为什么会选择做这个毕设项目?4、你在做这个项目的过程中,遇到的比较大的挑战是什么?5、你为什么会…...