MAVROS发布和订阅的消息类型已经规定好了

所以你以后关键不是看上面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里的

https://github.com/generalized-intelligence/GAAS/blob/master/software/SLAM/ygz_slam_ros/examples/EurocStereoVIO_ros.cpp

这个数据类型是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类型数据。

https://github.com/generalized-intelligence/GAAS/blob/master/software/px4_mavros_scripts/1_px4_mavros_offboard_controller/px4_mavros_run.py

http://wiki.ros.org/mavros#Subscribed_Topics 

 

你再点开这个数据类型细看,它是包含了位置,速度,加速度的信息。

http://docs.ros.org/api/geometry_msgs/html/msg/Point.html

而且你看一个代码里面它用用了哪些MAVROS消息类型,看它的头文件就知道了

 https://github.com/generalized-intelligence/GAAS/blob/master/software/px4_mavros_scripts/1_px4_mavros_offboard_controller/px4_mavros_run.py

https://github.com/generalized-intelligence/GAAS/blob/master/software/SLAM/ygz_slam_ros/examples/EurocStereoVIO_ros.cpp

现在你再去看阿木的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

https://github.com/generalized-intelligence/GAAS/blob/master/software/SLAM/ygz_slam_ros/examples/EurocStereoVIO_ros.cpp

阿木的MAVROS的课里面代码第一个头文件就是 geometry_msgs::PoseStamped 的

 这也是PX4官网给的offboard示例程序。

 

看MAVROS的wiki有个巨大的发现

它在最后讲到了vision_position

点击后可以细看,

而且确实也是用的geometry_msgs::PoseStamped 这个类型发送的vision_pose_estimate

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

http://wiki.ros.org/mavros

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

 

猜你喜欢

转载自blog.csdn.net/sinat_16643223/article/details/107889269