QGC校准部分

2023-05-16

QGC校准:

主要是点击校准开始时发送校准的指令,校准的逻辑时飞控里实现,根据飞控回传的校准数据显示校准的步骤

开始校准

SensorsComponentController.cpp中调用_startLogCalibration()函数

void SensorsComponentController::calibrateGyro(void)
{
    _startLogCalibration();
    _vehicle->startCalibration(Vehicle::CalibrationGyro);
}

void SensorsComponentController::calibrateCompass(void)
{
    _startLogCalibration();
    _vehicle->startCalibration(Vehicle::CalibrationMag);
}

void SensorsComponentController::calibrateAccel(void)
{
    _startLogCalibration();
    _vehicle->startCalibration(Vehicle::CalibrationAccel);
}

void SensorsComponentController::calibrateLevel(void)
{
    _startLogCalibration();
    _vehicle->startCalibration(Vehicle::CalibrationLevel);
}

void SensorsComponentController::calibrateAirspeed(void)
{
    _startLogCalibration();
    _vehicle->startCalibration(Vehicle::CalibrationPX4Airspeed);
}

startCalibration(Vehicle::CalibrationType calType)

Vehicle.cc 中:

void Vehicle::startCalibration(Vehicle::CalibrationType calType)
{
    SharedLinkInterfacePtr sharedLink = vehicleLinkManager()->primaryLink().lock();
if (!sharedLink) {
        qCDebug(VehicleLog) << "startCalibration: primary link gone!";
        return;
    }

    float param1 = 0;
    float param2 = 0;
    float param3 = 0;
    float param4 = 0;
    float param5 = 0;
    float param6 = 0;
    float param7 = 0;

    switch (calType) {
    case CalibrationGyro:
        param1 = 1;
        break;
    case CalibrationMag:
        param2 = 1;
        break;
    case CalibrationRadio:
        param4 = 1;
        break;
    case CalibrationCopyTrims:
        param4 = 2;
        break;
    case CalibrationAccel:
        param5 = 1;
        break;
    case CalibrationLevel:
        param5 = 2;
        break;
    case CalibrationEsc:
        param7 = 1;
        break;
    case CalibrationPX4Airspeed:
        param6 = 1;
        break;
    case CalibrationPX4Pressure:
        param3 = 1;
        break;
    case CalibrationAPMCompassMot:
        param6 = 1;
        break;
    case CalibrationAPMPressureAirspeed:
        param3 = 1;
        break;
    case CalibrationAPMPreFlight:
        param3 = 1; // GroundPressure/Airspeed
        if (multiRotor() || rover()) {
            // Gyro cal for ArduCopter only
            param1 = 1;
        }
    }

    // We can't use sendMavCommand here since we have no idea how long it will be before the command returns a result. This in turn
// causes the retry logic to break down.
//  我们不能在这里使用sendMavCommand,因为我们不知道在命令返回结果之前需要多长时间。这反过来
// 导致重试逻辑崩溃
    mavlink_message_t msg;
mavlink_msg_command_long_pack_chan
(
_mavlink->getSystemId(),
_mavlink->getComponentId(),
sharedLink->mavlinkChannel(),
&msg,
 id(),
    defaultComponentId(),            // target component
    MAV_CMD_PREFLIGHT_CALIBRATION,    // command id
                                       
0,         // 0=first transmission of command 0=第一次发送命令
  param1, param2, param3, param4, param5, param6, param7
);
    sendMessageOnLinkThreadSafe(sharedLink.get(), msg);
}

mavlink_message_t  结构体

就是一个mavlink帧格式?

typedef struct __mavlink_message {
	uint16_t checksum;(检验和)   ///< sent at end of packet在包的末端发送
	uint8_t magic;          ///< protocol magic marker
	uint8_t len;         ///< Length of payload有效载荷长度
	uint8_t incompat_flags; ///< flags that must be understood
	uint8_t compat_flags;   ///< flags that can be ignored if not understood
	uint8_t seq;            ///< Sequence of packet
	uint8_t sysid;          ///< ID of message sender system/aircraft
	uint8_t compid;         ///< ID of the message sender component
	uint32_t msgid:24;      ///< ID of message in payload
	uint64_t payload64[(MAVLINK_MAX_PAYLOAD_LEN+MAVLINK_NUM_CHECKSUM_BYTES+7)/8];
	uint8_t ck[2];          ///< incoming checksum bytes
	uint8_t signature[MAVLINK_SIGNATURE_BLOCK_LEN];
}) mavlink_message_t;

 

Mavlink_msg_command_long_pack_chan

Mavlink_msg_command_long.h 中的   Mavlink_msg_command_long_pack_chan

/**
 * @brief Pack a command_long message on a channel 
//  在通道上打包command_long消息
 * @param system_id ID of this system 
//  system_id系统ID
 * @param component_id ID of this component (e.g. 200 for IMU) 
// component_id该组件的ID(例如200为IMU)
 * @param chan The MAVLink channel this message will be sent over 
// chan将发送此消息的MAVLink通道
 * @param msg The MAVLink message to compress the data into 
// msg用于压缩数据的MAVLink消息
 * @param target_system  System which should execute the command //target_system应该执行该命令的系统
 * @param target_component  Component which should execute the command, 0 for all components 
// target_component应该执行该命令的组件,0表示所有组件
 * @param command  Command ID (of command to send). 
// command命令ID(发送命令)
 * @param confirmation  0: First transmission of this command. 1-255: Confirmation transmissions (e.g. for kill command) 
// confirmation 0:第一次传输此命令。1-255:确认传输
 * @param param1  Parameter 1 (for the specific command).
 * @param param2  Parameter 2 (for the specific command).
 * @param param3  Parameter 3 (for the specific command).
 * @param param4  Parameter 4 (for the specific command).
 * @param param5  Parameter 5 (for the specific command).
 * @param param6  Parameter 6 (for the specific command).
 * @param param7  Parameter 7 (for the specific command).
 * @return length of the message in bytes (excluding serial stream start sign) 
// return 消息的字节长度(不包括串行流开始符号)
 */
static inline uint16_t mavlink_msg_command_long_pack_chan(uint8_t system_id, uint8_t component_id, uint8_t chan,
                               mavlink_message_t* msg,
                                   uint8_t target_system,uint8_t target_component,uint16_t command,uint8_t confirmation,float param1,float param2,float param3,float param4,float param5,float param6,float param7)
{
#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
    char buf[MAVLINK_MSG_ID_COMMAND_LONG_LEN];
    _mav_put_float(buf, 0, param1);
    _mav_put_float(buf, 4, param2);
    _mav_put_float(buf, 8, param3);
    _mav_put_float(buf, 12, param4);
    _mav_put_float(buf, 16, param5);
    _mav_put_float(buf, 20, param6);
    _mav_put_float(buf, 24, param7);
    _mav_put_uint16_t(buf, 28, command);
    _mav_put_uint8_t(buf, 30, target_system);
    _mav_put_uint8_t(buf, 31, target_component);
    _mav_put_uint8_t(buf, 32, confirmation);

        memcpy(_MAV_PAYLOAD_NON_CONST(msg), buf, MAVLINK_MSG_ID_COMMAND_LONG_LEN);
#else
    mavlink_command_long_t packet;
    packet.param1 = param1;
    packet.param2 = param2;
    packet.param3 = param3;
    packet.param4 = param4;
    packet.param5 = param5;
    packet.param6 = param6;
    packet.param7 = param7;
    packet.command = command;
    packet.target_system = target_system;
    packet.target_component = target_component;
    packet.confirmation = confirmation;

        memcpy(_MAV_PAYLOAD_NON_CONST(msg), &packet, MAVLINK_MSG_ID_COMMAND_LONG_LEN);
#endif

    msg->msgid = MAVLINK_MSG_ID_COMMAND_LONG;
    return mavlink_finalize_message_chan(msg, system_id, component_id, chan, MAVLINK_MSG_ID_COMMAND_LONG_MIN_LEN, MAVLINK_MSG_ID_COMMAND_LONG_LEN, MAVLINK_MSG_ID_COMMAND_LONG_CRC);
}

sendMessageOnlinkThreadSafe

// 在链路安全中发送信息

startCalibration 函数中sendMessageOnlinkThreadSafe 传入

//sendMessageOnLinkThreadSafe(sharedLink.get(), msg);

SendMessageOnlinkThreadSafe(接口,消息包)

bool Vehicle::sendMessageOnLinkThreadSafe(LinkInterface* link, mavlink_message_t message)
{
    if (!link->isConnected()) {
        qCDebug(VehicleLog) << "sendMessageOnLinkThreadSafe" << link << "not connected!";
        return false;
    }

// Give the plugin a chance to adjust
//给插件一个调整的机会
    _firmwarePlugin->adjustOutgoingMavlinkMessageThreadSafe(this, link, &message);

// Write message into buffer, prepending start sign
// 将消息写入缓冲区,预挂起开始号
    uint8_t buffer[MAVLINK_MAX_PACKET_LEN];
    int len = mavlink_msg_to_send_buffer(buffer, &message);

    link->writeBytesThreadSafe((const char*)buffer, len);
    _messagesSent++;
    emit messagesSentChanged();

    return true;
}

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

QGC校准部分 的相关文章

  • 笔记:QGC使用及姿态环仿真调节方式

    笔记 xff1a QGC使用及姿态环仿真调节方式 打开Gazebo及QGC 进入终端管理员权限 sudo s 在终端打开Gazebo cd Firmware make px4 sitl default gazebo 点击文件夹中的QGC x
  • QGC 汉化

    效果如下 一 xff0c pro文件修改 不添加 lupdate xff0c qml文件中的 qstr 无法识别 二 xff0c 生成 ts 文件 三 xff0c 利用 Qt 自带的 linguist软件 加载ts文件 翻译后 生成 qm
  • QGC android版 ubuntu编译

    一 xff0c 环境搭建 参照 xff1a https blog csdn net foxbryant article details 51813685 1 软件安装 Ubuntu 版本 xff1a 14 04 Qt xff1a 5 7 1
  • qgc通过mavros连接到Pixhawk飞控

    qgc通过mavros连接到Pixhawk飞控 mavros设置QGC设置 mavros确实是一个不错的工具 xff0c 在机载电脑上进行无人机开发的时候 xff0c 有时候想调飞控的参数看一下飞控的一些信息 xff0c 但是直接接飞控又不
  • QGC-TX2-PX4

    span class token number 1 span 安装mavros sudo apt install ros span class token operator span melodic span class token ope
  • ubuntu16.04下,ROS+PX4+QGC安装

    ubuntu16 04下 xff0c ROS 43 PX4 43 QGC安装 ROS安装 xff1a 第一步 xff1a ROS安装前准备工作 1 在Ubuntu系统上 xff0c 确认git已经安装 span class token fu
  • 一、QGC源码下载以及配置

    QGC V3 4版本 源码存放地址 https github com mavlink qgroundcontrol 下载方式 xff1a 1 git xff1a git clone https github com mavlink qgro
  • Ubuntu20.04下使用Qt5.15.2编译qgc源码

    下载QGC源码 可以在QGC官网按照教程根据自己的需求来下载源码QGC git clone recursive j8 https github com mavlink qgroundcontrol git git submodule upd
  • QGC添加自定义组件和发送自定义MAVLINK消息

    QGC添加自定义组件和发送自定义MAVLINK消息 一 添加自定义组件1 1 在飞行界面添加组件1 2 实现组件事件1 3 在MOCK模拟链接中实现验证1 4 验证 二 自定义MAVLINK消息的一些预备知识三 QGC自定义MAVLINK消
  • WIN10源码编译安装QGC-V3.4

    目录 写在前面 环境 安装VS2015 xff08 采用的是社区版 xff09 安装Git xff08 见GIT安装教程 xff09 并克隆QGC源码 安装Qt xff0c 并用Qt进行编译 运行 安装注意事项 写在前面 最近想起来之前有过
  • QGC Windows下编译环境搭建-------Qt5.7 + VS2015

    源码下载 打开qgc的github网址 xff0c 并选择最新的稳定版v3 4 https github com mavlink qgroundcontrol tree Stable V3 4 下载git xff0c 在电脑中进入希望下载的
  • 整理px4飞控校准机制和qgc校准机制

    用qgc执行 px4飞控传感器校准时 的步骤确实很麻烦 xff0c 磁罗盘需要转6个面 xff0c 加速度计也需要6个面 大疆无人机的校准很简单 xff0c 加速度计需要静置一会 xff0c 磁罗盘校准也就转一个面就行了 xff0c 就算学
  • ubuntu18.04下QGC安装

    QGC安装 xff08 新手操作 xff09 参考官网教程即可 官网链接 link 先把命令行的代码贴过来 xff0c 方便大家复制粘贴 第 span class token number 1 span 步的 sudo usermod sp
  • 笔记:QGC使用及姿态环仿真调节方式

    笔记 xff1a QGC使用及姿态环仿真调节方式 打开Gazebo及QGC 进入终端管理员权限 sudo s 在终端打开Gazebo cd Firmware make px4 sitl default gazebo 点击文件夹中的QGC x
  • PX4串口添加传感器—在QGC上添加串口数据显示

    前言 因为项目要求 xff0c xff08 在PX4上添加拉力传感器 xff0c 并把数据显示在QGC的地图上 xff09 xff0c 本人开始了苦皮的生活 从未接触飞控的我 xff0c 一来就是开发 烧脑掉发啊 但人生是无所畏惧的 在学习
  • QGC接收PX4自定义Mavlink消息(二)qgc接收

    这里补充一些 xff0c 我的px4版本是1 11 0dev xff0c 在ubuntu18 04上开发 xff0c qgc为目前官网最新的版本 xff0c 在windows上上开发 xff0c 大家的源码会因为版本差异而有少许区别 xff
  • PX4+QGC+jmavsim软件在环仿真

    一 环境修改 参考官方手册jMAVSim 仿真模拟 PX4 Developer Guide xff0c 以上环境基于上一篇内容 xff0c 未完成ROS 43 jmavsim 43 QGC环境搭建的请移步Ubuntu18 04下px4 43
  • QGC开发 显示双GPS/RTK信息以及自定义页面(ubuntu)

    一 QGC开发 显示双GPS RTK信息 1 在sitl中进行仿真 xff0c 虚拟出第二个GPS mavlink发送到地面站 如下图中 xff0c 在mavlink msg gps2 raw h中找到发送第二组gps rtk数据函数mav
  • QGC 报错 Fail: No CPU load information

    据说是因为bootloader与px4固件版本不匹配 xff0c 需要修改qgc中的参数 xff1a 使其能够在安装固件的时候更新到匹配版本的bootloader 步骤一 xff1a 修改 SDLOG PROFILE 参数从 default
  • 通过QGC应用TFmini Plus

    TFmini QGC中所需设置参数 xff1a EKF2 RNG AID enable EKF2 RNG MODE Range sensor SENS TFMINI CFG TELEM SERIAL 4 最后一个参数如何确定是哪一通道 xf

随机推荐

  • 树莓派ROS stm32 slam Freertos VFH+A*避障路径规划-智能平衡计划(六)

    基于树莓派ROSstm32搭载Freertos智能平衡车Day6 前言一 巡线功能TSL1401 线性CCD介绍TSL1401 管脚功能TSL1401 功能描述TSL1401 像素输出TSL1401 像素采集TSL1401 线性CCD 电气
  • PX4无法进入offboard模式

    固件版本为v1 11 1 遥控器切入offboard模式时 xff0c QGC提示reject 找了一两天 xff0c 发现是因为GPS没起作用 打开QGC的mavlink消息检测 xff0c 发现有GPS RAW INT消息 xff0c
  • 树莓派+Ubuntu mate18.04+ROS+二进制MAVROS安装

    主要参考ubuntu mate 18 04官网下载 xff0c 烧录及安装 SSH VNC ROS MAVROS librealsense realsense ros vision to mavros 略过在树莓派上安装Ubuntu mat
  • C++组成部分

    C 43 43 是一种编程语言 xff0c 但又不是一种单一的编程语言 xff0c 它可以包含以下四种子语言 xff0c 也即C 43 43 的四个组成部分 xff1a 1 C部分 C语言的基本语法 xff0c 内置类型 预处理 数组 指针
  • install_geographiclib_datasets.sh

    span class token shebang important bin bash span span class token comment Script to install the model datasets required
  • PX4开发环境搭建-Ubuntu+Qt+PX4

    前言 由于各种原因 xff0c 国内安装PX4较为缓慢且不稳定 xff0c 本文主要是作为测试如何国内能够更快下载并搭建好PX4环境 一 预备工具 笔记本 xff1b Vmware VirtualBox Ubuntu 18 04 较为稳定且
  • 【ZED】从零开始使用ZED相机(四):双目相机标定(MATLAB+张氏标定法)

    引言 ZED 从零开始使用ZED相机导航 xff1a ZED 从零开始使用ZED相机 xff08 一 xff09 xff1a windows下的安装配置与测试 ZED 从零开始使用ZED相机 xff08 二 xff09 xff1a 打开相机
  • 路径规划(一):使用Matlab快速绘制栅格地图

    目录 一 Matlab快速绘制栅格地图1 几种常用的地图形式 xff1a 1 1 尺度地图 xff1a 1 2 拓扑地图 xff1a 1 3 语义地图 xff1a 2 栅格地图用于路径规划的优势 xff1a 3 matlab绘制栅格地图的核
  • J-link 报错解决方法

    目录 1 Jlink 驱动版本过高 导致识别到 Jlink 工具为盗版2 JLink 芯片锁死 1 Jlink 驱动版本过高 导致识别到 Jlink 工具为盗版 报错 xff1a The connected probe appears to
  • Gazebo物理仿真环境搭建——roscontrol

    Gazebo物理仿真环境搭建 ros control 提示 xff1a 写完文章后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 Gazebo物理仿真环境搭建 ros control前言一 ros con
  • 野火挑战者V2开发板CubeMX+LWIP+FreeRTOS+TCP_Server+TCP_Client实现

    首先说一下开发环境 xff1a MDK5版本为5 26 2 0 xff0c CubeMX版本为6 6 1 xff0c FreeRTOS API选择的是 CMSIS v1 xff0c LWIP版本为2 1 2 单片机型号为STM32F429I
  • 2021-06-18

    AttributeError module torch functional has no attribute relu AttributeError module torch functional has no attribute rel
  • 机器学习入门2 分类算法(knn,朴素贝叶斯,决策树,随机森林)

    分类算法 目标值 xff1a 类别 1 sklearn转换器和预估器 2 KNN算法 3 模型选择与调优 4 朴素贝叶斯算法 5 决策树 6 随机森林 3 1 sklearn转换器和估计器 转换器 估计器 estimator 3 1 1 转
  • ROS环境搭建过程

    怕自己忘记怎么搭的虚拟环境于是写下此博客进行记录 文章目录 前言过程1 准备工作2 开始建立 总结 前言 学习PPPoE协议和DHCP协议时进行一些用例抓包需要用到ROS虚拟环境 xff0c 于是第一次摸索 xff0c 在朋友帮助下完成得还
  • 美图秀秀扣取签字,证件照换背景

    扣取签字 需求 xff1a 手机拍一个照片提取签字到 png 方法 xff1a 美图秀秀进行图片增强 gt 然后用python提取 原图 美图秀秀打开 gt 增强 前三个都要弄 xff0c 这样就是白色背景 xff0c 其余的根据情况调节
  • 进程及进程间的切换(操作系统)

    进程 1 认识进程 xff1a 对于操作系统来说 xff0c 一个任务就是一个进程 xff0c 本质上是正在执行的一个程序 我们可以通过查看 windows任务管理器 中的列表 xff0c 我们可以完全认为在内存中的每一个exe文件理解为进
  • 通过Gazebo建立简单室内环境模型并用launch文件打开

    本文叙述如何直接使用Gazebo创建简单室内环境模型 xff0c 并能够使用launch文件打开 一 利用Gazebo建立好环境模型 1 打开Gazabo的编辑界面 运行如下命令后按Ctrl 43 B xff0c 进入到编辑界面 gazeb
  • 使用ORB-SLAM2算法和Turtlebot3机器人在自己构建的室内场景中建图

    本文叙述了在gazebo仿真环境和rqt可视化工具的背景下 xff0c 使用ORB SLAM2算法和turtlebot3 burger机器人在自己构建的室内场景中建图过程 目前存在的问题是运行RGBD节点时无法显示图像 xff0c 报错 W
  • 关于运行rqt_image_view命令后不显示相机图像信息的问题的解决方法

    本文叙述了在gazebo中添加完kinect V1相机 xff0c 开启机器人和场景后 xff0c 运行rqt image view命令不显示相机图像信息 xff0c 并且查询不到相关相机话题的问题的解决方法 1 问题描述 在gazebo中
  • QGC校准部分

    QGC校准 xff1a 主要是点击校准开始时发送校准的指令 xff0c 校准的逻辑时飞控里实现 xff0c 根据飞控回传的校准数据显示校准的步骤 开始校准 SensorsComponentController cpp中调用 startLog