iNavFlight之RC遥控MSP协议

2023-05-16

iNavFlight之RC遥控MSP协议

  • 1. RC摇杆MSP协议
  • 2. 地面站配置 & MSP遥控器
    • 2.1 iNav地面站-配置
    • 2.2 iNav地面站-MSP遥控器
  • 3. RC摇杆总体逻辑框架
    • 3.1 摇杆信息获取
    • 3.2 摇杆信息处理
    • 3.3 摇杆处理初始化
  • 4. RC摇杆代码设计框架
    • 4.1 场景分析
    • 4.2 模块化抽象
  • 5. MSP摇杆代码设计
    • 5.1 rxMspInit
    • 5.2 rxMspFrameStatus
    • 5.3 rxMspReadRawRC
    • 5.4 rxMspFrameReceive
  • 6. 整体Rx业务逻辑处理(processRx)
  • 7. 参考资料

1. RC摇杆MSP协议

iNav在地面站配置工具中,有一个MSP遥控器。该遥控器模拟了一个RC遥控器,通过MSP协议将RC摇杆信息的发送给飞控。

因此,这里也就给第三方提供了遥控控制MSP协议接口,通过这个链路将可以给飞控发送RC摇杆信息。

2. 地面站配置 & MSP遥控器

2.1 iNav地面站-配置

使能MSP遥控器的方法,需要在iNav地面站配置软件里面选择接受模式为MSP。

iNav地面站配置

2.2 iNav地面站-MSP遥控器

通过iNav地面站提供的遥控器UI界面,我们可以基本操作飞机。当然相对来说不是很方便 :)

但是不管如何,我们可以基于MSP协议,通过MSP遥控器来操作飞机。当然如果换成自己的接收机就可以控制飞机了(无需修改任何开源代码)。
MSP遥控器

3. RC摇杆总体逻辑框架

以RC摇杆信息为中心,从逻辑角度,需要三个步骤:

  1. 摇杆信息获取
  2. 摇杆信息处理
  3. 摇杆处理初始化

3.1 摇杆信息获取

  • MSP协议命令:MSP_SET_RAW_RC(200)
  • 任务频度:TASK_PERIOD_HZ(100)
  • 任务优先级:TASK_PRIORITY_LOW
taskHandleSerial  //摇杆信息获取
 └──> mspFcProcessCommand
     └──> mspFcProcessInCommand  //case MSP_SET_RAW_RC
         └──> rxMspFrameReceive

#define MSP_SET_RAW_RC                         200

    [TASK_SERIAL] = {
        .taskName = "SERIAL",
        .taskFunc = taskHandleSerial,
        .desiredPeriod = TASK_PERIOD_HZ(100),     // 100 Hz should be enough to flush up to 115 bytes @ 115200 baud
        .staticPriority = TASK_PRIORITY_LOW,
    },

3.2 摇杆信息处理

  • 任务频度:TASK_PERIOD_HZ(10)
  • 任务优先级:TASK_PRIORITY_HIGH
taskUpdateRxMain  //摇杆信息处理
 └──> processRx
     └──> calculateRxChannelsAndUpdateFailsafe

    [TASK_RX] = {
        .taskName = "RX",
        .checkFunc = taskUpdateRxCheck,
        .taskFunc = taskUpdateRxMain,
        .desiredPeriod = TASK_PERIOD_HZ(10),      // If event-based scheduling doesn't work, fallback to periodic scheduling
        .staticPriority = TASK_PRIORITY_HIGH,
    },

3.3 摇杆处理初始化

对C语言了解的同学,这里就不讲了 :)

main  //摇杆处理初始化
 └──> init
     └──> rxInit

4. RC摇杆代码设计框架

4.1 场景分析

鉴于摇杆信息从使用场景上看,主要是两种类型和十三种串行遥控器协议。所以,从整体上设计上需要考虑这些种类的摇杆信息输入。

typedef enum {
    RX_TYPE_NONE = 0,
    RX_TYPE_SERIAL,
    RX_TYPE_MSP
} rxReceiverType_e;

typedef enum {
    SERIALRX_SPEKTRUM1024 = 0,
    SERIALRX_SPEKTRUM2048,
    SERIALRX_SBUS,
    SERIALRX_SUMD,
    SERIALRX_IBUS,
    SERIALRX_JETIEXBUS,
    SERIALRX_CRSF,
    SERIALRX_FPORT,
    SERIALRX_SBUS_FAST,
    SERIALRX_FPORT2,
    SERIALRX_SRXL2,
    SERIALRX_GHST,
    SERIALRX_MAVLINK,
} rxSerialReceiverType_e;

4.2 模块化抽象

经过整理和抽象以后,每种摇杆信息的使用过程无不离开如下五个步骤:

  1. rcInit
  2. rcFrameStatus
  3. rcProcessFrame
  4. rcReadRaw
  5. rcFrameReceive

5. MSP摇杆代码设计

本章重点介绍MSP摇杆的代码设计,当然我们依然按照逻辑思路和抽象化设计概念走。

  1. rcInit ==> rxMspInit
  2. rcFrameStatus ==> rxMspFrameStatus
  3. rcProcessFrame ==> 无,这里不展开,因为有些协议有反馈遥控器一些ID信息等等之类操作。
  4. rcReadRaw ==> rxMspReadRawRC
  5. rcFrameReceive ==> rxMspFrameReceive

5.1 rxMspInit

基于MSP协议的RC摇杆初始化

  1. 将rxMspReadRawRC和rxMspFrameStatus两个处理函数挂上统一处理框架
  2. 支持18个RC摇杆通道
  3. 支持200ms超时处理
void rxMspInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig)
{
    UNUSED(rxConfig);

    rxRuntimeConfig->channelCount = MAX_SUPPORTED_RC_CHANNEL_COUNT;
    rxRuntimeConfig->rxSignalTimeout = DELAY_5_HZ;
    rxRuntimeConfig->rcReadRawFn = rxMspReadRawRC;
    rxRuntimeConfig->rcFrameStatusFn = rxMspFrameStatus;
}

#define MAX_SUPPORTED_RC_CHANNEL_COUNT              18
#define DELAY_5_HZ (1000000 / 5)

5.2 rxMspFrameStatus

这个不难理解,无非就是MSP协议的RC摇杆只有两种状态:PENDING or COMPLETE

static uint8_t rxMspFrameStatus(rxRuntimeConfig_t *rxRuntimeConfig)
{
    UNUSED(rxRuntimeConfig);

    if (!rxMspFrameDone) {
        return RX_FRAME_PENDING;
    }

    rxMspFrameDone = false;
    return RX_FRAME_COMPLETE;
}

5.3 rxMspReadRawRC

获取当前某个通道的摇杆值。

static uint16_t rxMspReadRawRC(const rxRuntimeConfig_t *rxRuntimeConfigPtr, uint8_t chan)
{
    UNUSED(rxRuntimeConfigPtr);
    return mspFrame[chan];
}

5.4 rxMspFrameReceive

  1. 收到报文直接进行复制,且报文数据按照0 - MAX_SUPPORTED_RC_CHANNEL_COUNT 依次排列。
  2. 该报文接收函数是在MSP端口配置的时候进行调度的,因此不在MSP遥控模块进行初始化。

注:

void rxMspFrameReceive(uint16_t *frame, int channelCount)
{
    for (int i = 0; i < channelCount; i++) {
        mspFrame[i] = frame[i];
    }

    // Any channels not provided will be reset to zero
    for (int i = channelCount; i < MAX_SUPPORTED_RC_CHANNEL_COUNT; i++) {
        mspFrame[i] = 0;
    }

    rxMspFrameDone = true;
}

6. 整体Rx业务逻辑处理(processRx)

略:详见void processRx(timeUs_t currentTimeUs)

注:这里就不再将代码一一罗列出来,看一遍加注释了。如果真有朋友有兴趣,请评论留言,我有机会一一整理。

7. 参考资料

【1】Multiwii Serial Protocol Version 2
【2】BetaFlight模块设计之三十二:MSP协议模块分析
【3】iNavFlight之MSP Sensor报文格式

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

iNavFlight之RC遥控MSP协议 的相关文章

随机推荐

  • 树莓派(Raspberry Pi)FTP服务搭建

    64 TOC 树莓派 Raspberry Pi FTP服务搭建 由于家里使用下载电影 迅雷 xff0c 存储电影 树莓派 43 移动硬盘 xff0c 简易NAS xff1b PC下载的电影可以通过家里的有线主干网络100MB带宽通过samb
  • 四轴飞控DIY Mark4 - 整理&参数优化

    四轴飞控DIY Mark4 整理 amp 参数优化 1 历程2 参数优化2 1 固件BF4 3 12 2 动态怠速值2 3 滤波参数2 4 电调PWM频率2 5 GPS高度配置2 6 返航速度和高度2 7 线性推力修正2 8 图传频道调整
  • BetaFlight深入传感设计之九:传感坐标系/机体坐标系/导航坐标系/经纬度坐标系

    BetaFlight深入传感设计之九 xff1a 传感坐标系 机体坐标系 导航坐标系 经纬度坐标系 1 问题症结2 入手分析2 1 传感坐标系2 2 机体坐标系2 3 导航坐标系2 4 经纬坐标系 3 CF BF iNav代码3 1 机体坐
  • BetaFlight深入传感设计之十:传感器物理特性方向对齐

    BetaFlight深入传感设计之十 xff1a 传感器物理特性方向对齐 1 对齐定义2 常见对齐方式3 自定义对齐方式4 总结5 参考资料6 补充 xff1a gyro 43 mag对齐方式 AHRS Attitude and Headi
  • ArduPilot飞控AOCODARC-H7DUAL固件编译

    ArduPilot飞控AOCODARC H743DUAL固件编译 1 编译目标 xff08 AOCODARC H743DUAL xff09 2 硬件支持包 xff08 APM AOCODARC H743DUAL xff09 3 编译步骤3
  • 四轴FPV手动训练进阶步骤

    四轴FPV手动训练进阶步骤 1 目的2 训练2 1 基本操作训练2 1 1 滞空训练2 1 2 基本动作2 1 3 位置保持 2 2 基本控制训练2 2 1 转弯 Turn 2 2 2 翻滚 Roll 2 2 3 翻转 Flips 2 3
  • 数据库binlog(二进制日志binary log)

    二进制日志中存储的内容称之为事件 xff0c 每一个数据库更新操作 Insert Update Delete xff0c 不包括Select 等都对应一个事件 mysql binlog基本原理 简书 jianshu com https ww
  • 四轴异常炸机分析讨论集锦

    四轴异常炸机分析讨论集锦 0 异常 amp 炸机 汇总目的1 AT9SPro 43 R12DSM 300米信号丢失炸机2 PID参数异常 起飞 Takeoff Runaway 炸机3 接收机信号干扰 炸机4 GPS救援 RC控制信号丢失炸机
  • Github工程中的Markdown语言应用

    Github工程中的Markdown语言应用 1 介绍2 工具2 1 下载链接2 2 编辑界面2 3 插件安装 3 基本操作3 1 标题编写3 2 正文编写3 3 代码块编写3 4 加粗倾斜3 5 有序列表3 6 无序列表3 7 行内代码编
  • iNavFlight之MSP DJI协议分析

    iNavFlight之MSP DJI协议分析 1 iNav串行口通信1 1 iNav 串口任务1 2 调用逻辑 2 iNav串行抽象2 1 框架代码2 2 MSP DJI 协议处理 3 DJI协议相关实现3 1 DJI串口初始化3 2 DJ
  • iNavFlight之MSP DJI协议天空端请求报文

    iNavFlight之MSP DJI协议天空端请求报文 1 报文格式 请求 2 报文标志 flag 3 报文命令 cmd 4 参考资料 MSP DJI协议是用于DJI天空端与飞控端之间的通信协议 xff0c 其工作模式符合C S经典设计 这
  • iNavFlight之MSP DJI协议飞控端请求应答

    iNavFlight之MSP DJI协议飞控端请求应答 1 报文格式2 报文标志 flag 3 报文命令 cmd 4 请求应答 amp 反馈报文4 1 DJI MSP API VERSION4 2 DJI MSP FC VARIANT4 3
  • 大疆Tello UDP控制协议接口

    大疆Tello UDP控制协议接口 1 设计架构2 UDP报文格式2 1 控制报文2 2 查询报文2 3 状态报文 3 命令集3 1 控制报文 控制命令3 2 控制报文 设置命令3 3 查询报文 读取命令 4 状态报文 这里介绍了大疆Tel
  • 蓝牙无线自制串口模块连接穿越机配置工具

    蓝牙无线自制串口模块连接穿越机配置工具 1 目的2 验证环境3 BLE SPP验证4 BT SPP验证5 参考资料6 补充资料 windows10配置全过程截图6 1 添加设备 搜索蓝牙串口设备6 2 连接 选中SnapAirUnit设备6
  • 传感模块:MATEKSYS Optical Flow & LIDAR 3901-L0X

    传感模块 xff1a MATEKSYS Optical Flow amp LIDAR 3901 L0X 1 模块介绍2 规格参数3 使用方法Step1 接线方式Step2 安装方式Step3 使用范围 4 存在问题 思考 4 1 MATEK
  • iNavFlight之MSP v2 Sensor报文格式

    iNavFlight之MSP v2 Sensor报文格式 1 MSP v2传感报文介绍2 MSP v2协议格式3 MSP v2传感代码流程4 MSP v2 传感器4 1 光流传感报文 MSP2 SENSOR RANGEFINDER4 2 测
  • 自制肥鲨HDO2电源降压延长线,支持3S~6S动力电池

    自制肥鲨HDO2电源降压延长线 xff0c 支持3S 6S动力电池 1 问题源由2 破题思路2 1 10元大钞搞定2 2 两个毛爷爷搞定 3 解决方案4 最终延长线产出4 1 裸照4 2 成品 5 花絮6 参考资料 1 问题源由 源由 xf
  • java中for、foreach、stream性能比较

    在开发中循环遍历一个数组经常会用到 xff0c jdk8推出了一些新特性 xff0c 对循环做了比较 xff0c 通过代码亲测 xff0c 记录一下 xff01 1 for循环 public static void main String
  • 自制肥鲨HDO2电源升压延长线

    自制肥鲨HDO2电源升压延长线 1 问题源由2 解决方案3 材料准备4 最终延长线产出4 1 裸照4 2 成品 5 参考资料 1 问题源由 之前我们介绍了 自制肥鲨HDO2电源降压延长线 xff0c 支持3S 6S动力电池 xff0c 主要
  • iNavFlight之RC遥控MSP协议

    iNavFlight之RC遥控MSP协议 1 RC摇杆MSP协议2 地面站配置 amp MSP遥控器2 1 iNav地面站 配置2 2 iNav地面站 MSP遥控器 3 RC摇杆总体逻辑框架3 1 摇杆信息获取3 2 摇杆信息处理3 3 摇