APM 学习8 --- RC 输入输出

英文原文地址:https://ardupilot.org/dev/docs/learning-ardupilot-rc-input-output.html

1, RC 输入输出概述

     对于任何种类的自动驾驶仪,RC 的输入与输出都是一个重要组成部分。根据板子硬件的不同,ArduPilot支持几种不同类型的 RC 输入:

  •  - PPMSum - on PX4, Pixhawk, Linux and APM2
  •  - SBUS - on PX4, Pixhawk and Linux
  •  - Spektrum/DSM - on PX4, Pixhawk and Linux
  •  - PWM - on APM1 and APM2
  •  - RC Override (MAVLink) - all boards

     可用的通道数取决于特定板的硬件。请注意,SBUS 和 Spektrum / DSM 是串行协议, SBUS是 波特率为 100k 的反向 UART 协议,而 Spektrum / DSM 是 115200 波特 UART 协议。一些主板使用硬件 UART(例如在PX4上)实现这些功能,而另一些则通过软件按位来实现。
     RC 输出是 ArduPilot 一般用来控制电调或者电动机。可用输出通道的数量取决于电路板的类型,甚至可能取决于车辆的类型和配置参数。 RC 输出默认为 50Hz PWM值,但可以配置为多种更新速率。例如,直升机代码设置其电机输出以更高的速率(通常超过400Hz)驱动电调。

1.1, AP_HAL rc 输入对象

       首先要了解的是 AP_HAL RCInput 对象,可以作为 hal.rcin 使用。这提供了对当前在板上接收的通道值的低级别访问。返回值是微秒内的 PWM 值。

       查找库 /AP_HAL/examples/RCInput/RCInput.cpp 示例,然后在板上尝试一下。尝试移动发射器上的摇杆,并检查输出中的值是否正确更改。

void read_channels(void);
void read_channels(void)
{
    uint8_t nchannels = hal.rcin->num_channels();  // Get the numbers channels detected by RC_INPUT.
    if (nchannels == 0) {
        hal.console->printf("No channels detected\n");
        return;
    }
    if (max_channels_display == 0) {
        hal.console->printf("Channels detected: %2u\n", nchannels);
        hal.console->printf("Set max_channels_display > 0 to display channels values\n");
        return;
    }

    if (nchannels > MAX_CHANNELS) {
        nchannels = MAX_CHANNELS;
    }

    bool changed = false;
    for (uint8_t i = 0; i < nchannels; i++) {
        uint16_t v = hal.rcin->read(i);
        if (last_value[i] != v) {
            changed = true;
            last_value[i] = v;
        }
    }
    if (max_channels_display > nchannels) {
        max_channels_display = nchannels;
    }

    if (changed) {
        for (uint8_t i = 0; i < max_channels_display; i++) {
            hal.console->printf("%2u:%04u ", (unsigned)i+1, (unsigned)last_value[i]);
        }
        hal.console->printf("\n");
    }
}

1.2, AP_HAL rc 输出对象

       AP_HAL RCOutput 对象(可作为 hal.rcout 使用)对所有输出通道进行低电平控制。实现的方式具体取决于电路板,并且可能涉及片上定时器或 I2C 外设的编程,或通过协处理器(例如PX4IO微控制器)的输出。

       查看库 /AP_HAL/examples/RCOutput/RCOutput.cpp 示例会发现, 它只是设置了所有通道,以便在几秒钟内将伺服从最小值到最大值, 可以将舵机连接到输出通道,测试输出是否有效 

1.3, The RC_Channel 对象

       上面讨论的 hal.rcin 和 hal.rcout 对象是底层函数。在 ArduPilot 中处理 RC 输入和输出的常用方法是通过一个称为RC_Channel 的高级对象。该对象具有用户可配置的每个通道的最小/最大/修剪参数,并支持辅助通道功能,输入和输出的缩放比例以及许多其他功能。

       查看库/ RC_Channel /示例 /RC_Channel/RC_Channel.cpp。该示例显示了如何设置 RC 通道,读取输入以及将输入复制到输出值。在您的电路板上运行该代码,并检查变送器输入是否已传递到伺服系统。尝试将其更改为反向频道,并更改频道的最小/最大/微调, 浏览 RC_Channel.h 以查看可用的API函数。

2, RC_Channel 特殊输入 / 输出设置

       如果仔细查看 RC_Channel,会发现一些奇怪的地方。输入端和输出端都有很多变量。例如,rc1-> radio_trim 应用于通道1作为输入(指定用于计算输入比例的修整点),以及作为输出,指定连接到该通道的伺服器的中点。

       这实际上是将输入通道号与输出通道号联系在一起的概念,  您可能希望将通道 1 输入用作 “侧倾输入”,但实际上无人机将通道1 输出用于操纵飞机的前轮。使用 RC_Channel,用户实际上无法做到这一点,或者至少如果这样做,最终将得到一些非常奇怪的代码。这是 RC_Channel 最初如何开发的产物,其中在手动模式下固定翼飞机从输入通道到输出通道的直通是正常的。总有一天,我们可能会对其进行更改,以更合乎逻辑的方式将这两个概念分开,但现在请注意,这很奇怪,因此当您看到奇怪的代码来解决这个问题时,就会知道其中的缘由

3, RC_Channel 辅助对象

        与 RC_Channel 一起,库/ RC_Channel 中还有另一个重要的类。它是 RC_Channel_aux 类,它是 RC_Channel 的子类。

        RC_Channel_aux 对象是 RC_Channel 的一种类型,但具有允许用户指定其用途的其他属性。例如,假设用户希望通道 6 设置成为摄像机支架的侧倾稳定器。他们会将参数 RC6_FUNCTION 设置为 21,这表示“方向舵”,然后另一个库中如下所描述:

RC_Channel_aux::set_servo_out(RC_Channel_aux::k_rudder, 4500);

       并且将其 FUNCTION 参数设置为 21 的任何通道都将移至全挠度(因为 k_rudder 设置为以度为单位的角度,最大比例为 4500)。请注意,这是一对多的安排。用户可以根据需要将多个通道设置为具有 FUNCTION 21,所有这些通道都将联动,每个通道都使用自己的最小 / 最大 / 微调值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章