文章目录

  • 前言
  • 应用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例程仿真与解析相关推荐

  1. 数据清洗的基本流程_数据分析小白学习之路(三)——Excel多练熟能生巧

    谈到数据分析,我们可能第一时间想到python.SQL.Tableau.帆软.R等,但是这些软件.语言要入门掌握.系统学习起来耗时较长.这时候不得不提到excel这个"平平无奇数分小能手&q ...

  2. excel取整函数_数据分析小白学习之路(三)——Excel多练熟能生巧

    谈到数据分析,我们可能第一时间想到python.SQL.Tableau.帆软.R等,但是这些软件.语言要入门掌握.系统学习起来耗时较长.这时候不得不提到excel这个"平平无奇数分小能手&q ...

  3. java 设置年轻代堆大小,[JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配...

    [JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配 [JVM学习之路]五.堆(一)堆的内存结构.参数设置.分代思想.内存分配策略及TLAB 一.堆的核心概述 堆的特点: 1.一个jvm实 ...

  4. Android SurfaceFlinger 学习之路(五)----VSync 工作原理

    原址 VSync信号的科普我们上一篇已经介绍过了,这篇我们要分析在SurfaceFlinger中的作用.(愈发觉得做笔记对自己记忆模块巩固有很多帮助,整理文章不一定是用来给别人看的,但一定是为加强自己 ...

  5. python请输入第一个数请输入第二个数_Python小白学习之路(四)——第一次练习题...

    写在前面: 今天下雪了呢!连着两天都没有更新学习记录. 我没有偷懒呢.做了一天的练习题,昨天学的内容还没总结完,太累了就回去睡觉了 连续一周早起,强大的内心也无法支撑我疲惫的身体 今天早起做了整理.加 ...

  6. c语言cis,c语言小白学习历程第五篇

    学习目标: 难的咱也看不懂,先把简单的看了再说,加油L 冲冲冲! 学习时间: 2020年11月1日 学习产出: 回调函数学习: 回调函数说白了就是一个通过函数指针调用的函数.如果你把函数的指针Call ...

  7. ROS的学习(十五)验证publisher和subscriber

         在前面的两篇博客中我们用C++在ROS中创建了一个发布者和接收者,并使用catkin_make构建了新的节点,下面就需要验证一下,我们写的是否正确.      首先运行roscore ros ...

  8. 小白学习之路,网络编程(上)

    一,计算机网络基础 在讲网络编程之前,先跟大家简单的介绍一下一些网络相关的知识. 在最早之前,两台电脑之间通信是通过电脑的mac地址找到对方,并实现相互通信.当然每台电脑都只存在唯一的mac地址,在生 ...

  9. Leaflet学习之路五——动态绘制图形(点、线、圆、多边形)

    leaflet动态绘制图形 动态绘点 动态绘线 动态绘多边形 动态绘制矩形 2020.3.16更新 更新日志: 2019.1.14:更新了绘制多边形时tmpline没有移除的问题 2019.1.15: ...

最新文章

  1. 德国图宾根大学发布可扩展「对抗黑盒攻击」,仅通过观察决策即可愚弄深度神经网络
  2. 清除window 系统中的垃圾文件-转
  3. 使用python开发网页游戏_如何用python开发游戏
  4. 二维模式(矩阵)匹配(Rabin-Karp算法推广到二维)[转]
  5. 怎么安装Scrapy框架以及安装时出现的一系列错误(win7 64位 python3 pycharm)
  6. SpringBoot 的错误处理机制
  7. K3 官改新手小白配置阿里DDNS 超级详细
  8. 编程比赛三大赛制介绍(ACM赛制、OI赛制、IOI赛制)
  9. [Python]跟着代码去学习---二维码1:批量生成二维码
  10. APICloud Studio 在海马玩模拟器上调试程序
  11. la是什么牌子_la bruket是什么牌子_哪个国家的_什么档次
  12. STAR法则的简历应用
  13. 如何在html的form提交时排除某些input field的内容
  14. COOK100推荐:在家做新奥尔良烤翅的做法
  15. win7睡眠功能无法使用(睡眠按钮变灰)
  16. 中欣晶圆完成B轮33亿元融资;晶科能源与宁德时代达成战略合作 | 美通社头条...
  17. 微信公众号录音功能及录音文件下载到自己服务器 一
  18. HTML简洁单页网址导航模板
  19. Symbian OS简介
  20. 哪些人更适合学Java?看看就知道了

热门文章

  1. 把bitmap裁剪成圆形bitmap的方法
  2. 0702 会员地区分布
  3. PY32F003 入门
  4. 基于STM32的OLED播放Bad apple
  5. Java单点登录在校园身份管理系统中的实现
  6. android sw watchdog and How to Debug
  7. spark scala中的var 和val、def区别对比
  8. iPhone和iPad不能充电的解决办法(一定条件下)
  9. 王者营地的设计与实现【网页设计】
  10. windows批处理:if else的踩坑点及排版优化