offboard代码超详细注释

2023-05-16

这一部分主要对服务做了特别详细的讲解

#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(使用前将#替换为@)

offboard代码超详细注释 的相关文章

随机推荐

  • 「VScode」通过VScode进行git的版本管理

    前言 之前在git的版本管理上 xff0c 我使用的是sourcetree xff0c 说实话 xff0c 软件还是蛮好用的 xff0c 界面化做的很好看新手用起来也不复杂 xff0c 不过安装上不是很方便而已 但既然VScode提供了gi
  • 「npm」安装依赖时,报错Error: EACCES: permission denied

    背景 运行环境 xff1a CentOS Linux release 7 5 1804 node版本 xff1a v16 19 0 运行时执行 xff1a npm install 报错如下 xff1a vue span class toke
  • 「VScode」在vscode中通过cookie登录leetcode

    前言 我是用中国版的leetcode xff0c 但是不知道为什么用密码登录总是失败 xff0c 最后用cookie登录上的 简单记录一下 xff0c 方便大家查看 基础设置 扩展设置 在设置中找到 endpoint 选择 leetcode
  • Qunee for HTML5的学习与使用笔记(一)

    在CSDN中的第一篇博文就献给我学习了一段时间 xff0c 仍然在研究使用的Qunee吧 因为是在公司里面后接手的这个插件 xff0c 上一个使用的同事再简单交接了一下之后 xff0c 就离开公司了 xff0c 所以一切的依靠就只有官网啦
  • 在history模式下部署vue项目到tomcat服务器的踩坑经历【前端VUE+后端JAVA】

    前言 因为是要将之前用jq写的前端代码重构为基于vue下的项目 xff0c 又是第一次将vue运用起来 xff0c 所以真的可谓是一步一个坑 xff0c 今天先记一波部署的坑 vue项目源码中的修改 router默认的模式是hash xff
  • 页面跳转路径出现;JSESSIONID=XXX的问题【前端VUE+后端JAVA】

    前沿 后台的JAVA框架时在前后端没有分离的时候编写的 xff0c 因为修改起来工程量比较庞大同时也很复杂 xff0c 所以现阶段只是将前端用vue来重写项目框架 xff0c 来减轻项目的运行负担 在与后台结合的时候还是会出现一些运行冲突而
  • express的学习笔记(一)——server.address()

    前言 在跟这教程学习时 xff0c 遇到了一处和教程展示内容不相同的地方 xff0c 后进行修改得以一致 xff0c 遂进行记录 问题 教程中有段代码是这样得 var express 61 require 39 express 39 var
  • Intel RealSense实感深度摄像头自校准(Self-Calibration)步骤详细,D400系列适用

    喜提国庆8天工作乐 xff0c 改代码真的很帅 xff0c 才华皆一切 xff0c 这篇博客的由来是因为我做实验了 xff0c 然后摄像头的有效距离贼差 xff0c 打了技术人员的电话说他们的有效距离4m xff0c 然后边缘相差为百分之2
  • Anaconda导致的GMT安装报错

    这两天在使用gmt6 3 0绘制直方图时 xff0c 发现一旦使用其 L选项 xff0c 数据统计就是错误的 让同学帮忙用gmt6 2 0绘制时就没有这个错误 xff0c 于是决定卸载gmt6 3 0重装gmt6 2 0 在完成所有准备工作
  • 服务器能ping通,ssh却连不上

    问题现象 xff1a 1 原来用Xshell连着的窗口能正常操作 2 重新打开新的窗口却提示 xff1a Connecting to 192 168 36 61 22 Connection established To escape to
  • ubuntu-18.04 root登录图形界面失败问题解决方案

    1 设置ROOT密码 先输入当前所在用户密码 xff0c 然后输入你要设置的root密码 xff0c 输入两次即可 xff01 2 进入 etc pam d目录 主要修改两个文件 圈了红色框框 xff0c 记得命令行下切换root账户 su
  • 树莓派做飞控的四轴无人机

    为什么拿树莓派做飞控 市面上有很多机遇stm32的现成飞控和教程 我碰巧有做一个无人机的想法 xff0c 而且手上刚好有树莓派4b一个 树莓派支持pyrhon编程和实时调控 需要准备的材料 电流电压匹配的电机 电调和电池 我选择的是闲鱼买的
  • linux系统之根文件系统树制作

    前言 xff1a 很早就在linux下做过了uboot移植 xff0c linux内核移植以及文件系统的制作 xff0c 一直没有来得及总结 xff0c 现在好好把之前做过的东西整理一下 xff0c 主要是为了备忘 现在总结一下根文件系统树
  • 二级必会词汇

    形容词 xff08 xff11 xff09 xff11 惜 xff12 xff1a 怪 xff13 xff1a 嬉 xff14 xff1a 悲 xff15 xff1a 厳 xff16 xff1a 悔 xff17 xff1a 苦 xff18
  • python学习-isinstance()

    isinstance 是一个内置的函数 xff08 BIF xff09 它允许某个特定标识符是否包含某个特定类型的数据 如判断某个对象是不是列表 字典 整型等 gt gt gt a 61 1 2 3 gt gt gt b 61 123 gt
  • Ubuntu上安装PX4

    文字教程 视频教程 在Win10上安装虚拟机 VMware Workstation 16 Pro xff0c 在虚拟机安装18 04版ubuntu xff0c 其他版本可能安装不成功 xff0c 之前我20版本就安装失败 下列步骤开始前 x
  • stm32 红外遥控实现

    一 概述 红外遥控采用NEC协议 定时中断 预分频器采用72 xff0c 72M 72 61 1M xff0c 每秒1千次 xff0c 一次1us xff0c 即第1us计数器加1 溢出值设为10000 xff0c 即10ms xff0c
  • 关于simulink中的函数function模块

    前言 xff1a 我们前面提到过当遇到库中没有我们需要的模块时 xff0c 我们可以自己书写s函数 xff0c 其实s函数是一个比较高端的工具 xff0c 是用来书写一些比较复杂的模块 xff0c 而遇到一些简单的模块 xff0c 我们可以
  • px4飞行数据.ulg文件的分析

    参考 xff1a https blog csdn net walk2011 article details 83757139 以及 xff1a https blog csdn net qq 42570955 article details
  • offboard代码超详细注释

    这一部分主要对服务做了特别详细的讲解 span class token macro property span class token directive keyword include span span class token stri