(无人机方向)ros小白学习之路(五)mavros消息的订阅和发布与offboard例程仿真与解析

2023-05-16

文章目录

  • 前言
  • 应用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::PoseStamped
    ros::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 2Hz
    ros::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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(无人机方向)ros小白学习之路(五)mavros消息的订阅和发布与offboard例程仿真与解析 的相关文章

  • ROS创建自定义msg类型功能包

    ROS创建自定义msg类型功能包 一 创建msg消息 首先创建一个空的package单独存放msg类型 xff08 当然也可以在任意的package中自定义msg类型 xff09 为便于说明 xff0c 建立一个名为base sks msg
  • ROS中geometry_msgs消息类型、nav_msg消息

    ROS中geometry msgs消息类型 nav msg消息 参考 xff1a 链接 https blog csdn net ganbaoni9yang article details 50060343 官方文档 xff1a http d
  • 2011年总结

    又是一年年终时 亦是一年总结时 想想自己从去年写年终总结到现在 已经很久没有写过字了 时间过得真快 又是一年过去了 这一年也是我出来工作的第二年 这一年总体来说自己无论在技术还是心态方面有了很大的进步 记得刚出学校那会 啥都不知道 对于工作
  • 性能监测工具-node-export

    1 前言 无论是做性能测试或是运维等都会用到对服务的监测 xff0c 最基本的监测是就是对服务器的基本指标监测 xff0c 比如 xff1a cpu 内存 I O 网络等 这些其实一般系统自带的都有工具 xff0c 很方便 xff0c 比如
  • VSCode(Visual Studio Code)整合Git

    一 xff1a 初始化git插件 在拓展商店中搜索 git xff0c 在下发出现的列表中 xff0c 选择 Git History xff0c 在右边出现的界面 xff0c 点击 安装 即可 本人已经安装 xff0c 安装按钮已无 xff
  • Ubuntu 当前系统资源查看命令Top详解

    top xff1a 主要参数 d xff1a 指定更新的间隔 xff0c 以秒计算 q xff1a 没有任何延迟的更新 如果使用者有超级用户 xff0c 则top命令将会以最高的优先序执行 c xff1a 显示进程完整的路径与名称 S xf
  • ToString的用法

    ToString的用法 string y 61 x ToString 我才明白把一个类型转换为string类型是啥意思 比如当定义一个int类型后 xff0c 利用toString xff08 xff09 方法就能把int转化为string
  • STM32F4-KeyFIFO

    STM32按键FIFO 主要思想就是 xff1a 1 先配置按键的初始计数值为滤波值 如 xff0c 滤波为40ms xff0c 则配置该值为固定初始值 xff0c 如10 假如扫描周期为10ms xff0c 每间隔一定时间 上面说的10m
  • pid的后2位是无效的 在查询pspcidtable的时候 ExpLookupHandleTableEntry 函数会自动把pid的后两位置成0(Handle.TagBits = 0;就是这句!!)

    PHANDLE TABLE ENTRY ExpLookupHandleTableEntry IN PHANDLE TABLE HandleTable IN EXHANDLE tHandle 43 43 Routine Description
  • 代码分析——基于误差状态卡尔曼滤波器(ESKF)实例分析

    imu gps localization代码分析 最近在学习ESKF相关知识 xff0c 偶然发现知乎大佬 Dongsheng Yang基于 Quaterniond kinematics for the error state Kalman
  • 在ros环境下的amcl配置笔记

    这段时间导师让研究一下amcl xff0c 在这之前只有一点ros基础 xff0c 根本不知道amcl是什么东东 xff0c 于是开始查资料找教程 xff0c 但是真心没有找到面向小白的配置教程 xff0c 在这几天的摸索中 xff0c 终
  • ROS 发布和订阅自定义消息数组

    今天学习使用ros发布和订阅自定义的消息以及消息数组 xff0c 记录 xff0c 备忘 xff01 说明 xff1a 以ubuntu14 04 xff0c indigo版本为例 ros工作空间位置 xff1a workspace catk
  • Ubuntu USB串口数据 读取及显示

    显示串口接受的数据命令 1 1 在终端输入 lsusb 显示所有连接的usb设备 1 2 在终端输入 ls dev ttyA 显示所有连接的虚拟USB设备端口号 1 3 在终端输入 ls dev ttyU 显示所有连接的USB设备端口号 1
  • 单片机学习(四)——ESP8266(最全教程和说明)

    文章目录 前言一 ESP8266可以干什么 xff1f 二 ESP8266作为传输数据的开发 1 电路连接图2 ESP8266直接烧录3 通过Arduino对ESP8266进行烧录三 ESP8266作为开发板的开发四 可能会存在的问题总结
  • VScode怎么修改主题色

    VScode底部点击 设置 按钮 xff0c 点击colorTheme 出来的弹框选项中 xff0c 点击选择合适的主题色即可
  • 初学者PID进阶——在线调整参数

    原文地址 xff1a http brettbeauregard com blog 2011 04 improving the beginner e2 80 99s pid tuning changes 问题The Problem 在系统运行
  • 路由器WiFi天线拆机详解-路由器天线原理

    xff08 本文已经同步到公众号 原创文章 xff0c 转载请与作者联系 xff09 1 前言 xff1a 随着无线通信的发展 xff0c WiFi对我们日常生活工作越来越重要 作为WiFi的载体 路由器 xff0c 也是经常出现在生活的各
  • 以机器人为中心的视觉惯性里程计--RVIO

    有没有大佬能用这个代码发布一个 39 nav msgs Odometry 39 message的 34 odom 34 话题 xff0c 下面是代码的github地址 xff0c 和作者的意见 代码地址 https github com r
  • ubuntu的gazebo无法加载模型的解决办法

    最近在CMU exploration的平台上做仿真实验时 xff0c 出现了无法加载模型的错误 ERROR 1657256347 244258655 3 370000000 Updating ModelState model camera
  • 开发板(ubuntu系统)通过串口接收数据,并将数据通过网口转发出去

    测试软件windows下串口助手和cmd下的telnet xff0c ubuntu下的minicom 设置好相应的串口号和端口号 此程序可以正常接收数据 include lt termios h gt include lt unistd h

随机推荐

  • 嵌入式操作系统的内存,你了解多少?

    linux 内存是后台开发人员 xff0c 需要深入了解的计算机资源 合理的使用内存 xff0c 有助于提升机器的性能和稳定性 本文主要介绍 linux 内存组织结构和页面布局 xff0c 内存碎片产生原因和优化算法 xff0c linux
  • RK查看gpu占用率方法

    查看gpu占用率 cat sys devices platform ff9a0000 gpu devfreq ff9a0000 gpu load 0 64 200000000Hz 64 前面的数值表示gpu占用率 xff0c 如果一直为0
  • 对视频50p,50i 还有25p,25i区别的粗劣解释

    对视频50p 50i 还有25p 25i区别的粗劣解释 首先跟你解释p和i的概念 xff0c p是逐行扫描模式 xff0c i是隔行扫描模式 帧速率有以下几种 xff1a 60帧 秒 xff08 实际为59 94帧 秒 xff0c 为方便起
  • 对 makefile 中 .c.o 的理解

    LIBS 61 gao o all LIBS 64 echo 34 final 34 c o gcc o 64 lt echo 34 in c o rule 34 执行 结果 xff1a gcc o gao o gao c in c o r
  • 使用arecord、aplay 实现录音和播放

    Linux应用开发 第八章 ALSA应用开发 腾讯云开发者社区 腾讯云 tencent com period size 指定 period size buffer size 指定 buffer size 259条消息 使用arecord a
  • git 查看某个文件的修改记录

    1 git log filename 可以看到fileName相关的commit记录 2 git log p filename 可以显示每次提交的diff 3 查看某次提交中的某个文件变化 xff0c 可以直接加上fileName git
  • C语言wav格式详解,代码实践

    393条消息 C语言wav格式详解 xff0c 代码实践 c语言写wav文件 白屿林的博客 CSDN博客
  • RT-Thread 命令自启动详解

    408条消息 RT Thread 自动初始化详解 init app export Nameless Y的博客 CSDN博客 在msh c增加如下代码 xff0c 即可实现自启动 static int exec audio sample vo
  • (无人机方向)ros小白学习之路(一)ROS创建节点与编译

    文章目录 前言ROS创建节点与编译创建工作空间 1 创建和初始化 2 编译 3 为新建的工作空间配置系统环境ros功能包的创建1 xff1a 自定义功能包的创建2 xff1a 在github上下载功能包源码 ROS功能包常用指令1 xff1
  • 使用pjsip传输已经编码的视频

    pjsip功能很强 xff0c 做sip rtp语音通话库首选 在2 0之后 xff0c 也支持视频 不过 xff0c 它的视频功能缺省是从视频设备采集 xff0c 然后进行编译 xff0c 再发送出去的 假设 xff0c 我们已经有了视频
  • CentOS7中英文输入法及切换

    安装完CentOS7后如果没有拼音输入法 xff0c 先在输入源里找下有没有 打开设置 gt gt 区域和语言 gt gt 输入源 搜索pinyin就可以找到拼音输入法 xff0c 然后点击添加 回到设置 xff0c 选择键盘 gt gt
  • rtpsession详解

    以下过程仅分析推送视频模式 xff1a 服务器监听rtsp端口号 xff0c 当有客户端连接后 xff0c 会创建RTSPSession xff0c 在客户端请求过程中的announce时 xff0c 会创建RTPSession xff0c
  • gdb调试coredump(使用篇)

    什么是coredump Coredump叫做核心转储 xff0c 它是进程运行时在突然崩溃的那一刻的一个内存快照 操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下 xff0c 会把进程此刻内存 寄存器状态 运行堆栈等信息转储保存在
  • ffmpeg常用基本命令(转)

    ffmpeg f s16le ar 16000 ac 2 i lucy 16k pcm output wav ffmpeg f s16le ar 48000 ac 2 i lucy 48k pcm output 48k wav ffmpeg
  • busybox详解

    转载地址 点击打开链接 1 根文件系统简介 所谓制作根文件系统 xff0c 就是创建各种目录 xff0c 并且在目录里创建相应的文件 例如 xff1a 在 bin目录下放置可执行程序 xff0c 在 lib下放置各种库等等 通常配合chro
  • Linux下查看文件和文件夹大小

    1 Linux下查看文件和文件夹大小2 删除系统日志等 场景 xff1a 在sts中执行自动部署时候maven提示 No space left on device错误 xff0c 后来经检查发现是磁盘空间满了 xff0c 用下面的方法分析发
  • 解决安装wine时的依赖问题

    因为在Linux上没有比source insight更强大的代码工具了 xff0c 故在ubuntu上必须继续使用source insight 前段时间安装过wine xff0c 什么问题也没有 xff0c 安装命令 sudo apt ge
  • ros kinect设备 gmapping 出现"No matching device found" 错误

    电脑连接上kinect v1 xff0c 运行命令 xff1a roslaunch turtlebot navigation gmapping demo launch 出现下面的错误 INFO 1511252619 048751272 No
  • 找到文件夹下所有的软链接

    这个比较简单 xff0c 使用命令 ls alR grep l
  • (无人机方向)ros小白学习之路(五)mavros消息的订阅和发布与offboard例程仿真与解析

    文章目录 前言应用mavros控制无人机消息流以mavros中setpoint position local为例子1 确定话题的功能和消息类型如果快速找到对应的mavlink消息 2 确定话题并最终找到转化为uorb消息 官方example