(无人机方向)ros小白学习之路(五)mavros消息的订阅和发布与offboard例程仿真与解析
文章目录
- 前言
- 应用mavros控制无人机消息流
- 以mavros中setpoint_position/local为例子
- 1:确定话题的功能和消息类型
- 如果快速找到对应的mavlink消息
- 2:确定话题并最终找到转化为uorb消息
- 官方example offboard例程仿真与解析
- 确定任务需要用到的mavros话题名称与消息类型(阅读[官方文档](http://wiki.ros.org/mavros#mavros.2FPlugins.setpoint_position))
- 头文件需要包含所需要用到的消息类型.h文件
- 此处应用了mavros,应编译安装(我用的源码安装)
- 编写
前言
mavros消息的订阅和发布.
应用mavros控制无人机消息流
以mavros中setpoint_position/local为例子
1:确定话题的功能和消息类型
在http://wiki.ros.org/mavros下,可以看到对应的mavros消息.
找到setpoint_position/local
[1]直接阅读mavros中的说明
[2] (如果mavros说明不详细)阅读mavros源码找到对应的mavlink协议
[3] (这一步必须要做)查询对于的mavlink协议,阅读该协议的说明文档
如果快速找到对应的mavlink消息
(1):打开官网:http://mavlink.io/zh/messages/common.html
(2):按下ctrl+t会出现关键词查询
(3):输入刚刚在mavros消息下的mavlink协议(在本例子中是SET_POSITION_TARGET_GLOBAL_INT)
(4):输入进去,按回车查询
2:确定话题并最终找到转化为uorb消息
(1):打开官网:https://dev.px4.io/v1.10_noredirect/zh/concept/architecture.html
(2):打开中间件,可以查看相应的资料
(3)阅读px4的mavlink源码了解话题如何最终转化为uorb消息
(如果没有下载则去下载PX4固件)打开PX4固件下的src/modules/mavlink/mavlink_receiver.cpp和mavlink_receiver.h文件(不知道路径一不一样,不一样的话可以在文件下查询)
这个就mavlink解析数据,是根据ID判断消息类型.ID就是#后的数字,如:
然后接受完数据,就通过handle_message函数进行处理,最终转化为uorb消息
官方example offboard例程仿真与解析
这里会用到ROS消息类型中的服务,可以看我另篇文章,这里不加赘述.
确定任务需要用到的mavros话题名称与消息类型(阅读官方文档)
头文件需要包含所需要用到的消息类型.h文件
这里我的工作空间名为catkin_1,运行代码的时候改成你的工作空间名称
cd ~/catkin_1/src
catkin_create_pkg offboard_pkg roscpp rospy std_msgs geometry_msgs mavros_msgs
新建offb_node.cpp文件,include头文件
#include <ros/ros.h>
#include <geometry_msgs/PoseStamped.h>
#include <mavros_msgs/CommandBool.h>
#include <mavros_msgs/SetMode.h>
#include <mavros_msgs/State.h>
此处应用了mavros,应编译安装(我用的源码安装)
下载
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
git clone https://github.com/mavlink/mavros.git
git clone --recurse-submodules -b release/noetic/mavlink https://github.com/mavlink/mavlink-gbp-release.git
cd mavros
git checkout -b 1.13.0 1.13.0
编译
cd ~/catkin_ws
catkin build
mavros一定要用catkin_build,不用catkin_make
下面的操作是因为我自己的原因,可以忽略:
因为我mavros和我功能包工作空间不同,因此需要在vscode中设置IncludePath
在c_cpp_properties.json编辑:
“/home/khs/catkin_ws/devel/include/**”,
编写
转载于 参考
#include <ros/ros.h>
#include <geometry_msgs/PoseStamped.h> //发布的消息体对应的头文件,该消息体的类型为geometry_msgs::PoseStamped
#include <mavros_msgs/CommandBool.h> //CommandBool服务的头文件,该服务的类型为mavros_msgs::CommandBool
#include <mavros_msgs/SetMode.h> //SetMode服务的头文件,该服务的类型为mavros_msgs::SetMode
#include <mavros_msgs/State.h> //订阅的消息体的头文件,该消息体的类型为mavros_msgs::State//建立一个订阅消息体类型的变量,用于存储订阅的信息
mavros_msgs::State current_state;//订阅时的回调函数,接受到该消息体的内容时执行里面的内容,这里面的内容就是赋值
void state_cb(const mavros_msgs::State::ConstPtr& msg){current_state = *msg;
}int main(int argc, char **argv)
{ros::init(argc, argv, "offb_node"); //ros系统的初始化,最后一个参数为节点名称ros::NodeHandle nh;//订阅。<>里面为模板参数,传入的是订阅的消息体类型,()里面传入三个参数,分别是该消息体的位置、缓存大小(通常为1000)、回调函数ros::Subscriber state_sub = nh.subscribe<mavros_msgs::State>("mavros/state", 10, state_cb);//发布之前需要公告,并获取句柄,发布的消息体的类型为:geometry_msgs::PoseStampedros::Publisher local_pos_pub = nh.advertise<geometry_msgs::PoseStamped>("mavros/setpoint_position/local", 10);//启动服务1,设置客户端(Client)名称为arming_client,客户端的类型为ros::ServiceClient,//启动服务用的函数为nh下的serviceClient<>()函数,<>里面是该服务的类型,()里面是该服务的路径ros::ServiceClient arming_client = nh.serviceClient<mavros_msgs::CommandBool>("mavros/cmd/arming");//启动服务2,设置客户端(Client)名称为set_mode_client,客户端的类型为ros::ServiceClient,//启动服务用的函数为nh下的serviceClient<>()函数,<>里面是该服务的类型,()里面是该服务的路径ros::ServiceClient set_mode_client = nh.serviceClient<mavros_msgs::SetMode>("mavros/set_mode");//the setpoint publishing rate MUST be faster than 2Hzros::Rate rate(20.0);// 等待飞控连接mavros,current_state是我们订阅的mavros的状态,连接成功在跳出循环while(ros::ok() && !current_state.connected){ros::spinOnce();rate.sleep();}//先实例化一个geometry_msgs::PoseStamped类型的对象,并对其赋值,最后将其发布出去geometry_msgs::PoseStamped pose;pose.pose.position.x = 0;pose.pose.position.y = 0;pose.pose.position.z = 2;//建立一个类型为SetMode的服务端offb_set_mode,并将其中的模式mode设为"OFFBOARD",作用便是用于后面的//客户端与服务端之间的通信(服务)mavros_msgs::SetMode offb_set_mode;offb_set_mode.request.custom_mode = "OFFBOARD";//建立一个类型为CommandBool的服务端arm_cmd,并将其中的是否解锁设为"true",作用便是用于后面的//客户端与服务端之间的通信(服务)mavros_msgs::CommandBool arm_cmd;arm_cmd.request.value = true;//更新时间ros::Time last_request = ros::Time::now();while(ros::ok())//进入大循环{//首先判断当前模式是否为offboard模式,如果不是,则客户端set_mode_client向服务端offb_set_mode发起请求call,//然后服务端回应response将模式返回,这就打开了offboard模式if( current_state.mode != "OFFBOARD" && (ros::Time::now() - last_request > ros::Duration(5.0))){if( set_mode_client.call(offb_set_mode) && offb_set_mode.response.mode_sent){ROS_INFO("Offboard enabled");//打开模式后打印信息}last_request = ros::Time::now();}else //else指已经为offboard模式,然后进去判断是否解锁,如果没有解锁,则客户端arming_client向服务端arm_cmd发起请求call//然后服务端回应response成功解锁,这就解锁了{if( !current_state.armed && (ros::Time::now() - last_request > ros::Duration(5.0))){if( arming_client.call(arm_cmd) && arm_cmd.response.success){ROS_INFO("Vehicle armed");//解锁后打印信息}last_request = ros::Time::now();}}local_pos_pub.publish(pose); //发布位置信息,所以综上飞机只有先打开offboard模式然后解锁才能飞起来ros::spinOnce();rate.sleep();}return 0;
}
(无人机方向)ros小白学习之路(五)mavros消息的订阅和发布与offboard例程仿真与解析相关推荐
- 数据清洗的基本流程_数据分析小白学习之路(三)——Excel多练熟能生巧
谈到数据分析,我们可能第一时间想到python.SQL.Tableau.帆软.R等,但是这些软件.语言要入门掌握.系统学习起来耗时较长.这时候不得不提到excel这个"平平无奇数分小能手&q ...
- excel取整函数_数据分析小白学习之路(三)——Excel多练熟能生巧
谈到数据分析,我们可能第一时间想到python.SQL.Tableau.帆软.R等,但是这些软件.语言要入门掌握.系统学习起来耗时较长.这时候不得不提到excel这个"平平无奇数分小能手&q ...
- java 设置年轻代堆大小,[JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配...
[JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配 [JVM学习之路]五.堆(一)堆的内存结构.参数设置.分代思想.内存分配策略及TLAB 一.堆的核心概述 堆的特点: 1.一个jvm实 ...
- Android SurfaceFlinger 学习之路(五)----VSync 工作原理
原址 VSync信号的科普我们上一篇已经介绍过了,这篇我们要分析在SurfaceFlinger中的作用.(愈发觉得做笔记对自己记忆模块巩固有很多帮助,整理文章不一定是用来给别人看的,但一定是为加强自己 ...
- python请输入第一个数请输入第二个数_Python小白学习之路(四)——第一次练习题...
写在前面: 今天下雪了呢!连着两天都没有更新学习记录. 我没有偷懒呢.做了一天的练习题,昨天学的内容还没总结完,太累了就回去睡觉了 连续一周早起,强大的内心也无法支撑我疲惫的身体 今天早起做了整理.加 ...
- c语言cis,c语言小白学习历程第五篇
学习目标: 难的咱也看不懂,先把简单的看了再说,加油L 冲冲冲! 学习时间: 2020年11月1日 学习产出: 回调函数学习: 回调函数说白了就是一个通过函数指针调用的函数.如果你把函数的指针Call ...
- ROS的学习(十五)验证publisher和subscriber
在前面的两篇博客中我们用C++在ROS中创建了一个发布者和接收者,并使用catkin_make构建了新的节点,下面就需要验证一下,我们写的是否正确. 首先运行roscore ros ...
- 小白学习之路,网络编程(上)
一,计算机网络基础 在讲网络编程之前,先跟大家简单的介绍一下一些网络相关的知识. 在最早之前,两台电脑之间通信是通过电脑的mac地址找到对方,并实现相互通信.当然每台电脑都只存在唯一的mac地址,在生 ...
- Leaflet学习之路五——动态绘制图形(点、线、圆、多边形)
leaflet动态绘制图形 动态绘点 动态绘线 动态绘多边形 动态绘制矩形 2020.3.16更新 更新日志: 2019.1.14:更新了绘制多边形时tmpline没有移除的问题 2019.1.15: ...
最新文章
- 德国图宾根大学发布可扩展「对抗黑盒攻击」,仅通过观察决策即可愚弄深度神经网络
- 清除window 系统中的垃圾文件-转
- 使用python开发网页游戏_如何用python开发游戏
- 二维模式(矩阵)匹配(Rabin-Karp算法推广到二维)[转]
- 怎么安装Scrapy框架以及安装时出现的一系列错误(win7 64位 python3 pycharm)
- SpringBoot 的错误处理机制
- K3 官改新手小白配置阿里DDNS 超级详细
- 编程比赛三大赛制介绍(ACM赛制、OI赛制、IOI赛制)
- [Python]跟着代码去学习---二维码1:批量生成二维码
- APICloud Studio 在海马玩模拟器上调试程序
- la是什么牌子_la bruket是什么牌子_哪个国家的_什么档次
- STAR法则的简历应用
- 如何在html的form提交时排除某些input field的内容
- COOK100推荐:在家做新奥尔良烤翅的做法
- win7睡眠功能无法使用(睡眠按钮变灰)
- 中欣晶圆完成B轮33亿元融资;晶科能源与宁德时代达成战略合作 | 美通社头条...
- 微信公众号录音功能及录音文件下载到自己服务器 一
- HTML简洁单页网址导航模板
- Symbian OS简介
- 哪些人更适合学Java?看看就知道了