现在学了mavlink之后回看看这是不是觉得.....mavlink每种消息都有消息ID的,都定义好了的。
=============================================
所以你以后关键不是看上面pose名字,而且看它真正的类型,public发布数据的时候不是要写真正的类型么,看那个!!!!!订阅也是的,这样你就知道它那是不是给MAVROS的数据了,是不是是由那个数据类型决定的
而不是看名字,名字你可以随便起啊,数据类型是定好了的。
你之前不是想弄清楚MAVROS到底有没有订阅那个SLAM发布的位置信息并发布给PX4么,MAVROS所有能订阅和发布的消息类型都写在wiki里面了,你去看有没有比如GAAS里面那个vision_pose/pose的类型。如果是MAVROS里定义的消息类型那说明是发给MAVROS的嘛,不然你定义成MAVROS的消息类型干嘛。你不用做仿真就可以确定这些了。
你真正把MAVROS系统学好,MAVROS的用法弄懂,把发布消息什么的真正学好了,这些应该是很自然的事情。
也是这个给我的启发,我都决定把这篇文章置顶了,我i现在回看这篇文章和最开始看又不一样了。
https://blog.csdn.net/zhengyuxin0507/article/details/80357405
https://blog.csdn.net/sinat_16643223/article/details/107875170
https://blog.csdn.net/sinat_16643223/article/details/107856644
这是GAAS里的
这个数据类型是MAVROS里的,而且是订阅的消息类型!!!!!!
http://wiki.ros.org/mavros#Subscribed_Topics
你再去看GAAS的px4_mavros_run.py里的这些发布消息和接收消息,你就能真正清楚他们是发布接收的什么消息,是不是给MAVROS的 对哦,
有个问题,有个节点发布了MAVROS的消息,怎么确定这是MAVROS节点发布的?可以确定,MAVROS订阅哪些类型消息,发布哪些类型消息确定好了,如果发布的消息是MAVROS订阅消息类型里面的说明不是MAVROS节点发布的,是发给MAVROS节点的。也不对,我看到发布和接收有一样的。你还是没有真正弄清楚MAVROS是怎么用的,我们写的offboard节点似乎不是MAVROS节点,你去看看PX4给的MAVROS实例程序,似乎不是的。MAVROS它是不是自动接收发送的??????我们只需要发送MAVROS类型的消息就可以了?
MAVROS可能就是,我要给飞控发什么数据给MAVROS发,我要从飞控拿什么数据就从MAVROS拿,本身似乎是不对MAVROS编程的?需不需要控制MAVROS发送和接收消息,不对,我看阿木的课,是控制MAVROS发送什么消息,接收什么消息。
MAVROS应该是要编程的,因为不单单实消息类型,话题名称是自己定的,你不光要消息类型相同,还得话题名称相同。
MAVROS节点到底是怎么启动的?
我看MAVROS的wiki里面给了我答案,怪不得这里写的是
这些只是 loaded by mavros_node.
真正的MAVROS节点是这个,只发送和接收mavlink类型数据。
http://wiki.ros.org/mavros#Subscribed_Topics
你再点开这个数据类型细看,它是包含了位置,速度,加速度的信息。
http://docs.ros.org/api/geometry_msgs/html/msg/Point.html
而且你看一个代码里面它用用了哪些MAVROS消息类型,看它的头文件就知道了
现在你再去看阿木的px4_command也会好一些
而且我发现 geometry_msgs::PoseStamped 这个消息类型出现很多次了。
https://github.com/amov-lab/px4_command/blob/master/src/px4_pos_estimator.cpp
GAAS里面SLAM估计的位置数据也是用这种消息类型 geometry_msgs::PoseStamped
这里都注释写了 //for px4's external pose estimate
阿木的MAVROS的课里面代码第一个头文件就是 geometry_msgs::PoseStamped 的
这也是PX4官网给的offboard示例程序。
看MAVROS的wiki有个巨大的发现
它在最后讲到了vision_position
点击后可以细看,
而且确实也是用的geometry_msgs::PoseStamped 这个类型发送的vision_pose_estimate
真的好好读好官方文档太重要了!!!!!!!
MAVROS wiki的最后一段文字我细读了一下发现了一个东西 `vision_position`
http://wiki.ros.org/mavros_extras#vision_pose_estimate
http://wiki.ros.org/mavros_extras#vision_pose_estimate
~vision_pose/pose (geometry_msgs/PoseStamped)
这里的 vision_pose/pose 不正是GAAS里面的么,也是ZN无人机课程里面的,前面那个是可以自己定,这样下来就完美了。
看来消息名称也是不能乱写的,都是和消息类型配套的,是不是这样MAVROS就可以识别到?可能是的,一种消息类型我看对应了多种消息名称,消息名称+消息类型就完全确实是什么,其实单纯消息名称就可以确定了,这个MAVROS里规定好了。这样的话是不是不用对MAVROS进行单独编程,其实我们写的也只是MAVROS的外挂程序,
所以我们写Publish的时候是对MAVROS pulish,而不是让MAVROS publish 给飞控,MAVROS本身只Pulish mavlink类型数据,我觉得应该是MAVROS接收到我们pulish的数据,再自动转成mavlink的给飞控。
MAVROS节点应该是在 roslaunch mavros px4.launch 的时候启动的,而且和PX4建立了连接,比如ZN无人机写在transfer里面的pulish肯定不是让MAVROS pulish吧,它都不是MAVROS节点,应该是一个独立的节点,publish后让MAVROS接收到了。我怀疑那个plugins的真正意思是外部程序?
所以我只需要写发布VSLAM得到的位置信息,发布控制指令,发布了之后不用管了,MAVROS会自动接收并发给PX4。所以你没有找到有写接收VSLAM位置信息的,原因可能就是如此!!!!!!
订阅pose消息的可能是ROS想得到飞控的自身传感器或者融合后的位置数据。那是我们从MAVROS那里订阅,MAVROS收到这个订阅消息后就去从飞控那里拿。如GAAS的
还有阿木里面讲MAVROS订阅消息的时候也要这种。实际就是从飞控那里拿数据嘛。
而且阿木MAVROS课程里面跑那些程序的时候都不是什么MAVROS功能包或者节点什么的,应该是一个新建的独立节点或者功能包。
所以ZN无人机那个transfer把数据改为vision_pose/pose发出去后就OK了,你不用找什么接收它的程序代码,
所以很多东西没有真正弄懂就做不出来。
所以所谓的,MAVROS订阅消息,不是MAVROS节点订阅,而是别人从MAVROS这订阅,从飞控那订阅。你这么再去看阿木讲的MAVROS订阅消息你就看得明白了,你就不会奇怪,怎么没有订阅VSLAM的位置消息,或者你没有看到MAVROS节点发布VSLAM的消息。
你之前可能是没有理解清楚这些消息怎么传到PX4的,你以为要专门写个MAVROS的代码去接收然后发布,你以为他们之前写的那些控制位置的代码就是MAVROS的,然后奇怪里面怎么没有接收和发布VSLAM位置信息的,那VSLAM位置信息怎么传到PX4的, 你之前的关键就是没有弄清MAVROS节点和外部节点还有这个MAVROS自动接收消息并发给PX4这些基础概念,所以不明白。你现在发现他们写的那些控制程序也不是MAVROS节点,也是外部节点,也是独立的功能包,是那些独立节点发出消息,不是MVAROS发出消息。所以你以前奇怪怎么MAVROS只发布了控制消息,没有发布这个VSLAM的消息,这样PX4怎么接收到的。反正现在感觉很多东西都理清了,之前是看他们的程序就是没弄清楚这个原理,现在弄清楚反而觉得之前怎么会不清楚?
可能之前奇怪他们没有专门写VSLAM位置数据的传输。包括GAAS,对吧。当然你现在明白了。不过这个问题确实困扰我很长时间。虽然我看他们包括讲MAVROS的阿木都讲得很轻松很简单,觉得没什么。你当然知道怎么传控制指令,这个很多都写了,但是你一直不知道VSLAM的位置信息怎么传,以为也要专门写,实际不用。
这也是为什么vision_pose_estimate这里只有订阅,这里的订阅是对于MAVROS来说的,我们写程序的时候是外部节点,所以都是写publish,所以你再看下面那个人说的,站在MAVROS的角度看也就明白了。MAVROS的WIKI它里面的订阅和发布是站在MAVROS的角度看的。
https://blog.csdn.net/sinat_16643223/article/details/107589052
https://dev.px4.cc/master/zh/ros/mavros_offboard.html
px4flow也在这里面。
你再看这个也好明白了
https://github.com/amov-lab/px4_command/blob/master/src/px4_pos_estimator.cpp
看来MAVROS里时专门有个CPP文件来处理这类消息的,这让我对MAVROS的认识更深了一步。
https://github.com/mavlink/mavros/blob/master/mavros_extras/src/plugins/vision_pose_estimate.cpp
这里面深蓝色部分就是vision_pose/pose对应的mavlink消息,这个函数应该是是把ROS的消息转化为mavlink的格式,
好像还有transform函数做坐标变换?我猜的。本身MAVROS它应该是会跟你自动做坐标系变换的。
这是一个把T265输出得数据转为MAVROS得数据得一个节点得Github里面得介绍,看这刻意比较清晰看出消息类型的转化
https://github.com/thien94/vision_to_mavros
APM官方文档里的T265的教程,这里面也是说了 vision_pose/pose
https://ardupilot.org/dev/docs/ros-vio-tracking-camera.html#ros-vio-tracking-camera