Ardupilot飞控添加使用诺瓦泰GPS

2023-05-16

 

Ardupilot飞控添加使用诺瓦泰双天线GPS航向角的设置

 

一、添加诺瓦泰GPS heading角数据包解析代码

1、打开libraries\AP_GPS\AP_GPS_NOVA.h,添加如下代码:

   struct PACKED heading

    {

        uint32_t solstat;

        uint32_t postype;

        float length;

        float heading;

        float pitch;

        float resv1;

        float hdg_std_dev;

        float ptch_std;

        uint8_t stnID[4];

        uint8_t svstracked;

        uint8_t svslnsolution;

        uint8_t obsmask;

        uint8_t multi;

        uint8_t resv2;

        uint8_t extsolstat;

        uint8_t resv3;

        uint8_t sigmask;

};

在 msgbuffer中作如下修改:

union PACKED msgbuffer {

        bestvel bestvelu;

        bestpos bestposu;

        psrdop psrdopu;

        heading headingu;

        uint8_t bytes[256];

    };

2、打开libraries\AP_GPS\AP_GPS_NOVA.cpp,找到bool AP_GPS_NOVA::process_message(void)函数,添加如下代码:

if (messageid == 971) // heading

    {

        const heading &headingu = nova_msg.data.headingu;

 

        state.heading = (float) (headingu.heading);

        state.last_gps_fixed_time_ms = AP_HAL::millis();

        return false;

    }

同时,在本函数的开始处找到bestpos数据解析,定位到相应的位置并作如下修改:

 if (bestposu.solstat == 0) // have a solution

        {

            switch (bestposu.postype)

            {

                case 16:

                    state.status = AP_GPS::GPS_OK_FIX_3D;

                    state.last_gps_fixed_time_ms = AP_HAL::millis();

                    break;

                case 17: // psrdiff

                case 18: // waas

                case 20: // omnistar

                case 68: // ppp_converg

                case 69: // ppp

                    state.status = AP_GPS::GPS_OK_FIX_3D_DGPS;

                    state.last_gps_fixed_time_ms = AP_HAL::millis();

                    break;

                case 32: // l1 float

                case 33: // iono float

                case 34: // narrow float

                    state.status = AP_GPS::GPS_OK_FIX_3D_RTK_FLOAT;

                    state.last_gps_fixed_time_ms = AP_HAL::millis();

                    break;

                case 48: // l1 int

                case 50: // narrow int

                    state.status = AP_GPS::GPS_OK_FIX_3D_RTK_FIXED;

                    state.last_gps_fixed_time_ms = AP_HAL::millis();

                    break;

                case 0: // NONE

                case 1: // FIXEDPOS

                case 2: // FIXEDHEIGHT

                default:

                    state.status = AP_GPS::NO_FIX;

                    break;

            }

        }

  1. 打开libraries\AP_GPS\AP_GPS.h,找到结构体GPS_State,作如下添加:

struct GPS_State {

        uint8_t instance; // the instance number of this GPS

 

        // all the following fields must all be filled by the backend driver

        GPS_Status status;                  ///< driver fix status

        uint32_t time_week_ms;              ///< GPS time (milliseconds from start of GPS week)

        uint16_t time_week;                 ///< GPS week number

        Location location;                  ///< last fix location

        float ground_speed;                 ///< ground speed in m/sec

        float ground_course;                ///< ground course in degrees

        uint16_t hdop;                      ///< horizontal dilution of precision in cm

        uint16_t vdop;                      ///< vertical dilution of precision in cm

        uint8_t num_sats;                   ///< Number of visible satellites

        Vector3f velocity;                  ///< 3D velocity in m/s, in NED format

        float speed_accuracy;               ///< 3D velocity accuracy estimate in m/s

        float horizontal_accuracy;          ///< horizontal accuracy estimate in m

        float vertical_accuracy;            ///< vertical accuracy estimate in m

        bool have_vertical_velocity:1;      ///< does GPS give vertical velocity? Set to true only once available.

        bool have_speed_accuracy:1;         ///< does GPS give speed accuracy? Set to true only once available.

        bool have_horizontal_accuracy:1;    ///< does GPS give horizontal position accuracy? Set to true only once available.

        bool have_vertical_accuracy:1;      ///< does GPS give vertical position accuracy? Set to true only once available.

        uint32_t last_gps_time_ms;          ///< the system time we got the last GPS timestamp, milliseconds

 

        float heading; //RTKGPS heading

        uint32_t last_gps_fixed_time_ms;

};

并在AP_GPS类的public中添加如下函数:

    // GPS heading in degrees

    float gps_heading(uint8_t instance) const {

        return state[instance].heading;

    }

    int32_t gps_heading() const {

        return gps_heading(primary_instance)*100;

    }

    //get gps fixed time

    uint32_t gps_last_fixed_time(uint8_t instance) const {

        return state[instance].last_gps_fixed_time_ms;

    }

    uint32_t gps_last_fixed_time() const {

        return gps_last_fixed_time(primary_instance);

    }

 

  • 修改yaw漂移修正函数

打开libraries\AP_AHRS\AP_AHRS_DCM.cpp文件,找到void AP_AHRS_DCM::drift_correction_yaw(void)函数,找到else if并将其作如下替换:

else if (have_gps()) {

        //we are using GPS heading for yaw

        if ( _gps.gps_last_fixed_time() != _gps_last_update) {

            yaw_deltat = (_gps.gps_last_fixed_time() - _gps_last_update) * 1.0e-3f;

            _gps_last_update = _gps.gps_last_fixed_time();

 

            new_value = true;

 

            float gps_heading_rad = ToRad(_gps.gps_heading()*0.01f);

            float yaw_error_rad = wrap_PI(gps_heading_rad - yaw);

            yaw_error = sinf(yaw_error_rad);

 

            if (!_flags.have_initial_yaw ||

                    yaw_deltat > 20 ||

                    fabsf(yaw_error_rad) >= 1.047f){

                // reset DCM matrix based on current yaw

                _dcm_matrix.from_euler(roll, pitch, gps_heading_rad);

                _omega_yaw_P.zero();

                _flags.have_initial_yaw = true;

                yaw_error = 0;

            }

        }

}

 

  • 修改AP_AHRS_NavEKF.cpp文件:

打开libraries\AP_AHRS\AP_AHRS_NavEKF.cpp文件,找到 void AP_AHRS_NavEKF::update_EKF2(void)函数,并找到yaw=eulers.z;将其注释掉。//yaw=eulers.z

 

  • 修改AP_NavEKF2_core.cpp文件:

打开libraries\AP_NavEKF2\AP_NavEKF2_core.cpp文件,找到void NavEKF2_core::UpdateFiler(bool predict)函数,定位到SelectMafFusion();在其下面一行添加:调用recordYawReset();函数。

 

  • Ubuntu系统编译飞控代码
  1. 安装git

sudo apt-get install git

2、下载和安装交叉编译工具

wgeth ttps://launchpadlibrarian.net/218827486/gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2

tar -xjvf gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2

sudo apt-get install lsb-core

  1. 设置环境变量

   export PATH=/home/your user name/gcc-arm-none-eabi-4_9-2015q3/bin:$PATH

4、克隆飞控源码

    git clone https://github.com/ArduPilot/ardupilot.git

    cd ardupilot

git submodule update --init --recursive

5、运行unbuntu系统环境安装工具脚本

Tools/scripts/install-prereqs-ubuntu.sh -y

6、. ~/.profile

7、编译

   cd ArduCopter

   make px4-v2

8、清空编译文件

   make px4-clean

 

  • 烧写固件后参数设置

通过MissonPlanner地面站将编译好的固件ArduCopter-v2.px4(在ArduCopter目录下),烧写到pixhawk飞控板子,然后点击配置(CONFIG/TUNING),选择全部参数树(Full Parameter Tree),点击最右边刷新参数按钮(Refresh Params)。

                              

 

1、使用诺瓦泰GPS的设置

在参数表中,找到GPS,点击“+”号打开,找到GPS_TYPE,将其值设为15(即:使用诺瓦泰GPS),然后点击右边写入参数按钮(Write Params)。

 

  1. 禁用罗盘的设置

同样,在参数表中,找到COMPASS,点击“+”号打开,找到COMPASS_USE,COMPASS_USE2,

COMPASS_USE3,将它们全部设为0(不使用罗盘),然后点击右边写入参数按钮(Write Params)。

 

 

  1. 使用EKF2

 

 

并将EKF3关掉:

 

  • 诺瓦泰GPS输出配置

    1、初始化GPS,执行该命令后GPS波特率变为9600

freset

  2、设置GPS串口波特率为115200

com com2 115200 n 8 1 n off off       

com com1 115200 n 8 1 n off off

  1. 打开双天线测向功能

dualantennaalign enable 5 1

  1. 设置飞控需要的数据

位置信息:

log com1 bestposb ontime 0.2

速度信息:

log com1 bestvelb ontime 0.2

精度因子:

log com1 psrdopb ontime 0.2

航向角信息:

log com1 headingb onchanged

  1. 设置差分格式,与基站保持对应:

INTERFACEMODE COM2 NOVATELX NONE OFF

PSRDIFFTIMEOUT 15

RTKTIMEOUT 10

  1. 保存配置

       saveconfig

 

  • 诺瓦泰GPS接线

GPS的TX接到飞控板子的RX;

GPS的GND接飞控的GND;

GPSRX空置不用。

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

Ardupilot飞控添加使用诺瓦泰GPS 的相关文章

  • Android GPS 路由系统

    我正在开发一个 Android 应用程序 它可以定位用户 假设用户在路上 并且该应用程序将为用户创建最短路线 以便能够到达用户选择的目的地 定位用户不是问题 因为这里有一个 API http www vogella com articles
  • 如何确定当前用户位置是否在我的 MKCooperativeRegion 内?

    我有一个坐标区域 我已确定该区域包含我想要为我的应用程序显示的内容的限制 我已将其设置为具有中心点纬度 经度和跨度的 MKCooperativeRegion 如何确定当前 userLocation 是否在我的坐标区域内 使用地图矩形 这是使
  • 设置模拟位置时 GPS 提供商未知错误?

    我正在尝试设置我的模拟位置 但是 我收到以下错误 提供商 gps 未知 并且不确定出了什么问题 我已经获得了在manifest xml 中声明的所有权限以及所有参数 模拟定位法 Initiates the method to set the
  • 如何从广播接收器中取消注册侦听器并停止服务

    在我的应用程序中 我有一个广播接收器 当接收到短信中的关键字时 它会启动一项跟踪手机 GPS 位置的服务 我这样做使用 context startService new Intent context TrackGPS class 我还需要能
  • GMSPolyline 非常大的内存峰值

    在允许用户在各种不同类型的地图上显示我们称之为轨迹的复杂位置点列表的 GPS 应用程序中 每个轨迹可以包含 2k 到 10k 个位置点 当轨迹在非 Google 地图类型上呈现时 它们会被大量剪切 修剪和路径简化 这是为了降低内存使用量并提
  • GPS 坐标(以度为单位)来计算距离

    在iPhone上 我以十进制度数获取用户的位置 例如 纬度39 470920和经度 0 373192 也就是A点 我需要用另一个 GPS 坐标 同样以十进制表示 B 点创建一条线 然后 计算从 A 到 B 的线与另一个点 C 之间的距离 垂
  • 根据 GPS 坐标计算平均速度的最佳实践

    我这里有一个可以给我 GPS 坐标的设备 我可以定义的时间间隔 我想用它来计算驾驶或驾车旅行时的平均速度 实际上 我使用了正交公式来计算两点之间的距离 然后将其除以给定的时间间隔 通过我遵循的实施这个词 http de wikipedia
  • 从 GPS 点绘制线

    我有大约 100 个 GPS 坐标列表 我想画出每个列表所构成的线 使用散点图绘制的列表之一 看起来有点像这样 显然那里有一条线 我尝试了几种方法来对 GPS 位置进行排序并绘制它们 lats lngs with open filename
  • 在不改变我的位置的情况下获取当前位置的经度和纬度

    我可以找到当前位置的纬度和经度 但是这些数据在更改我的当前位置之前不会显示 我想在不更改我的位置的情况下获取当前位置的经度和纬度 package com example gps import android app Activity imp
  • Google 地图 (Android) 中的位置更新率

    我正在编写一个简单的基于 GPS 的应用程序 用于位置感知 每当启用 GPS 时 应用程序都会请求位置更新并以格式打印纬度和经度 TextView 如果 GPS 被禁用 位置提供商会回退到LocationManager NETWORK PR
  • 在没有互联网的情况下使用 Javascript 获取 GPS 位置 [重复]

    这个问题在这里已经有答案了 您好 如果设备具有 GPS 硬件 我们可以在没有互联网连接的情况下使用 JavaScript 获取 GPS 位置吗 请注意谁将其标记为重复 我需要 JavaScript 在没有互联网连接的情况下工作 并使用 GP
  • 如何在 Android 中像 Google 地图一样获得持续的位置更新?

    我正在构建一个朋友跟踪 Android 应用程序 当我的朋友激活应用程序并带着他的 GPS 和蜂窝数据离开时 我需要在我的设备上跟踪他 这就是这个概念 我已经实现了 LocationListener 类 现在我可以从 Gps 或网络获取最后
  • 关闭应用程序后如何调试

    我正在尝试重现问题 这需要在特定位置关闭并重新打开我的应用程序 这是我的问题 1 如何查看我的日志 使用NSLog命令 当我的 iPhone 未连接到 XCode 时 2 是否可以将iPhone模拟器的特定位置 例如市中心 设置为默认位置
  • 使用 WGS84 椭球的距离

    考虑点 P1 60 N 20 E 0 和 P2 60 N 22 E 0 地球表面 当形状为 P1 和 P2 时 点 P1 和 P2 之间的最短距离是多少 地球是使用 WGS 84 椭球体建模的吗 不幸的是 文森蒂算法对于某些输入无法收敛 地
  • 在 iOS 上从 GPS 获取时间

    我正在开发一个跟踪器应用程序 该应用程序需要高精度地了解设备位置 即它使用位置服务并忽略水平精度低于 20 米的位置 CLLocation没有明确声明是否通过 GPS 确定 但是 如果水平精度为 20 米或更好 则可以认为它是来自 GPS
  • 是否可以自定义区域形状?核心位置

    例如 至少我想要一个正方形 矩形 道路的形状作为我的区域 不它不是 根据文档 目前唯一的区域类是 CLCircularRegion 显然是圆形 和 CLBeaconRegion 基于与 iBeacon 的接近度 未来苹果可能会添加对自定义形
  • 如何在从另一个活动调用一个活动时延迟一些?

    我有一个应用程序 其中我正在接收包含他的位置的短信 收到短信后 它会调用另一个活动来启动并将该位置传递给该活动以将其绘制在地图上 在调用第二个活动之前 它会显示一个类似于通知的吐司在屏幕上 但由于调用第二个活动 吐司没有出现 我的问题是我们
  • Android:CellID 不适用于所有运营商?

    当我请求 Cell ID 和 LAC 信息时 在某些设备上我无法检索它们 我使用这段代码 TelephonyManager tm TelephonyManager getSystemService Context TELEPHONY SER
  • 当前位置 GoogleMap 失败

    我想检查 GPS 是否打开 是否应该显示当前位置 如果没有 它应该要求将其打开 如果用户点击取消或不转动坐标将被设置为基本坐标 不幸的是总是选择基本款 即使 GPS 已关闭 我没有收到打开 GPS 的消息 Override public v
  • GPSTracker 类不工作

    我尝试在我的应用程序中使用我在网上找到的 GPSTracker 类 并且我之前让它工作过 但现在似乎莫名其妙地不起作用 public class GPSTracker extends Service implements LocationL

随机推荐

  • C语言:函数返回字符串的四种方法

    转载连接 xff1a 1 https blog csdn net turkeyzhou article details 6104135 comments 2 https www cnblogs com qingergege p 649668
  • C语言:字符串中查找指定字符——strchr()和strrchr()

    参考文章连接 xff1a 1 http c biancheng net cpp html 161 html 2 http c biancheng net cpp html 172 html 1 头文件 xff1a include lt st
  • C语言:整型、浮点型和字符串间转换

    参考文章链接 xff1a 1 http c biancheng net cpp html 1573 html 2 http c biancheng net cpp html 1574 html 1 整型 浮点型 gt 字符串 整数转换为字符
  • 学习贵在坚持!

    最近学习颇为不顺 xff0c 周围都是一些不利的消息 xff0c 有些心灰意冷 可是这不是与我写本文的初衷相悖了么 xff1f 看到了比自己优秀的人干出来辉煌的事情 xff0c 写出来文字优美的文章 xff0c 自己就有相形见绌的自卑感 可
  • Qt中 QString 和int, char等的“相互”转换

    原文链接 xff1a https blog csdn net ei nino article details 7297791 Qt中 int float double转换为QString 有两种方法 1 使用QString number 如
  • 计算器第二版:C语言,VC++6.0

    使用栈实现 xff0c 前缀表达式变后缀表达式的原理 xff0c 但是没有转换 xff0c 是边转换边实现 xff1a include lt stdio h gt include lt stdlib h gt include lt coni
  • 计算器第三版:C语言,递归,VC++6.0

    参考文章 xff1a https blog csdn net u011692041 article details 49796343 https blog csdn net u011692041 article details 497991
  • 计算器第四版:C++,QT

    核心算法和第二版一样 xff1a 头文件 xff1a calculate h ifndef CALCULATE H define CALCULATE H include lt QMainWindow gt include lt QPushB
  • USB协议概念学习

    1 USB总线结构 usb的总线拓扑结构如下所示 xff1a 从USB总线结构可以看出 xff0c 主要由3部分组成 xff1a USB主机 Host USB线缆 USB设备 hub Func等 USB主机 xff1a 一般成为USB Ho
  • 创新工场两道笔试题0919

    题目1 字符串去重 xff0c 老题目 xff0c 只是要求不能开辟新空间用来复制原字符串 思路 xff1a 使用布尔型的简单hash表可以节省空间 xff0c 用来存储字符是否出现的信息 xff0c 刚开始hash表里面都是false x
  • ROS仿真机器人学习笔记二:创建4轮小车模型及相关xraco文件修改

    系列文章目录 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 例如 xff1a 第一章 Python 机器学习入门之pandas的使用 提示 xff1a 写完文章后 xff0c 目录可以自动生成 x
  • 旧电脑升级Windows11时检查CPU和TPM2.0不满足的解决方案(慎重)

    上个月微软发布了Windows11 22H2正式版 xff0c 不少新电脑也接收到了推送 xff0c 楼主的台式 xff08 i3 8100 军规星H310M xff09 也接收到了推送 xff0c 但是碍于Win11蛋疼的右键和状态栏消息
  • windows下安装docker

    windows下安装docker 0 前置条件 环境说明 xff1a windows11 家庭中文版 开启Hyper V xff08 可以百度如何开启 xff09 如何添加Hyper V 创建hyper txt xff0c 复制如下内容 x
  • STM32CubeMX配置生成FreeRTOS项目

    文章目录 1 安装STM32CubeMX软件1 1 下载安装1 2 安装要用到的芯片软件包 2 配置FreeRTOS项目2 1 创建工程2 2 配置SYS2 3 配置RCC2 4 配置系统运行时钟2 5 配置UART1串口作为调试代码2 6
  • ScrumMaster的教练职责

    ScrumMaster是Scrum团队的敏捷教练 Ken Rubin说 xff0c 类似于运动团队的教练 xff0c ScrumMaster观察团队使用Scrum的过程 xff0c 帮助团队提高工作绩效 教练不是顾问 xff0c 不提供解决
  • Autoware.Auto avp仿真详解

    1 定位 定位节点启动的是 ndt localizer 61 Node package 61 39 ndt nodes 39 executable 61 39 p2d ndt localizer exe 39 namespace 61 39
  • VMware + ubuntu16.04 + ROS kinetic 下配置realsense D435i 遇到的问题

    在配置Realsense D435i 的过程中 xff0c 遇到一个问题 执行 scripts patcg realsebse ubuntu lts sh 下载速度奇慢 10K s左右 而且会在接受到36 的时候不动了 xff0c 等了一晚
  • 白话tensorflow分布式部署和开发

    关于tensorflow的分布式训练和部署 xff0c 官方有个英文的文档介绍 xff0c 但是写的比较简单 xff0c 给的例子也比较简单 xff0c 刚接触分布式深度学习的可能不太容易理解 在网上看到一些资料 xff0c 总感觉说的不够
  • 全息投影技术

    1 概念 全息投影技术 xff08 front projectedholographic display xff09 也称 虚拟成像 技术是利用干涉和衍射原理记录并再现物体真实的 三维 图像的技术 全息投影技术不仅可以产生立体的空中幻像 x
  • Ardupilot飞控添加使用诺瓦泰GPS

    Ardupilot飞控添加使用诺瓦泰双天线GPS航向角的设置 一 添加诺瓦泰GPS heading角数据包解析代码 1 打开libraries AP GPS AP GPS NOVA h xff0c 添加如下代码 xff1a struct P