基于单目视觉的四旋翼定点降落——如何通过mavros控制pixhawk(二)

2023-05-16

    一直拖了这么久没有更新,怪我太懒啦~~~ 今天要特别感谢舒仔仔同学,我的好队友帮我写了这篇博文。这篇文章主要讲了如何通过mavros来控制pixhawk。硬件逻辑是这样子,我们先搞一个odroid(土豪上TX2),再用usb线将odroid与pixhawk连接。所以,odroid发送控制指令来控制pixhawk飞行。pixhawk与外界的通信协议是mavlink。ROS下面有个包叫mavros,说到底就是mavlink的封装,用起来非常简单。话不多说,上正文。

mavros安装:

使用apt-get安装即可:

sudo apt-get install ros-kinetic-mavros ros-kinetic-mavros-extras ros‐kinetic‐control‐toolbox

我所安装的ros版本是kinetic。

其安装过程非常简单,在网上查询使用方法却说得很笼统,大多是按照官方教程,但实际上并没有详细的讲如何使用。


1.  官方例程:

参考:https://dev.px4.io/zh/ros/mavros_offboard.html

ROS包中创建offb_node.cpp文件(具体怎么建立ROS包,可参考ROSWiki教程,写得很详细),并粘贴下面内容:

/**
 * @file offb_node.cpp
 * @brief offboard example node, written with mavros version 0.14.2, px4 flight
 * stack and tested in Gazebo SITL
 */

#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_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::NodeHandle nh;

    ros::Subscriber state_sub = nh.subscribe<mavros_msgs::State>
            ("mavros/state", 10, state_cb);
    ros::Publisher local_pos_pub = nh.advertise<geometry_msgs::PoseStamped>
            ("mavros/setpoint_position/local", 10);
    ros::ServiceClient arming_client = nh.serviceClient<mavros_msgs::CommandBool>
            ("mavros/cmd/arming");
    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);

    // wait for FCU connection
    while(ros::ok() && current_state.connected){
        ros::spinOnce();
        rate.sleep();
    }

    geometry_msgs::PoseStamped pose;
    pose.pose.position.x = 0;
    pose.pose.position.y = 0;
    pose.pose.position.z = 2;

    //send a few setpoints before starting
    for(int i = 100; ros::ok() && i > 0; --i){
        local_pos_pub.publish(pose);
        ros::spinOnce();
        rate.sleep();
    }

    mavros_msgs::SetMode offb_set_mode;
    offb_set_mode.request.custom_mode = "OFFBOARD";

    mavros_msgs::CommandBool arm_cmd;
    arm_cmd.request.value = true;

    ros::Time last_request = ros::Time::now();

    while(ros::ok()){
        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 {
            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);

        ros::spinOnce();
        rate.sleep();
    }

    return 0;
}


该程序的主要功能是:使无人机缓慢飞到2米的高度。

这是一段复制上去就可以直接用的程序,但想要理解深刻,需要对ROS有一定的了解,在了解后,才能看懂下面的内容。下面将对代码的每一部分进行分析,使其能够实现自己想要实现的功能。

需要注意的是:对于用于发送接收的mavros的结构体变量的使用,最好还是查看mavros包中的变量定义,这有助于灵活的对代码进行调整。

2.     消息的订阅和发布

首先讲述一下以上程序所实现的功能。首先使飞机进入offboard模式,再进行解锁,最后发布指令使飞机飞到2米的高度。这一系列功能的实现就用到了ROS强大的发布订阅机制。

可以参照这两个网页:

http://wiki.ros.org/mavros

https://404warehouse.net/2015/12/20/autopilot-offboard-control-using-mavros-package-on-ros/

这两个网站上都详细说明了mavros可发布和订阅的消息以及变量类型,举例说明:

2.1 消息订阅(注意:所订阅的消息需要有回调函数去接收它):

可以看到截图中清楚地写明了订阅消息所需要地信息,那为什么这里是发布呢?这是因为这是站在mavros的角度看的呀~

//回调函数
mavros_msgs::State current_state;
void state_cb(const mavros_msgs::State::ConstPtr& msg){
    current_state = *msg;
}

//消息订阅
ros::Subscriber state_sub = nh.subscribe <mavros_msgs::State> ("mavros/state", 10, state_cb); 

2.2 消息发布:

ros::Publisher local_pos_pub = nh.advertise<geometry_msgs::PoseStamped>
            ("mavros/setpoint_position/local", 10);
geometry_msgs::PoseStamped pose;
pose.pose.position.x = 0;
pose.pose.position.y = 0;
pose.pose.position.z = 2;

//消息发布
local_pos_pub.publish(pose);

同理,在下面截图中也有非常清楚的说明:

上面的代码意思是将坐标从初始点飞到2米的高度,同时该结构体中还有另外4个给定姿态的量,就是四元数,x,y,z,w。从下面这张图可以看出:

使用方法嘛~~~

pose.pose.quaternion.x = 0;
pose.pose.quaternion.y = 0;
pose.pose.quaternion.z = 0;
pose.pose.quaternion.w = 0;

想好你的姿态,换算成四元数复制进去就好啦~

所以!mavros的维基是入手mavros控制的最好的教程,不然看其它的都没有用,当然首先还是要掌握ROS的发布订阅机制才行。

发布消息的时候有一点需要注意:

local_pos_pub.publish(pose);

都看得出来,这一句是发布消息的。那是不是有人问,怎么一段代码里发布了这么多遍?

这在上面的链接里也写得很清楚,我们所使用的pixhawk需要以至少2Hz的频率接收消息,否则将会从offboard模式切回RTL模式。

开始的一段,是为了告诉pixhawk有消息要传过来啦~

中间在切换状态和arm的时候,是为了保持其pixhawk接收寄存器里有值,通俗点嘛,就是既然我要用offboard模式了,你总得先告诉我要怎么搞吧,不然刚切过去那会怎么办呢?随意嘛?哈哈~

那当其正常运行的时候,当然要通过发布消息来尽情的控制你的小飞机啦~

3 怎么和pixhawk连接?

Emm,很简单,直接用USB就可以哈哈~

新打开一个终端,运行:

roslaunch mavros px4.launch fcu_url:=/dev/ttyACM0;

再把上面offboard的节点运行起来就可以啦~

 

当然,要想搞实物,需要先仿真,下面一节我们就来讲讲仿真怎么搞~

参考文献:

1.    http://wiki.ros.org/mavros

2.    https://404warehouse.net/2015/12/20/autopilot-offboard-control-using-mavros-package-on-ros/






本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于单目视觉的四旋翼定点降落——如何通过mavros控制pixhawk(二) 的相关文章

  • C++实验:多态性与虚函数

    C 43 43 实验 xff1a 多态性与虚函数 1 实验目的 xff08 1 xff09 了解多态性的概念 xff08 2 xff09 了解虚函数的作用及使用方法 xff08 3 xff09 了解静态关联和动态关联的概念和用法 xff08
  • 2014流水账

    欢迎转载 xff0c 转载请注明出处 本文地址 xff1a http blog csdn net zhenggaoxing article details 42386821 三天元旦小长假结束了 xff0c 先来回顾下三天的假期 xff1a
  • IOS中文排序学习

    前言 xff1a 最近有中文排序的需要 xff0c 发现系统没有提供中文排序的方法 xff0c 于是参考学习了网上前辈的代码实现了中文排序功能 xff0c 本文记录的就是学习实现中文排序的过程 实现英文排序 系统提供了英文排序的方法 写了一
  • IOS 定制中间突出UItabBar

    前言 xff1a 公司的项目需要定制一个中间突出的TabBar xff0c 在github 上找到一份可以参考的代码 xff08 虽然是四年前的 xff0c 但是还是很有参考价值 xff09 网址 xff1a https github co
  • Xcode删除所有断点

    问题是这样的 xff1a 接手新的项目 xff0c 顿时吓尿了 xff1a 整个程序有无数个断点 xff0c 那么如何一次性删除呢 xff1f 如下图 xff1a 点击Belete Breakpoints 就可以了
  • VSCode重新启用“错误波形提示”

    2020 06 09 更新常见问题 昨天晚上写伪码的时候 xff0c 看着VSCode的错误提示实在是心烦 xff0c 就手贱点了一下 禁用错误波形提示 xff0c 也就是disable error squiggles xff0c 但写完之
  • TortoiseSVN使用教程[多图超详细]

    安装及下载client 端 下载Windows 端程序 xff1a http tortoisesvn net downloads 一般而言 xff0c 如果是32 bit的Windows XP 应该使用TortoiseSVN 1 4 x x
  • 将UIColor转换为RGB值

    objc view plain copy 将UIColor转换为RGB值 NSMutableArray changeUIColorToRGB UIColor color NSMutableArray RGBStrValueArr 61 NS
  • 业余时间你在做什么,你就会变成什么样的人?

    改变 xff0c 从业余时间开始 博客定位 xff1a 技术 43 思考 其余统统不要 2017 xff0c 我来了 xff01
  • Xcode9 无证书真机调试

    写在前面 公司分配了新的测试机 证书99台名额已满 所以上网找教程 学习了一下如何使用Xcode无证书进行真机调试 一 创建证书 1 运行Xcode xff0c Xcode Preference 添加账号 xff08 能在appstore下
  • CSP考试复习:第一单元 C++语言基础 1.1 程序结构

    第一单元 C 43 43 语言基础 1 1 程序结构 1 程序框架 注释 xff1a 注释有两种 xff0c 一种是 xff0c 另一种是 必须单独放置一行 xff0c 或代码所在行 的后面 xff1b 而 成对存在 xff0c 可以插入到
  • Intel Realsense T265开箱测试

    前言 xff1a 最近因为要做VIO xff0c 在实验室蹭到一个Realsense T265来用 xff0c 仅此记录下简单测试过程 xff08 官方文档写非常清楚 xff0c 建议详细阅读 xff0c 链接 xff1a https gi
  • posix thread介绍

    xfeff xfeff posix thread是 操作系统级 xff08 OS level xff09 的API规范 xff0c 主要用来定义线程及线程间同步的相关操作 xff0c 采用C语言定义 posix规范主要在unix like类
  • PX4飞控之自主起飞Takeoff控制逻辑

    本文主要以PX4飞控1 5 5版本为例 xff0c 介绍Navigator中自主起飞 xff08 Takeoff xff09 算法控制逻辑 注 xff1a mission任务中的自主起飞与此模块不同 Takeoff与导航中的其他模块类似 x
  • PX4飞控之导航及任务架构

    本文重点介绍PX4飞控的Navigator和mission控制框架和逻辑 Navigator导航部分是无人机自主飞行控制的核心所在 xff0c 其中包括自主起飞 自主降落 自主返航 自主任务以及GPS失效保护等各个部分 搞懂这个部分有助于理
  • PX4飞控之位置控制(1)整体架构

    位置控制是无人机飞控的核心算法之一 xff0c 一方面根据commander中的flag标志位和Navigator中提供的航点信息进行控制 xff08 自主模式下 xff09 xff0c 另一方面得到期望姿态角 xff08 setpoint
  • spring整合ehcache找不到org.springframework.cache.ehcache.EhCacheCacheManager的解决方案

    一般org springframework cache ehcache EhCacheCacheManager和org springframework cache ehcache EhCacheManagerFactoryBean会同时找不
  • CC3200之GPIO引脚分析

    预备知识 xff1a xff08 1 xff09 volatile关键字 xff1a volatile定义的变量一般为无需开发者自己赋值 xff0c 会自动改变的变量 在普通的程序中 xff0c 编译器都具有优化功能 xff0c 为了避免浪
  • OpenStack 之 OVS介绍

    一 概述 Open vSwitch的官方定义 xff1a Open vSwitch是一个具有工业级质量的多层虚拟交换机 通过可编程扩展 xff0c 可以实现大规模网络的自动化 xff08 配置 管理 维护 xff09 它支持现有标准管理接口
  • OVN是OVS 5倍的性能--性能测试报告

    我们已经对OVN做了许多次的性能测试 xff0c 但是缺少一个OVN和 xff08 ML2 43 OVS xff09 的性能对比测试 我和许多人一起对比了这2种后端 本文是第一部分 xff1a 控制平面的性能对比 后面会另外发文公布数据平面

随机推荐

  • OpenStack 中的5种分配IPv6地址的方式

    在OpenStack Pike版本中创建IPv6子网时 xff0c 有五种设置地址方式供选择 上图中这五种方式显示不全 xff0c 现将其全部展示 No options specified xff08 Default xff09 xff0c
  • STM32 | TCP通信实例分析

    1024G 嵌入式资源大放送 xff01 包括但不限于C C 43 43 单片机 Linux等 关注微信公众号 嵌入式大杂烩 xff0c 回复1024 xff0c 即可免费获取 xff01 前言 关于socket的笔记 xff0c 之前已经
  • RT-Thread和Freertos的区别?

    关注 嵌入式大杂烩 xff0c 选择 星标公众号 一起进步 xff01 Freertos是一个国外推出的一个迷你的实时操作系统内核 xff0c 开源 xff0c 功能包括 xff1a 任务管理 时间管理 信号量 消息队列 内存管理 记录功能
  • C语言 | 函数指针作为函数的参数

    1024G 嵌入式资源大放送 xff01 包括但不限于C C 43 43 单片机 Linux等 关注微信公众号 嵌入式大杂烩 xff0c 回复1024 xff0c 即可免费获取 xff01 函数指针有两种常用的用法 xff0c 一种是作为结
  • 解析I2C通信协议

    一 I2C的概念 1 I2C总线是PHLIPS公司推出的一种串行总线 xff0c I2C总线只有两根双向信号线 其中一根是数据线SDA xff0c 另一根是时钟线SCL 2 每个接到I2C总线上的器件都有唯一的地址 发送数据到总线上的称为发
  • uCOS-II任务间通信之信号量 [转载]

    uCOS II任务间通信之信号量 信号量是什么 xff1f 信号量有什么用 xff1f 信号量是可以用来表示一个或多个事件的发生 xff0c 还可以用来对共享资源的访问 uCOS II提供了5个对信号量进行操作的函数 如下所示 xff1a
  • 关于STM32串口3的使用,接收并解析一帧数据

    关于STM32串口3的使用 xff0c 接收并解析一帧数据 当stm32的串口1被使用时 xff0c 我们可以使用其他串口来使用 步骤 xff1a 串口3定义 初始化 xff1b 串口3中断服务函数 接收的一帧数据并判断是否正确 xff1b
  • Windows Docker Desktop 无法启动报错 Docker Desktop is shutting down 的可能解决办法

    之前有一次 docker 启动到一半的时候电脑蓝屏了 xff0c 电脑重启之后 docker 就无法启动了 xff0c 一直报错 Docker Desktop is shutting down 网上查了一下 xff0c 发现一个可能的解决办
  • ESP8266的开发环境搭建、解决编译[Makefile:xxx: .subdirs] Error 2错误问题

    ESP8266的开发环境搭建 解决编译错误问题 ESP8266的开发环境搭建链接如下 ESP8266的开发环境搭建 在最后工程加载完毕后右击该工程 xff0c 在弹出的列表中选择 Build Project 编译工程 xff0c 如果在Co
  • 【数字图像处理】YUV420转RGB并BMP存储<纯C++实现>

    1 读取akiyo qcif yuv YUV420文件 xff0c 按帧读取 xff0c 转RGB xff0c 并存储到BMP文件 2 暂时实现读取一帧并存储一张BMP图片 若要读取YUV序列 xff0c 写成循环方式即可 3 生成的BMP
  • Unable to connect to the remote server 问题(已经解决)

    Unable to connect to the remote server 问题 xff08 已经解决 xff09 参考文章 xff1a xff08 1 xff09 Unable to connect to the remote serv
  • 【Android 源码学习】 init启动

    目录 Android 源码学习 init启动从main cpp开始init cpp 部分逻辑init启动zygote属性服务总结 Android 源码学习 init启动 Android 11 init 启动流程学习 主要是学习刘望舒腾讯课堂
  • Linux面试题 系统启动流程

    BIOS 基本输入输出系统 xff0c 帮助我们初始化硬件 硬盘分区有两类 xff1a MBR和GPT MBR单块硬盘不能大于2T xff0c 主分区的数量不能超过4个 xff1b MBR方案存储在第一个扇区的前446个字节 xff08 共
  • C语言中十进制转换十六进制(细解)

    十进制转换十六进制 span class token macro property span class token directive keyword include span span class token string lt std
  • 关于strtok的使用

    1功能 xff1a strtok是一个比较特殊的 xff0c 用于切割字符串的函数 2 使用我们先来看一下strtok的使用 strtok C 43 43 Reference char strtok xff08 char str xff0c
  • STL简介

    目录 一 STL是什么 二 STL怎么产生的 三 STL的六大组件 一 STL是什么 STL是c 43 43 标准库的重要组成部分 包含数据结构和算法的框架 比如 xff1a vector list sort STL Istream ost
  • SLAM秋招面经(大疆、华为、海康、图森、小马智行、地平线、momenta、滴滴)

    SLAM秋招面经 xff08 大疆 华为 海康 图森 小马智行 地平线 momenta 滴滴 xff09 前段时间一直没更新博客 xff0c 因为论文 实习 秋招一系列事情都非常忙 xff0c 如今秋招接近尾声 xff0c 稍有空闲 xff
  • 基于单目视觉的四旋翼定点降落——概述(一)

    从去年开了这个博客起就一直没有写过 xff0c 好在今天实验有了一些小进展 xff0c 所以想分享给大家 首先讲讲我做了些什么吧 我想做一个基于单目视觉的四旋翼定点降落 xff0c 能够让四旋翼从任意位置起飞之后 xff0c 完全自主地降落
  • 二分查找的经典样例

    对于查找任务来说 xff0c 通常就是寻找目标值或者目标区间出现的位置 而看到排序数组 43 查找 xff0c 第一反应就是二分查找 以下问题都可以直接转化到这个问题上来 34 在排序数组中查找元素的第一个和最后一个位置 查找元素出现的第一
  • 基于单目视觉的四旋翼定点降落——如何通过mavros控制pixhawk(二)

    一直拖了这么久没有更新 xff0c 怪我太懒啦 今天要特别感谢舒仔仔同学 xff0c 我的好队友帮我写了这篇博文 这篇文章主要讲了如何通过mavros来控制pixhawk 硬件逻辑是这样子 xff0c 我们先搞一个odroid xff08