VINS、MAVROS等的坐标系统一(草稿,未得出明确结果)

news2024/11/16 7:47:17

由于不同算法之间的坐标系不同,导致计算的结果混乱,该博客的目的是记录和统一不同算法之间的坐标系,保证坐标系的统一

一、VINS算法

  1. vins算法,使用D435I相机。
  2. 该坐标方向为:右前上分别为xyz
  3. 角度:由于是四元素,暂时不考虑
  4. 使用xtdrone的代码,其中xyz方向还是右前上,
import rospy
from geometry_msgs.msg import PoseStamped, Point
from nav_msgs.msg import Odometry
import math
from pyquaternion import Quaternion
import tf
import sys

vehicle_type = sys.argv[1]
vehicle_id = sys.argv[2]
local_pose = PoseStamped()
local_pose.header.frame_id = 'world'
quaternion = tf.transformations.quaternion_from_euler(0, -math.pi/2, math.pi/2)
q = Quaternion([quaternion[3],quaternion[0],quaternion[1],quaternion[2]])

def vins_callback(data):    
    local_pose.pose.position.x = data.pose.pose.position.x
    local_pose.pose.position.y = data.pose.pose.position.y
    local_pose.pose.position.z = data.pose.pose.position.z
    q_= Quaternion([data.pose.pose.orientation.w,data.pose.pose.orientation.x,data.pose.pose.orientation.y,data.pose.pose.orientation.z])
    q_ = q_*q
    local_pose.pose.orientation.w = q_[0]
    local_pose.pose.orientation.x = q_[1]
    local_pose.pose.orientation.y = q_[2]
    local_pose.pose.orientation.z = q_[3]
    
rospy.init_node(vehicle_type+"_"+vehicle_id+'_vins_transfer')
rospy.Subscriber("/vins_estimator/camera_pose", Odometry, vins_callback,queue_size=1)
position_pub = rospy.Publisher(vehicle_type+"_"+vehicle_id+"/mavros/vision_pose/pose", PoseStamped, queue_size=1)
rate = rospy.Rate(30) 

while not rospy.is_shutdown():
    if (local_pose.pose.position == Point()):
        continue
    else:
        print("Vins pose received")
        local_pose.header.stamp = rospy.Time.now()
        position_pub.publish(local_pose) 
    try:
        rate.sleep()
    except:
        continue
  

二、MAVROS坐标

  1. 无人机坐标方向没有统一的概念,他是根据外部输入进行输出的。在vins输入中,由于初始化是在右前上,所以得到的local_position就为右前上。对于GPS定位,由于初始化是东北天?,所以就导致出使的xyz也是东北天,这和无人机的方位没有关系。
  2. 所以问题就在于,融合imu的时候,需要考虑imu的方向。
  3. imu加速度方向:向上加速为z增加;向前加速x增加;向左加速y增加。
  4. imu角速度方向:绕x轴(加速度轴)逆时针为x(角速度变量)增加、绕y轴逆时针为y增加,绕z轴逆时针为z增加
  5. imu四元素合成:imu会根据加速度和角速度进行一个四元素融合,得到xyzw值。

三、四元素和欧拉角

  1. 感觉四元素和欧拉角还有点不明确,通过这两个链接进一步了解:四元素与欧拉角和欧拉角的旋转。了解到,欧拉角的旋转有旋转顺序,我喜欢用ZYX,但是mavros是什么就不知道了的;欧拉角是根据自身的坐标系进行下一次的旋转的,这是根据IMU特性决定的,因此不是根据实验参考坐标系来,欧拉角的定义存在死锁问题,比如绕y旋转90°时,会导致z与x的旋转融合。四元素的定义是,绕旋转轴(xyz)旋转一个角度w,就是这么简单;其中w就是旋转角一半的余弦;xyz也要也是对应角度余弦(我还以为是矢量坐标,好像就是诶);最后,为了平方和为1,所以将xyz是之前的角度余弦呈上w得到的。
  2. 仿真和转换网站:四元素转换网站,可以用来仿真欧拉角的死锁,转换理解。

四、理解ros imu中的的四元素

  1. imu的四元素的坐标又是以什么的坐标系来的呢,这值得思考。初步发现,w值居然不是为1,而是0.7,这是为什么呢?默认猜测是如下,imu已经将绕z轴旋转了90°了。
    四元素旋转
  2. tf_conversions.transformations.quaternion_from_euler(roll, pitch, yaw) # 说明欧拉顺序为XYZ
    quaternion = tf.transformations.quaternion_from_euler(0, -math.pi/2, math.pi/2)

q = Quaternion([quaternion[3],quaternion[0],quaternion[1],quaternion[2]]) # 这是因为得到的是xyzw,但是要转为wxyz

q_= Quaternion([data.pose.pose.orientation.w,data.pose.pose.orientation.x,data.pose.pose.orientation.y,data.pose.pose.orientation.z]) q_ = q_*q # 这是让原有视觉WXYZ进行一个坐标转换,得到的转换结果

  1. 问题来了,视觉VIO旋转方向为什么要转这样一个角度,旋转的角度是发生了什么。
  2. 旋转的角度:根据上述的VINS方向,原VIO方向为右前上,进行(0, -math.pi/2, math.pi/2)
    转换后为前下左。(难道前下左为imu方向???)
    在这里插入图片描述
  3. 如果按照imu可能的前左上(确定是FLU了,根据https://zhuanlan.zhihu.com/p/410800248得到),转换回去的视觉是下前右。到底是什么呢,再来思考下。imu这边默认是东北天吧,在ENU坐标系中,X轴为正东方向,Y轴为正北方向,Z轴向上,单位为米。
  4. 在px4官网中提到,将外部的定位方式转换为NED的方式,即北东地,但这个是PX4自己的,不是MAVROS的。同样上述链接中,存在存在mavros坐标系的描述,如下:。表明MAVROS的坐标是FRD,需要转换成这样吗?
    在这里插入图片描述

四、总结

  1. mavros使用RTK定位,坐标是ENU;
  2. 正式确定,imu_data的坐标方向未FLU(同样也是ENU东北天,加速度和旋转),即前面为x,左边为y,上面为z。在初始化的时候,可能出现w为负数的情况,这里要注意了,当w为负数,所有的xyz因为都乘上了w才得到的,所有xyz的方向会被认为是反过来了。当绕z轴转360°就会发现所有的都回来了。
  3. 上述对于四元素的定义有问题,实际为如下。这样四元素的平方和才为1,并且可以表示出不同的旋转方向。当w接近1时,表示角度为0,此时不管绕z轴逆时针还是正时针,w都会减小,但xyz中的sin则表现出正负号,体现出了旋转方向。
    在这里插入图片描述
  4. 明天看下vins的旋转坐标系,进行统一……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot+Vue实现前后端分离的心理咨询系统

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue.js 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JD…

代码随想录刷题记录 day38 最后一块石头的重量+目标和+1和0

代码随想录刷题记录 day38 最后一块石头的重量目标和1和0 参考:代码随想录 1049. 最后一块石头的重量 II 思想 把数组的石头尽可能地分成大小相等地两个集合 即sum/2; 容量为sum/2地背包尽可能地装满石头。 代码 class Solution {public int last…

C/C++入门002-C语言组成

文章目录1. C工程创建1.1 基于Code::Blocks创建工程1.2 Code::Blocks界面设置2. C语言程序组成2.1函数2.1.1 主函数2.1.2 其它函数2.1.3 如何执行定义好的函数2.2 输出函数printf2.2.1 编译输出为exe可执行文件2.3 C语言要求2.3.1 注释2.4 C语言程序练习2.4.1 输出三角形代码1&…

【MySQL基础】数据库定义语言DDL相关操作有那些?

目录 一、什么是DDL? 二、对数据库的常用操作 三、对表结构的常见操作 四、修改表结构格式 💟 创作不易,不妨点赞💚评论❤️收藏💙一下 一、什么是DDL? DDL(Data Definition Language) 被称为数据库定义语言,该…

如何基于企业微信通讯录,同步生成对外的LDAP服务?

不少企业使用企业微信作为办公协同的工具,并通过企业微信的组织架构(即通讯录)来管理员工身份。那么如何利用当前企业微信的组织架构和用户身份,同步生成对外的 LDAP 服务呢? 为什么要同步创建 LDAP 服务? …

【超级详细步骤】pyinstaller 打包 exe 其实特别简单

文章目录为什么要打包?安装pyinstaller技术提升pyinstaller 打包单个.py文件步骤1:单击以下区域输入 cmd 切换到目标文件目录2:输入 pyinstaller -F -w Analog_clock.py 回车即可3:打包成功会在.py文件同级目录下出现以下文件&…

VM——http协议及json解析

1、http协议实现参考:(180条消息) C# Http通讯协议的整理_C#Code- Sheep的博客-CSDN博客_c# http协议 2、Json解析参考:c#解析json字符串处理(最清晰易懂的方法) - 轩辕箭 - 博客园 (cnblogs.com) 3、VM中http实现步骤&#xff…

WordPress 主题模板QUX9.1.4开心版无授权限制 DUX二开增强主题

源码测评:WordPress主题QUX9.1.4开心版,我安装测试了下,看来没什么问题,想学习参考的网友可以试下。 更新日志: 2020/3/19更新 V9.1.4 推荐:★★★★★ 新增 新增夜间模式(主题设置 – 客服 –…

基于Python+Django+Vue+MYSQL的社团管理系统

项目介绍 随着近年来大学教育的改革,大部分高校普遍开始实行学分制、弹性学制改革,这样学校在学生的学习和生活中所起的作用慢慢减小,不再是一种直接由学校决定学生的大学生活。学生对自己的学习和生活有了更大的自主权,在课余也…

虹科分享 | 盘点世界杯有趣小知识!带你感受体育赛事可视化的快乐!

卡塔尔世界杯 2022年卡塔尔世界杯是第二十二届世界杯足球赛,是历史上首次在卡塔尔和中东国家境内举行、也是第二次在亚洲举行的世界杯足球赛。 今年卡塔尔世界杯可谓精彩纷呈,花2000个亿在沙漠里打造出的空调球场、洗脑又魔性的“母鸡生蛋”主题曲《Tu…

【Linux】进程创建、退出和等待(fork、exit和_exit、waitpid和wait、阻塞和非阻塞)

文章目录1、进程创建1.1 理解fork函数1.2 fork函数的细节2、进程退出2.1 退出码2.2 exit函数和_exit系统调用3、进程等待3.1 wait和waitpid3.2 阻塞和非阻塞1、进程创建 进程的创建主要依靠系统接口fork函数。 fork函数从已存在的一个进程中,创建一个子进程&#…

刚接触测试如何编写测试用例?看看摸鱼5年的老点工是怎么写的

给你个需求,你要怎么转变成最终的用例? 直接把需求文档翻译一下就完事了。 老点工拿到需求后的标准操作: 第一步:解析需求 先解析需求-找出所有需求中的动词,再列出所有测试点。测试点过程不断发散,对于…

第十四章: ReentrantLock、ReentrantReadWriteLock、StampedLock

相关面试题锁的演变ReentrantReadWriteLock锁降级案例演示一案例演示二总结为什么要有锁降级邮戳锁 StampedLock邮戳锁的特点案例演示一案例演示二StampedLock 缺点相关面试题 你说你用过读写锁,锁饥饿问题是什么?有没有比读写锁更快的锁?St…

域名解析函数 gethostbyname

在实现TCP/UDP编程的时候,服务端绑定的IP地址是点分十进制的,如124.222.215.205,如果提供的是域名,此时我们需要将域名转换成点分十进制的IP地址,这个过程就是 “ 域名解析 ”,实现域名转换的函数就是 geth…

Python Aws Ubuntu20 配置多IP

1. 业务场景: 高频次交易需要多次访问接口,配置单服务器多IP绕过币安单个IP频率限制 2. AWS实例选择: t3系列,东京A区,ubuntu20 这是我测试的币安延迟最低的配置(平均6ms) 换一个区域、一个系…

【王道计算机网络笔记】数据链路层-数据链路层设备

文章目录物理层扩展以太网链路层扩展以太网网桥透明网桥源路由网桥以太网交换机直通式交换机存储转发式交换机冲突域和广播域物理层扩展以太网 主机和集线器不能超过100m,超过100m会失真严重,无法恢复,扩展以太网的方法: 通过光纤…

欢迎报名Rust China Hackathon 2022 达坦科技组

12月4日下午,DatenLord就2022Rust China Hackathon大赛活动企业组(达坦科技组)的赛题进行了空中宣讲会。不仅对赛事流程进行了全面的讲解,同时对赛题背景以及完赛标准和要点进行了深入的剖析。会后更是设置问答环节,细…

目标检测算法——图像分割数据集汇总(附下载链接)

>>>深度学习Tricks&#xff0c;第一时间送达<<< &#x1f384;&#x1f384;近期&#xff0c;小海带在空闲之余&#xff0c;收集整理了一批图像分割数据集供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff01;&#xff01;&am…

给visCode编辑器添加背景图

看见很多大牛的visCode编辑器上有个背景图&#xff0c;感觉挺有逼格的&#xff0c;要想跟大牛一样有逼格&#xff0c;那先把编辑器设置的跟大牛的逼格一样高 话不多说&#xff0c;开始 第一步&#xff1a;先安装背景扩展 第二步&#xff1a;点击选择扩展设置 第三步&#xff1…

原码、反码、补码的互相转换

原码、反码、补码的互相转换 简介&#xff1a;本文是为了计算机组成原理复习&#xff0c;本文以具体题目的方式来对原码、反码、补码的互相转换进行讲解。 概述 原码 &#xff1a;最高位是符号位&#xff0c;0代表正数&#xff0c;1代表负数&#xff0c;非符号位为该数字绝对…