QGC添加自定义组件和发送自定义MAVLINK消息

2023-05-16

QGC添加自定义组件和发送自定义MAVLINK消息

  • 一、添加自定义组件
    • 1.1 在飞行界面添加组件
    • 1.2 实现组件事件
    • 1.3 在MOCK模拟链接中实现验证
    • 1.4 验证
  • 二、自定义MAVLINK消息的一些预备知识
  • 三、QGC自定义MAVLINK消息
    • 3.1 生成新的MAVLINK消息头文件
    • 3.2 QGC源码内添加内容
    • 3.3 QGC源码内实现消息发送和接收
    • 3.4 Mock内部模拟消息处理


本文实现版本: QGC:Stable_V4.0; QT:5.12.6。下载和安装方式这边就不再赘述。下文仅作自身学习记录用途,侵删。

一、添加自定义组件

1.1 在飞行界面添加组件

在QGC开发者文档中说明飞行视图的界面实现在FlightDisplayView.qml文件中

在这里插入图片描述
在FlightDisplayView.qml文件中添加如下,可以在ToolStrip下面添加

            Rectangle{
                anchors.left:       toolStrip.left              // 左侧对齐
                anchors.top:        toolStrip.bottom            // 顶部位于toolStrip控件底部
                anchors.topMargin:  _margins * 10               // 设置间隙
                width:              150                         // 长和高设置
                height:             30
                color:              "black"                     // 底色设置
                radius:             8                           // 矩形圆角半径
                visible:            true                        // 设置为可见
                z:                  _panel.z + 4                // 设置层级
                // 填充文本
                Text {
                    anchors.fill:   parent
                    text:           qsTr("Request all Parameter")
                    color:          "white"
                }
                // 设置鼠标点击事件
                MouseArea{
                    anchors.fill:   parent
                    onClicked: {
                        console.log("Request all Parameter is clicked!")                // 在控制台打印log
                        // 在单例QGroundControl的MultiVehicleManager对象下有一个当前正处于活动状态的activeVehicle,调用该方法
                        QGroundControl.multiVehicleManager.activeVehicle.requestAllParameters()
                    }
                }
            }

节选自开发者文档

在这里插入图片描述

1.2 实现组件事件

在Vehicle.h中添加 requestAllParameters()函数实现。如果需要能够在qml中实现访问的话,就需要在函数声明之前加上Q_INVOKABLE。

Q_INVOKABLE void requestAllParameters(void);

然后在Vehicle.cc中对这个函数进行实现

void Vehicle::requestAllParameters()
{
    mavlink_message_t msg;        // 定义mavlink消息
    mavlink_msg_param_request_list_pack_chan(       // 在chan通道上打包消息
                _mavlink->getSystemId(),            // 本机系统id
                _mavlink->getComponentId(),         // 本机组件id
                priorityLink()->mavlinkChannel(),   // 选择通道
                &msg, _id, MAV_COMP_ID_ALL);        // 对应的消息,所要发送的消息的目标系统id,目标组件id
    sendMessageOnLink(priorityLink(), msg);         // 发送消息
    qDebug() << "============= sned Vehicle::requestAllParameters ============ " << _id << MAV_COMP_ID_ALL;
}

mavlink_msg_param_request_list_pack_chan()函数解释如下:

/**
 * @brief Pack a param_request_list message on a channel
 * @param system_id ID of this system
 * @param component_id ID of this component (e.g. 200 for IMU)
 * @param chan The MAVLink channel this message will be sent over
 * @param msg The MAVLink message to compress the data into
 * @param target_system  System ID
 * @param target_component  Component ID
 * @return length of the message in bytes (excluding serial stream start sign)
 */
static inline uint16_t mavlink_msg_param_request_list_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)
{
#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
    char buf[MAVLINK_MSG_ID_PARAM_REQUEST_LIST_LEN];
    _mav_put_uint8_t(buf, 0, target_system);
    _mav_put_uint8_t(buf, 1, target_component);

        memcpy(_MAV_PAYLOAD_NON_CONST(msg), buf, MAVLINK_MSG_ID_PARAM_REQUEST_LIST_LEN);
#else
    mavlink_param_request_list_t packet;
    packet.target_system = target_system;
    packet.target_component = target_component;

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

    msg->msgid = MAVLINK_MSG_ID_PARAM_REQUEST_LIST;
    return mavlink_finalize_message_chan(msg, system_id, component_id, chan, MAVLINK_MSG_ID_PARAM_REQUEST_LIST_MIN_LEN, MAVLINK_MSG_ID_PARAM_REQUEST_LIST_LEN, MAVLINK_MSG_ID_PARAM_REQUEST_LIST_CRC);
}

1.3 在MOCK模拟链接中实现验证

在MockLink.cc文件中,找到

void MockLink::_handleParamRequestList(const mavlink_message_t& msg)

并在其中添加代码段

    qDebug() << "message with param request list is received, and message id: " << msg.msgid
             << " target system: " << request.target_system << "target_component: " << request.target_component;

如下所示

void MockLink::_handleParamRequestList(const mavlink_message_t& msg)
{
    if (_failureMode == MockConfiguration::FailParamNoReponseToRequestList) {
        return;
    }

    mavlink_param_request_list_t request;

    mavlink_msg_param_request_list_decode(&msg, &request);
    qDebug() << "message with param request list is received, and message id: " << msg.msgid
             << " target system: " << request.target_system << "target_component: " << request.target_component;

    Q_ASSERT(request.target_system == _vehicleSystemId);
    Q_ASSERT(request.target_component == MAV_COMP_ID_ALL);

    // Start the worker routine
    _currentParamRequestListComponentIndex = 0;
    _currentParamRequestListParamIndex = 0;
}

保存并且编译

1.4 验证

如下为正常显示结果
在这里插入图片描述
按下面步骤操作
在这里插入图片描述
QT控制台显示结果如下:系统ID=128,组件ID=0,消息ID=21

在这里插入图片描述

二、自定义MAVLINK消息的一些预备知识

在这里插入图片描述
关于mavlink消息的解释,网上已经有很多了,这里也就不再多说,推荐还是去官网仔细阅读一下。

其消息包封装过程如下(图片来源:MAVLink协议通信分析——(二)消息结构):

在这里插入图片描述
由用户自定义MSG和PAYLOAD内容,其余部分则由MAVLINK自动添加封装成包。

在QGC中,自定义MAVLINK消息实现在如下路径

/home/你的用户名/qgroundcontrol/libs/mavlink/include/mavlink/v2.0/message_definitions

关于这个文件夹下各个文件的具体作用,建议查看这边:Dialects

这边主要来看一下common.xml文件内容,该文件主要实现的是关于MAVLINK各种消息结构的定义实现。我们以0号消息HEARTBEAT为例。在官网中,HEARTBEAT内部结构定义如下:

在这里插入图片描述对应的common.xml中对其结构进行了具体的定义:

    <message id="0" name="HEARTBEAT">
      <description>The heartbeat message shows that a system or component is present and responding. The type and autopilot fields (along with the message component id), allow the receiving system to treat further messages from this system appropriately (e.g. by laying out the user interface based on the autopilot). This microservice is documented at https://mavlink.io/en/services/heartbeat.html</description>
      <field type="uint8_t" name="type" enum="MAV_TYPE">Vehicle or component type. For a flight controller component the vehicle type (quadrotor, helicopter, etc.). For other components the component type (e.g. camera, gimbal, etc.). This should be used in preference to component id for identifying the component type.</field>
      <field type="uint8_t" name="autopilot" enum="MAV_AUTOPILOT">Autopilot type / class. Use MAV_AUTOPILOT_INVALID for components that are not flight controllers.</field>
      <field type="uint8_t" name="base_mode" enum="MAV_MODE_FLAG" display="bitmask">System mode bitmap.</field>
      <field type="uint32_t" name="custom_mode">A bitfield for use for autopilot-specific flags</field>
      <field type="uint8_t" name="system_status" enum="MAV_STATE">System status flag.</field>
      <field type="uint8_t_mavlink_version" name="mavlink_version">MAVLink version, not writable by user, gets added by protocol because of magic data type: uint8_t_mavlink_version</field>
    </message>

可以看出与官网给出的结构一致。

MAVLINK消息通过mavgenerate生成具体的消息头文件,该头文件在QGC中会保存在下面这个路径

/home/你的用户名/qgroundcontrol/libs/mavlink/include/mavlink/v2.0/common

内部文件主要以mavlink_msg_xxx.h形式命名,找到对应的mavlink_msg_heartbeat.h。内部实现了关于HEARTBEAT这个消息的结构体以及消息长度等定义。CRC校验码是随机生成的,可以不必细究。

#define MAVLINK_MSG_ID_HEARTBEAT 0

MAVPACKED(
typedef struct __mavlink_heartbeat_t {
 uint32_t custom_mode; /*<  A bitfield for use for autopilot-specific flags*/
 uint8_t type; /*<  Vehicle or component type. For a flight controller component the vehicle type (quadrotor, helicopter, etc.). For other components the component type (e.g. camera, gimbal, etc.). This should be used in preference to component id for identifying the component type.*/
 uint8_t autopilot; /*<  Autopilot type / class. Use MAV_AUTOPILOT_INVALID for components that are not flight controllers.*/
 uint8_t base_mode; /*<  System mode bitmap.*/
 uint8_t system_status; /*<  System status flag.*/
 uint8_t mavlink_version; /*<  MAVLink version, not writable by user, gets added by protocol because of magic data type: uint8_t_mavlink_version*/
}) mavlink_heartbeat_t;

#define MAVLINK_MSG_ID_HEARTBEAT_LEN 9
#define MAVLINK_MSG_ID_HEARTBEAT_MIN_LEN 9
#define MAVLINK_MSG_ID_0_LEN 9
#define MAVLINK_MSG_ID_0_MIN_LEN 9

#define MAVLINK_MSG_ID_HEARTBEAT_CRC 50
#define MAVLINK_MSG_ID_0_CRC 50

除此之外,其内部定义了一些用于消息打包或者解析的函数:

mavlink_msg_heartbeat_pack();		// Pack a heartbeat message
mavlink_msg_heartbeat_pack_chan();	// Pack a heartbeat message on a channel
mavlink_msg_heartbeat_encode();		// Encode a heartbeat struct
mavlink_msg_heartbeat_encode_chan();	// Encode a heartbeat struct on a channel
mavlink_msg_heartbeat_send();		// Send a heartbeat message
mavlink_msg_heartbeat_send_struct();	// Send a heartbeat message
...

事实上,在每个mavlink_msg_xxx.h的mavlink消息定义中,都实现了以下一些函数(其中xxx为对应的消息名称,如heartbeat、local_position_ned_system_global_offset等等)

mavlink_msg_xxx_pack()				// 打包消息
mavlink_msg_xxx_pack_chan()			// 在通道上打包消息(较常用)
mavlink_msg_xxx_encode();			// 对消息进行编码
mavlink_msg_xxx_encode_chan();		// 在通道上对消息进行编码
mavlink_msg_xxx_send();				// 发送消息
mavlink_msg_xxx_send_struct();		// 发送消息
...

也就是说,在你用mavgenerate自动生成你定义好的消息时,相关的结构体定义以及对应的操作函数它也帮你实现好了,是不是很方便呢?

关于mavgenerate的下载和使用,请看这边:
源码下载地址
Generating MAVLink Libraries

了解完这些之后,我们就可以开始在QGC中自定义MAVLINK消息了。

三、QGC自定义MAVLINK消息

3.1 生成新的MAVLINK消息头文件

首先在如下路径文件中添加2条新的消息

/home/你的用户名/qgroundcontrol/libs/mavlink/include/mavlink/v2.0/message_definitions/common.xml

内容如下:

    <message id="12" name="PREFLIGHT_SELFCHECK">
      <description>Ask vechile to do self-check before flight.</description>
      <field type="uint8_t" name="target_system">The system doing self-check</field>
    </message>
    <message id="13" name="PREFLIGHT_SELFCHECK_ACK">
      <description>Vechile self-check ack.</description>
      <field type="uint8_t" name="ack">The result of self-check ack.1:healthy 0:unhealthy</field>
    </message>

然后,使用mavgenerate生成新的消息头文件,在如下路径下(下载的mavlink文件夹内,我是直接放在了home下面)

/home/你的用户名/mavlink

打开新的终端,输入

python3 -m mavgenerate

选择XML路径为:

/home/你的用户名/qgroundcontrol/libs/mavlink/include/mavlink/v2.0/message_definitions/ardupilotmega.xml

再选择输出路径(可以是自己定义的文件夹)

然后选择如下:

在这里插入图片描述
点击生成,成功后终端显示如下

在这里插入图片描述
在OUT选择的路径下的common文件夹中,会自动生成两个文件,分别为:mavlink_msg_preflight_selfcheck.h和mavlink_msg_preflight_selfcheck_ack.h。有兴趣的同学可以打开来看一下里面的内容是否和第2章中所述一致。

我们将这两个文件拷贝进QGC路径下,具体为:

/home/你的用户名/qgroundcontrol/libs/mavlink/include/mavlink/v2.0/common

3.2 QGC源码内添加内容

用QT打开QGC源码文件,利用下方的查找框可以快速查找对应的文件
在这里插入图片描述
首先,我们在common.h文件中,添加头文件(大概是在2000行左右的位置,这段全是头文件包含)

#include "./mavlink_msg_preflight_selfcheck.h"
#include "./mavlink_msg_preflight_selfcheck_ack.h"

然后快速查找到MAVLINK_MESSAGE_INFO定义处,添加内容如下:

MAVLINK_MESSAGE_INFO_PREFLIGHT_SELFCHECK,
MAVLINK_MESSAGE_INFO_PREFLIGHT_SELFCHECK_ACK,

具体位置为

#define MAVLINK_MESSAGE_INFO{
	…
MAVLINK_MESSAGE_INFO_AUTH_KEY,MAVLINK_MESSAGE_INFO_OPERATION,
MAVLINK_MESSAGE_INFO_SET_MODE,
MAVLINK_MESSAGE_INFO_PREFLIGHT_SELFCHECK,
MAVLINK_MESSAGE_INFO_PREFLIGHT_SELFCHECK_ACK,
MAVLINK_MESSAGE_INFO_PARAM_REQUEST_READ,
	...
}

同样的,在MAVLINK_MESSAGE_NAMES中进行添加

{“PREFLIGHT_SELFCHECK”,12},
{“PREFLIGHT_SELFCHECK_ACK”,13}

具体位置为

MAVLINK_MESSAGE_NAMES{{“POWER_STATUS”, 125}, {“PREFLIGHT_SELFCHECK”,12},
{“PREFLIGHT_SELFCHECK_ACK”,13},{“PROTOCOL_VERSION”,300},
	...
}

再找到ardupilotmega.h文件,在内部添加程序如下:

#define MAVLINK_MESSAGE_CRCS{{11, 89, 6, 1, 4, 0},
{12, 219, 1, 1, 0, 0}, {13, 199, 1, 0, 0, 0},	// 这行是添加的内容
{20, 214, 20, 3, 2, 3}
}

3.3 QGC源码内实现消息发送和接收

首先在Vehicle.h中添加两个接口

Q_INVOKABLE void selfCheck(void);
void _handleSelfCheckAck(mavlink_message_t& message);

并在Vehicle.cc文件中添加如下实现:

void Vehicle::selfCheck()
{
    mavlink_message_t msg;
    mavlink_msg_preflight_selfcheck_pack_chan(_mavlink->getSystemId(),
                                                 _mavlink->getComponentId(),
                                                 priorityLink()->mavlinkChannel(),
                                                 &msg, _id);
    sendMessageOnLink(priorityLink(), msg);
    qDebug() << "=== vehivle send preflight_selfcheck message === " << _id;
}

void Vehicle::_handleSelfCheckAck(mavlink_message_t &message)
{
    mavlink_preflight_selfcheck_ack_t ack;
    mavlink_msg_preflight_selfcheck_ack_decode(&message, &ack);
    qDebug() << "=== Vehicle receive selfcheck_ack_t === " << ack.ack;
}

然后同样还是在Vehicle.cc文件中,找到_mavlinkMessageReceived()函数,在其内部的switch-case语句中添加:

    case MAVLINK_MSG_ID_PREFLIGHT_SELFCHECK_ACK:
        _handleSelfCheckAck(message);
        break;

实现对接收到的MAVLINK消息的解析。

3.4 Mock内部模拟消息处理

在MockLink.h文件中添加如下函数声明

void _handleSelfCheck(const mavlink_message_t& msg);

然后在对应的MockLink.cc文件中,添加函数实现

void MockLink::_handleSelfCheck(const mavlink_message_t& msg)
{
    mavlink_preflight_selfcheck_t selfCheck;
    mavlink_msg_preflight_selfcheck_decode(&msg, &selfCheck);
    if (selfCheck.target_system == _vehicleSystemId){
        mavlink_message_t msg;
        mavlink_msg_preflight_selfcheck_ack_pack_chan(_vehicleSystemId,
                                                      _vehicleComponentId,
                                                      _mavlinkChannel,
                                                      &msg, 1);
        respondWithMavlinkMessage(msg);
    }
}

在同一文件内部找到_handleIncomingMavlinkBytes()函数,在内部的switch-case语句中添加如下消息处理

        case MAVLINK_MSG_ID_PREFLIGHT_SELFCHECK:
            _handleSelfCheck(msg);
            break;

然后在第1章中的FlightDisplayView.qml文件中,对原控件内容进行修改,修改内容如下:

            Rectangle{
                anchors.left:       toolStrip.left              // 左侧对齐
                anchors.top:        toolStrip.bottom            // 顶部位于toolStrip控件底部
                anchors.topMargin:  _margins * 10               // 设置间隙

                width:              150                         // 长和高设置
                height:             30
                color:              "black"                     // 底色设置
                radius:             8                           // 矩形圆角半径
                visible:            true                        // 设置为可见
                z:                  _panel.z + 4                // 设置层级

                // 填充文本
                Text {
                    anchors.fill:   parent
                    text:           qsTr("SelfCheck")//qsTr("Request all Parameter")
                    color:          "white"
                }

                // 设置鼠标点击事件
                MouseArea{
                    anchors.fill:   parent
                    onClicked: {
                        QGroundControl.multiVehicleManager.activeVehicle.selfCheck();
                    }
                }
            }

保存并编译,后续操作过程和第一章一致,结果实现如下:

在这里插入图片描述

以上内容仅作学习分享用途,侵删

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

QGC添加自定义组件和发送自定义MAVLINK消息 的相关文章

  • 飞控接收到的每一条MAVLink消息包都会上传到uORB消息池中吗?

    1 飞控接收到的每一条MAVLink消息包都会上传到uORB消息池中吗 xff1f 2 如何自定义 xff08 选择 配置 xff09 发送给QGC的MAVLink消息 xff1f
  • 改变PX4飞控通过MAVLink发送IMU数据的频率

    改变PX4飞控通过MAVLink发送IMU数据的频率 参考 xff1a https docs px4 io master en middleware mavlink html 在QGC的MAVLink Console中执行命令 xff1a
  • Mavlink任务协议

    联系作者QQ 843230304 本文翻译自 https mavlink io en services mission html mission protocol Mavlink任务协议 任务子协议允许GCS或开发人员API 在无人机 组件
  • MAVLink—最强大的微型飞行器通信协议

    c 光明工作室 2017 2037 COPYRIGHT 光明工作室团队成员大部分来自全国著名985 211工程院校 具有丰富的工程实践经验 xff0c 本工作室热忱欢迎大家的光临 工作室长期承接嵌入式开发 PCB设计 算法仿真等软硬件设计
  • 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
  • MAVLINK消息在Ardupilot中的接收和发送过程

    MAVLINK消息在Ardupilot中的接收和发送过程 SCHED TASKupdate receive update send 由于现在网上很多的都是APM旧版本的解释 xff0c 因此把自己的一些学习所得记录下来 截至写博客日期 xf
  • 【无人机开发】通讯协议MavLink详解

    1 MAVLink简介 MAVLink xff08 Micro Air Vehicle Link xff0c 微型空中飞行器链路通讯协议 xff09 是无人飞行器与地面站 xff08 Ground Control Station xff0c
  • WIN10源码编译安装QGC-V3.4

    目录 写在前面 环境 安装VS2015 xff08 采用的是社区版 xff09 安装Git xff08 见GIT安装教程 xff09 并克隆QGC源码 安装Qt xff0c 并用Qt进行编译 运行 安装注意事项 写在前面 最近想起来之前有过
  • px4调试bug--添加mavlink_log_info信息

    写在前面的话 有一阵子没有看px4的代码了 由于项目和论文的需要 又要接触这个 其中又遇到一些新的问题 找到了一些新的解决方法 故在此记录一下 总是在几种飞控代码之间跳来跳去 没有认真研究一个 有点遗憾 PX4的代码调试还没有找到什么好的方
  • 笔记:QGC使用及姿态环仿真调节方式

    笔记 xff1a QGC使用及姿态环仿真调节方式 打开Gazebo及QGC 进入终端管理员权限 sudo s 在终端打开Gazebo cd Firmware make px4 sitl default gazebo 点击文件夹中的QGC x
  • 【C/C++/QT/ 移植/导入Mavlink V2.0/Mavlink V1.0教程】

    提示 xff1a 本文针对的实例是Mavlink V2 0版本 xff0c Mavlink V1 0版本其实也是类似的的步骤 xff0c 选择的mavlink库不一样而已 官方链接放在此 xff1a Install MAVLink MAVL
  • MAVROS感觉只是起到一个数据格式转换的作用,把ROS TOPIC里面的指令转化为MAVLINK格式发给PX4

    MAVROS感觉只是起到一个数据格式转换的作用 xff0c 把ROS TOPIC里面的指令转化为MAVLINK格式发给PX4 xff0c 所以指令已经由GAAS或者一个功能包发出来了 xff0c MAVROS只是起到一个格式转换转发的作用
  • pixhawk调试过程中QGC报错显示问题及解决方案汇总

    1 室内环境下解锁无人机 xff0c 报错 xff1a Not arming geofence RTL requiers valid home 解决 xff1a 去掉安全设置里面的地理围栏 xff0c 否则只能在有GPS的环境下解锁
  • MAVLINK 请求参数和接收参数

    if decodeState 61 61 1 之后是放在mavlink消息解析后面 请求返回参数配置列表 void MavDebug on pushButton 3 clicked mavlink message t msg mavlink
  • MAVLink认识、使用、自定义

    对mavlink的认识 MAVLink是针对小型飞行器 xff08 MAV xff09 的一个lightweight header only message marshalling library 由头文件构成的信息编组库 它被封装成C结构
  • px4自定义mavlink收不到消息的问题

    px4版本1 12稳定版 最近在做px4二次开发相关工作 按照网上的一些教程自定义了一个mavlink消息用来控制无人机 按照教程里面的单独开了一个xml来定义消息 最后生成的消息在px4端通过流传输的方式自己写的客户端可以收到消息 但是客
  • QGC开发 显示双GPS/RTK信息以及自定义页面(ubuntu)

    一 QGC开发 显示双GPS RTK信息 1 在sitl中进行仿真 xff0c 虚拟出第二个GPS mavlink发送到地面站 如下图中 xff0c 在mavlink msg gps2 raw h中找到发送第二组gps rtk数据函数mav
  • PX4模块设计之五:自定义MAVLink消息

    PX4模块设计之五 xff1a 自定义MAVLink消息 1 MAVLink Dialects1 1 PX4 Dialects1 2 Paprazzi Dialects1 3 MAVLink XML File Format 2 添加自定义M
  • QGC 添加电机测试功能

    组装过程中为了测试电机的连接以及转向 xff0c 现将电机测试功能单独制作一个页面 xff0c 以便使用 一 xff0c 效果 原型 实际效果总是差那么一丢丢 二 xff0c 实现思路 MavlinkConsole 功能 xff0c 可以在

随机推荐

  • VR行业发展的前景和现状?

    标题 VR行业发展的前景和现状 xff1f 1 一个新事物的产生 xff0c 总是伴随着看好和唱衰两种声音 这两种态度自然有其可以理解的地方 xff0c 因为摆在我们面前的是未知 xff0c 而坐在餐桌前的两拨人 xff0c 站在不同的角度
  • 头文件与库的区别

    昨天突然问了一下什么是头文件 xff0c 我一听就傻了 xff0c 虽然上课的时候老师在讲编译的四个过程的时候说了一下 xff0c 但是还是不太理解 xff0c 我们知道编译过程中的预处理阶段会进行头文件展开 xff0c 宏替换以及条件编译
  • 进程、线程

    线程 xff08 thread xff09 线程其实是操作系统能够进行运算调度的最小单位 它是被包含在进程之中的 xff0c 是进程中的实际运作单位 一条线程指的是进程中一个单一顺序的控制流 xff0c 一个进程中可以并发多个线程 xff0
  • 基于Zynq7020双千兆以太网的数字信号处理板设计

    一 背景 背景 Xilinx公司在2010年发布了可扩展的处理器平台Zynq7000系列 xff0c 它采用了28nm工艺 xff0c 将FPGA与ARM cortex A9集成在一颗芯片上 xff0c 实现了高性能 高集成度 低功耗 Zy
  • 深入理解JS中的变量作用域

    在 JS 当中一个变量的作用域 xff08 scope xff09 是程序中定义这个变量的区域 变量分为两类 xff1a 全局 xff08 global xff09 的和局部的 其中全局变量的作用域是全局性的 xff0c 即在 JavaSc
  • 硬件工程师,从零开始无人机开发。

    毕业已经五年了 xff0c 一直在杭州某大厂 xff0c 做无人机硬件开发 无人机这块 xff0c 我进去的时候大厂刚开始 做 xff0c 有幸参与到整个无人机的硬件开发 我这个刚毕业的技术小白 xff0c 在这五年间成长了很多 无奈 今年
  • 个人总结:板球控制系统之串级PID整定方法,速度环与位置环,40S任务10S完成

    其实单环我们先出了所有题目 xff0c 但是效果显然没有串级PID的效果好 xff0c 有人需要的话可以把程序包发出来 xff0c 板球运行视屏也有 另外 xff1a 天下舵机参差不齐 xff08 哪怕型号相同 xff09 xff0c 想要
  • 树莓派3B+踩坑记录:一、安装Ubuntu Mate

    树莓派3B 43 踩坑记录 xff1a 一 安装Ubuntu Mate 树莓派 xff0c Ubuntu xff0c ROS硬件准备软件准备系统烧录安装Ubuntu Mate更换国内源网络配置开启ssh远程其他彩虹屏解决方案XShell和X
  • PointNet代码详解

    PointNet代码详解 最近在做点云深度学习的机器人抓取 xff0c 这篇博客主要是把近期学习PointNet的一些总结的知识点汇总一下 PointNet概述详见以下网址和博客 xff0c 这里也就不再赘述了 三维深度学习之pointne
  • 卡尔曼滤波通俗易懂的解释

    关于卡尔曼滤波 xff0c 网上的资料很多 xff0c 但是有很大一部分都是不断堆叠公式 xff0c 然后用各种晦涩难懂的专业术语进行解释 xff0c 说实话我刚开始看的时候也是云里雾里 xff0c 因此写下这篇博客是为了照顾和我一样的萌新
  • STM32通过PWM控制ESC30C电调

    最近在搞一个水下推进器 xff0c 这东西的控制其实跟四旋翼的螺旋桨控制差不多 但我也是第一次用STM32板子来控制电调驱动桨叶旋转 xff0c 因此踩了很多坑 网上找了很多资料 xff0c 但是很多都写的不是很清楚 xff0c 这边稍微记
  • STM32F7同一定时器多路输出PWM波通道之间相互影响问题

    2020 8 12更新 这次用Cube直接生成PWM控制代码 xff0c 然后再RT Thread Studio上编写程序 xff0c 发现可实现TIM1和TIM8的8路PWM波调控 xff0c 因此上面论述的问题可能是自己在写底层时有某些
  • Ardusub源码解析学习(一)——Ardusub主程序

    APM Sub源码解析学习 xff08 一 xff09 Ardusub主程序 前言一 准备工作二 Ardusub cpp解析2 1 scheduler table2 2 schedulerget scheduler tasks setup
  • Ardusub源码解析学习(二)——电机库

    Ardusub源码解析学习 xff08 二 xff09 电机库学习 一 RC输入与输出1 1 RC Input1 2 RC Output 二 电机库学习2 1 setup motors 2 2 add motor raw 6dof 2 3
  • Ardusub源码解析学习(三)——车辆类型

    APM Sub源码解析学习 xff08 三 xff09 车辆类型 一 前言二 class AP HAL HAL三 class AP Vehicle3 1 h3 2 cpp 四 class Sub4 1 h4 2 cpp 五 总结 一 前言
  • 年度回忆录(2012.10----2013.01)

    寒假结束了 xff0c 年也过完了 xff0c 提前回来一天就开始着手补上这迟到的年终总结 xff0c 写了一个多星期还觉得有些东西没有写出来 xff0c 无奈 xff0c 点到为止吧 2012 年的后半年经历了很多 xff0c 收获了很多
  • Ardusub学习——飞行模式

    参考资料 xff1a Ardusb官方手册 Sub Rework joystick input and pilot input in general Flight Modes Ardusub支持多种飞行模式 xff0c 但是其中一部分需要有
  • Ardusub源码解析学习(五)——从manual model开始

    Ardusub源码解析学习 xff08 五 xff09 从manual model开始 manual init manual run 从本篇开始 xff0c 将会陆续对Ardusub中各种模式进行介绍 xff0c stabilize mod
  • 重读Ardupilot中stabilize model+MAVLINK解包过程

    APM源码和MAVLINK解析学习 重读stabilize stabilize modelinit run handle attitude MAVLINK消息包姿态信息传输过程 之前写的模式都是基于master版本的 xff0c 这次重读s
  • QGC添加自定义组件和发送自定义MAVLINK消息

    QGC添加自定义组件和发送自定义MAVLINK消息 一 添加自定义组件1 1 在飞行界面添加组件1 2 实现组件事件1 3 在MOCK模拟链接中实现验证1 4 验证 二 自定义MAVLINK消息的一些预备知识三 QGC自定义MAVLINK消