transfer.py就是把vins的坐标系转为PX4的坐标系,其实也是个ROS功能包,包含代码分析。(最后发现是改成GAAS里pose的消息形式)

本文主要是介绍transfer.py就是把vins的坐标系转为PX4的坐标系,其实也是个ROS功能包,包含代码分析。(最后发现是改成GAAS里pose的消息形式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

transfer.py

这个脚本干什么工作呢,这个脚本就是之前我跟大家说的(他可能前面讲了看来基础要听听),它把vins它的那个世界坐标系跟px4它定义的北东地,mavros对应的是东北天,它的那个坐标系做了一个转换,然后同时以mavros vins  pose 的形式发出去了,这样的话PX4就能接受到你vins发出的数据,就干这样一件事。

这个时候你打开QGC的analyze,

你去监控它的这个叫做local_position_NED这样的一个数据

你会发现X,Y,Z都已经出来了,就这个数据就是vins发给飞机的数据,然后下一步你要检查它是不是真的是NED坐标系下的,就是你观察下磁罗盘(地面站上有现实,视频里有),现在是朝北,那你就往北往前,往北往后,然后往东往西往上往下,看看它对应的是不是X的正向往北,Y的正向是东,然后Z的正向是地,就是向下,这都对应上了,你再晃来晃去晃来晃去,你发现它跟你的这个一个是尺度,就你往前走一米是不是真的是X变大了一米,往上走一米是不是Z变小了一米,就这些都对应上了之后,然后再飞行,就是才能保证你的这个飞机就是大概率在空中不会出现问题,这个是在飞行之前一定要检查好的,这个是起飞前检查。(现在我回看这个我可以理解了,之前最开始看的时候还觉得怎么这么麻烦,现在很理解,是的,要确保vins给无人机的坐标位置是对的,不然无人机肯定乱啊,你实际往后飞,但是给的坐标是往前,飞控要反向控制那就往后,那这样飞机肯定失控啊,这个很好理解了现在,对吧,这个确实要检查好,这可能就跟你光流模块方向没装对一样的,这里还可以查看实际vins给无人机发的位置信息,我觉得这个挺好的,这个非常棒。还有一个没弄明白,为什么后面每次飞摆的方向要和第一次的方向一样呢)

 

第一期13节

 

 

可以结合我这篇博文来看

https://blog.csdn.net/sinat_16643223/article/details/107783847?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159664474519195264549442%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159664474519195264549442&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v1~rank_blog_v1-1-107783847.pc_v1_rank_blog_v1&utm_term=%E5%9D%90%E6%A0%87%E7%B3%BB&spm=1018.2118.3001.4187

 

 

 

下面是transfer.py的代码,仔细看它其实也是一个ROS功能包,里面有subscriber,有publisher,所以运行transfer.py其实是启动了一个ROS节点,这个节点的功能专门负责这个坐标系变换的,这样就好理解了。不过老师还说了转换后是以mavros vins  pose 的形式发出去的,也就是MAVROS可以直接处理了,也就是实际传给PX4的就是这些信息?

 

不对啊,MAVROS不是会自动进行坐标转换么?

 

我现在知道那个老师说的以mavros vins  pose 的形式发出去是什么了

他的程序本身就是借鉴的GAAS的,GAAS的SLAM的例程里发布的信息有下面这些其中一个就是

/mavros/vision_pose/pose

那个老师只需要把vins节点发出的pose信息转为了GAAS里 /mavros/vision_pose/pose 的信息一样的格式,其他部分就可以完全照搬GAAS的就可以了!!!!!!!它的transfer文件其实起的这个作用,我如果用T265一样的道理。GAAS其他部分的程序会把这个pose最后传给PX4。你不管用什么VSLAM算法都可以套用这么一个框架,只需要把SLAM节点改动一下就可以了。

https://github.com/generalized-intelligence/GAAS/tree/master/software

 

 

而且我发现GAAS给的SLAM教程里面就是写的 /mavros/vision_pose/pose  查看pose消息就是查看 /mavros/vision_pose/pose!!!!!!我今天上午想到去看看果然真的是一样的!!!!!!!!!!!!!!!!!!!!!我们只需要让我们自己的SLAM节点发出的消息和这个格式一样,其他的应该可以直接套用GAAS的就可以了。

https://gaas.gitbook.io/guide/software-realization-build-your-own-autonomous-drone/wu-ren-ji-zi-dong-jia-shi-xi-lie-part-3-zai-wu-gps-huan-jing-xia-tong-guo-slam-shi-xian-wei-zhi-gu-j

 

 

最后我发现其实就是MAVROS wiki里面定义的

MAVROS wiki的最后一段文字我细读了一下发现了一个东西 `vision_position`

这不正是我哦想做的视觉SLAM输出位置信息么!!!!!!

真的好好读好官方文档太重要了!!!!!!!

http://wiki.ros.org/mavros_extras#vision_pose_estimate

 

=======================================================================================

import rospy
from nav_msgs.msg import Odometry
from geometry_msgs.msg import PoseStamped

def callback(data):
    #rospy.loginfo(str(data.pose.position.x)+','+str(data.pose.position.y)+','+str(data.pose.position.z))
    global posx, posy, posz, qx, qy, qz, qw
    posx = data.pose.pose.position.x
    posy = -data.pose.pose.position.y
    posz = data.pose.pose.position.z
    qx = data.pose.pose.orientation.x
    qy = data.pose.pose.orientation.y
    qz = data.pose.pose.orientation.z
    qw = data.pose.pose.orientation.w

posx, posy, posz, qx, qy ,qz ,qw = 0, 0, 0, 0, 0, 0, 1
rospy.init_node('transfer')
rospy.Subscriber("/vins_estimator/camera_pose", Odometry, callback)
 # spin() simply keeps python from exiting until this node is stopped
position_pub = rospy.Publisher("/mavros/vision_pose/pose", PoseStamped, queue_size=2) #creates a publisher object
setpoint_msg = PoseStamped()
rate = rospy.Rate(60) #the rate will take care of updating the publisher at a specified speed - 50hz in this case
#loop_count = 0

while True:
    setpoint_msg.header.stamp = rospy.Time.now()
    #setpoint_msg.header.seq = loop_count
    #setpoint_msg.header.frame_id = 'fcu'
    #rospy.loginfo(str(posx)+','+str(posy)+','+str(posz))

    setpoint_msg.pose.position.x = posx
    setpoint_msg.pose.position.y = posy
    setpoint_msg.pose.position.z = posz
    
    setpoint_msg.pose.orientation.x = qx
    setpoint_msg.pose.orientation.y = qy
    setpoint_msg.pose.orientation.z = qz
    setpoint_msg.pose.orientation.w = qw
    position_pub.publish(setpoint_msg)
    #loop_count = loop_count + 1
    rate.sleep()
#creates a message object of type pose stamped #http://docs.ros.org/api/geometry_msgs/html/msg/PoseStamped.html
=========================================================================================

 

 

这篇关于transfer.py就是把vins的坐标系转为PX4的坐标系,其实也是个ROS功能包,包含代码分析。(最后发现是改成GAAS里pose的消息形式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/507683

相关文章

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

关于MyISAM和InnoDB对比分析

《关于MyISAM和InnoDB对比分析》:本文主要介绍关于MyISAM和InnoDB对比分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录开篇:从交通规则看存储引擎选择理解存储引擎的基本概念技术原理对比1. 事务支持:ACID的守护者2. 锁机制:并发控制的艺

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri