四旋翼利用mavros进行GPS坐标指点飞行

2023-05-16

 先介绍一般px4飞控的xyz坐标指点飞行:

利用mavros的 /mavros/setpoint_raw/local 话题可以发送东北天(ENU)坐标给px4飞控进行指点飞行。ENU坐标原点在起飞点,东向为x坐标,北向为y坐标,天向为z坐标。z坐标高度对应 /mavros/local_position/local 中的z坐标,根据px4设置的不同可能是气压计、高度传感器或者差分GPS高度。

下面介绍如何进行gps坐标指点飞行:

户外我们往往希望给定一个gps坐标让四旋翼飞过去,而不是给定一个相对于起飞点的xyz坐标。这时有两种方案:

方法一、直接发送gps坐标

一种方法是利用mavros的 /mavros/setpoint_raw/global 话题直接发送gps坐标和高度给px4飞控,但是我不建议这么做。首先是因为很多人试过用这个话题但是没有成功,其次这个话题里的z坐标高度含义也不那么清晰,我还没明白这个高度到底是对地高度?gps高度?气压计高度?还是海拔高度?实际使用中也极其不建议直接就发gps坐标进行指点飞行,因为我们对经纬度的大小也没有一个直观的感受,经纬度小数点后6位才大致对应1m,给出的经纬度坐标稍有偏差飞机就不知道会飞向何方了,这不利于安全。

方法二、先将gps坐标转化为ENU坐标

第二种方法是将gps坐标先转化为ENU坐标系下的xyz坐标,然后还是用 /mavros/setpoint_raw/local 话题发送给px4飞控。如果你去阅读px4源码里的mavlink_receiver.cpp代码(这是px4接收mavros等mavlink信息的文件),你会发现即使你是用第一种方案向 /mavros/setpoint_raw/global 话题直接发送gps坐标,px4还是会先将gps坐标转化为相对于起飞点的xyz坐标,然后再和 /mavros/setpoint_raw/local 的坐标指令一样地处理。这个px4源码里用的gps坐标转换为ENU坐标的代码如下: 

 其中map_projection_project函数就是根据给定的参考点gps坐标ref、目标点gps坐标lat和lon,来计算两点之间的xy坐标差(这个x是东,y是北?)。对于原点在起飞点的ENU坐标系,参考点gps坐标其实就是起飞点的gps坐标啦。

map_projection_reproject则是给定ENU坐标系下的xy坐标差和一个参考点gps坐标ref,计算出目标点的gps坐标lat和lon。

这两个转换函数很简单也很常用,但是转换结果未必十分精准。因为地球毕竟是椭球形,将球形平面的经纬度坐标转换为平面内的笛卡尔坐标xy必然有转换误差(主要来源于对椭球的描述偏差)。由此可见,即使是给px4直接发送gps坐标指点飞行,飞机也不是用gps坐标直接进行位置环反馈控制,因此飞行的gps结果也未必十分精准。

我们还在网上找到了更精准的gps坐标转笛卡尔坐标的代码,它将地球按照维度分为了五段,计算过程更复杂但也更准确,xy输出结果和以上px4内部的转换代码大致相差1%。代码链接:  使用时引用头文件,然后直接调用函数。也可以参考uavros_simulation/uavros_wrzf_sitl/src/uav_controller.cpp · Peixuan Shu/UAVros - 码云 - 开源中国 (gitee.com)中的gps_to_local函数写法(注意引用头文件WGS84toCartesian.hpp)

注意px4中ENU坐标系用的原点gps坐标未必是home点,一般ENU的原点是飞控上电稳定后的点,但是飞机可能有被搬动或者多次起降的情况,这时home点会变化但是ENU的原点不会变,而且home点更新很慢也容易出错。因此在读取参考点gps坐标时,最好的方式是等飞控和上位机程序启动稳定后(否则读到的gps坐标是错误的!),同时读取当前gps坐标(/mavros/global_position/global) 和ENU坐标 (/mavros/local_position/pose), 利用gps_to_local函数或者前文提到的map_projection_project 算出目标点和当前点的xy坐标差,加上当前的ENU坐标,就能得到目标点的ENU坐标了!这里也可以参考uavros_simulation/uavros_wrzf_sitl/src/uav_controller.cpp · Peixuan Shu/UAVros - 码云 - 开源中国 (gitee.com)

注意

户外gps指点飞行很危险,再三确认坐标值正确,经纬度和xy前后顺序正确,高度正确,再进行指点飞行。直接发送xy坐标指点飞行时,使用的是px4自带的位置环控制,会有大角度机动出现,px4的位置环PID参数为MPC_X等,最大限速v_max也可以修改(QGroundControl地面站中修改)

而且不建议利用指点飞行起飞。如果直接给定飞机上方一点坐标使其起飞,电机会突然从停转状态达到最大转速,飞机也会噌地一下快速飞起来。建议用px4自带的takeoff模式起飞,它会有一个递增的坡度限幅使得电机转速慢慢增加,飞机也是平稳起飞。如果转速增加太慢,可以修改px4的ramp值(QGC搜索ramp或者takeoff)。如果室内用uwb飞行则不能用takeoff模式,因为它的local坐标值是用uwb位置填充的,起飞点就不是(0,0),(而且没有gps导致home点也不会更新?)飞机自动起飞时会直接侧倾向uwb的零点飞过去。

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

四旋翼利用mavros进行GPS坐标指点飞行 的相关文章

  • python人工智能技术

    人工智能 xff08 AI xff09 已成为当今世界的热门话题 xff0c 它的应用范围越来越广泛 其中 xff0c Python成为AI开发中最受欢迎的编程语言之一 Python提供了许多功能强大的库和框架 xff0c 大大简化了开发人
  • 利用X-CTU软件给P900数传配置参数

    转自 xff1a 70条消息 P900数传参数配置 落体偏东 CSDN博客 ATS104设置网络号 xff08 设置主从之间通讯连接的密码 xff09 ATS105设置单元号 xff08 给自己使用的数传进行编号 xff0c 防止主从混乱
  • px4添加自己编写的代码并编译

    1 在px4项目下的src文件夹下的modules文件夹中创建一个文件夹 xff0c 如图我创建了一个position control文件夹 xff0c 在该文件夹中添加自己写的代码程序 xff0c 同时添加一个CmakeLists txt
  • 思岚A1M8激光雷达-ubuntu18.04-slam建图参考

    Rplidar A1 A2使用及Hector SLAM建图 NouriXiiX的博客 CSDN博客 激光雷达初体验 Ubuntu 18 04 43 思岚科技 RPLIDAR A1M8 43 ROS 上手使用 银时大魔王的博客 CSDN博客
  • intel Realsense D/T系列 kalibr标定

    kalibr官方源码GitHub ethz asl kalibr The Kalibr visual inertial calibration toolbox 鼠标下拉找到install follow the install wiki pa
  • gazebo仿真遇到的FCU问题

    当使用roslaunch xxx launch命令进行gazebo仿真时出现 FCU Preflight Fail Accel 0 uncalibrated或者FCU Preflight Fail Baro Sensor 0 missing
  • 大广角USB摄像头选用指南

    起因是我要做一个二维码引导无人机降落的实验 四旋翼无人机搭载单目下视摄像头 xff0c 用于识别地面的二维码 我选择摄像头的标准基本上只有一个 xff1a 视场角越大越好 为此查阅了一些资料 xff0c 买了很多镜头和底板 xff0c 有了
  • 一:XTDrone平台上将视觉SLAM2与gazebo仿真集合

    1 XTDrone仿真平台配置 参考官方教程 xff0c 基本没大问题 仿真平台基础配置 语雀 依赖安装sudo apt install y n https www yuque com xtdrone manual cn basic con
  • 线程和进程的区别

    不少刚看到这两个词 xff08 特别是不是计算机专业的 xff09 小伙伴可能会比较疑惑 xff0c 线程和进程有什么区别 xff0c 网上有许多专业性的解答 xff0c 但是既然不少小伙伴不是计算机专业的 xff0c 那就结合例子做个大概
  • Pixhawk烧写自己开发过的1.11.0固件连接不上QGC

    最近在更改代码烧写固件后 xff0c 飞控就连接不上地面站 xff0c 以为是飞控坏了 xff0c 烧写了最新版的固件发现有可以连接到地面站了 xff0c 又烧写了同一版本的其他代码发现也可以连接qgc xff0c 应该是自己写的代码某个部
  • C标准库string.h源码(简单版)

    C标准库string h源码 xff08 简单版 xff09 strcpy strncpystrcat strncatstrcmp strncmpstrchr strrchr strchrnul strstrmemcpy memmove s
  • 二进制浮点数以及二进制浮点数算术运算

    二进制浮点数以及二进制浮点数算术运算 二进制浮点数表示半精度浮点数单精度浮点数双精度浮点数特殊情况 浮点数的运算步骤一 对阶二 尾数运算三 结果规格化左规操作右规操作 四 舍入处理五 溢出判断六 例子二进制浮点数加法二进制浮点数减法二进制浮
  • SMPL源代码实现和模型解读

    对于SLAM的工作已经告一段落了 xff0c 传统的人体动态三维重建也要告一段落了 xff0c 由于课题研究的方向是基于图像 视频的人体三维重建 xff0c 三维shape pose的恢复 xff1a 所以今天和大家交流的是SMPL模型 x
  • 自主悬停&高度融合 作者:nieyong

    自主悬停 amp 高度融合 作者 xff1a nieyong 自主悬停是Crazepony玩家问得最多的问题 xff0c 也是技术难度最高的问题 首先我们明确什么是自主悬停 xff1f 下面是一位资深航模玩家对于自主悬停的解释 飞行器能够悬
  • 如何高效地阅读技术类书籍与博客

    原文地址 xff1a http www nowamagic net librarys veda detail 2050 如何高效地阅读技术类书籍与博客 影像阅读法 阅读是自我提升的一个有效方法 xff0c 阅读书籍 阅读博客都是我们技术提升
  • MP地面站二次开发教程(一)开发环境搭建和编译

    目录 基于Mavlink的上位机地面站开发教程 第一节 开发环境搭建 1 预编译 xff08 源码尽量放到非中文目录下面 xff09 2 初次编译 3 删除这个speech引用 xff0c 重新引用这个speech包 每个人的环境不一样 x
  • MP地面站二次开发教程(三)Mavlink通讯协议(1)

    目录 1 协议介绍 消息结构 消息解析 消息数据流 2 消息解析 3 指令发送 Mavlink主要是飞控和地面站之间的消息指令发送 xff0c 包含地面站解析飞控发来的mavlink数据流 xff0c 和地面站向飞控发送mavlink指令
  • pdf嵌入字体(不用adobe pdf打印机)

    外文会议 期刊投稿一般要求pdf中的字体应当是嵌入状态 xff0c 避免其他电脑缺失字体导致pdf文字无法正常显示 1 检查字体是否嵌入 可以用Adobe Reader或者Acrobat等pdf阅读器打开后 xff0c 查看 属性 gt 字
  • MP地面站二次开发教程(三)Mavlink通讯协议(2)协议使用

    目录 1 协议移植 2 协议代码框架 1 协议移植 移植MAVLINK库 xff0c 在写新的代码的时候添加到项目工程即可 2 协议代码框架 理解三个线程1 主界面UI线程 2 数据读取线程 3 MAVLINK数据填充线程 主要的类的理解
  • MP地面站二次开发教程(三)Mavlink通讯协议(4)地面站数据显示调试及其指令填充

    目录 1 利用SimpleExample和Mavlink inspector的调试使用 2 Mavlink设置模式指令的填充 3 Mavlink控制指令的填充 4 MAV CMD 在地面站做一些显示和指令写入的时候 xff0c 因为PX4和

随机推荐