跳至内容

通用执行器控制

您可以将任意硬件连接到未使用的 PX4 输出端,并使用 遥控控制MAVLink (作为命令或在 使命).

当您需要使用的有效载荷类型没有相关的 MAVLink 命令,或者 PX4 没有对其进行任何特定的集成时,这将非常有用。

信息

更倾向于使用集成硬件和特定于硬件的 MAVLink 命令,例如用于 夹具在可能的情况下,使用通用执行器控制。使用集成硬件可以优化 任务规划和行为 因为任务可以知道硬件的关键信息,例如触发需要多长时间。

mav_cmd_doo_set_actuator 可用于设置最多 6 个执行机构(一次)的值。该命令可用于 任务 通过创建一个 "设置执行器"任务项目,或作为一个独立的命令。

要控制的输出端在 致动器 在配置屏幕上分配功能 外围通过执行器套件 1外围通过执行器套件 6 到所需的 执行器输出.

QGC 中的通用执行机构输出设置

mav_cmd_doo_set_actuator 参数1参数6 控制由 外围通过执行器套件 1外围通过执行器套件 6 分别是

例如,在上图中 AUX5 输出被赋予功能 外围通过执行器套件 1 功能要控制连接到 AUX5 的值。 MAV_CMD_DO_SET_ACTUATOR.param1.

使用 RC 控制通用致动器

使用 RC 通道最多可控制 6 个自动驾驶仪 PWM 或 CAN 输出。要控制的输出可在 致动器 在配置屏幕上分配功能 RC 辅助 1RC 辅助 6 到所需的 执行器输出.

将特定 RC 通道映射到输出功能 RC 辅助 n (并因此分配输出),您可以使用 RC_MAP_AUXn 参数相同的 n

例如,要控制连接到 AUX 针脚 3(例如)上的执行器,可以分配输出功能 RC 辅助 5 到输出端 AUX3.然后,您就可以通过设置遥控通道来控制 AUX3 使用 RC_MAP_AUX5.

任务中的通用执行器控制

要在任务中使用通用推杆控制,首先必须 配置要使用 MAVLink 控制的输出端.

那么在 QGroundControl 您可以在任务中使用 设置执行机构 任务项目(这将增加一个 mav_cmd_doo_set_actuator 到上传的任务计划)。

需要注意的是,在使用通用执行器控制时,既不能 QGroundControl 或 PX4 对被触发的硬件一无所知。在处理任务项目时,PX4 只需将输出设置为指定值,然后立即进入下一个任务项目。如果硬件需要时间来激活,而您需要在当前航点暂停以实现激活,那么您就需要在计划任务时添加额外的项目,以实现所需的行为。

信息

这也是首选集成硬件的原因之一!它允许以通用方式编写任务,由飞行算法池配置管理任何特定于硬件的行为或定时。

在任务中使用通用执行器:

  1. 在需要执行器命令的地方创建一个航点任务项目。

  2. 将航点任务项目更改为 "设置推杆 "任务项目:

    设置执行机构任务项目

    • 在航点任务编辑器上选择标题,打开 选择任务指令 编辑
    • 选择类别 高级然后 设置执行机构 项目(如果该项目不存在,请尝试更新版的 QGroundControl 或每日构建)。这将把任务物品类型改为 "设置推杆"。
  3. 选择已连接的执行机构,并设置其数值(数值在 -1 和 1 之间正常化)。

    设置执行机构任务项目

MAVSDK (脚本示例)

以下是 MAVSDK 示例代码 展示了如何使用 MAVSDK 动作插件触发有效载荷释放。 set_actuator() 方法。

set_actuator() 索引值映射到为机身定义的 MAVLink 有效载荷输出。

信息

MAVSDK 发送 mav_cmd_doo_set_actuator 引擎盖下的 MAVLink 命令。

cpp
#include <mavsdk/mavsdk.h>;
#include <mavsdk/plugins/action/action.h>;
#include 时间顺序<chrono>;
#include <cstdint>;
#include iostream>;
#include 未来;

使用 命名空间 mavsdk;

空白 用法( 标准::字符串及样品; bin_name)
{
    标准::cerr <<; 使用方法:"; <<; bin_name <<; " <connection_url> <actuator_index> <actuator_value>;\n";
              <<; "连接 URL 格式应为 :\n";
              <<; " 对于 TCP:tcp://[服务器主机][:服务器端口]\n";
              <<; "对于 UDP:udp://[bind_host][:bind_port]。\n";
              <<; " 串行端口:serial:///path/to/serial/dev[:波特率]\n";
              <<; 例如,要连接到模拟器,请使用 URL:udp://:14540\n";;
}

int 主要(int 参数, char** 参数)
{
    如果 (参数 != 4) {
        用法(argv[0]);
        返回 1;
    }

 标准::string connection_url = argv[1];
 int 索引 = 标准::脚踏(argv[2]);
 浮动 价值 = 标准::单链(argv[3]);

    Mavsdk mavsdk;
 连接结果 connection_result = mavsdk.添加任意连接(connection_url);

    如果 (连接结果 != 连接结果::Success) {
        标准::cerr <<; 连接失败:"; <<; 连接结果 <<; '\n';
        返回 1;
    }

    标准::cout <<; 等待发现系统...\n";;
    汽车 舞会 = 标准承诺<;标准::shared_ptr<;系统>>;{};
    汽车 未来 = 舞会获取未来();

    // 我们等待着新系统的发现,一旦我们找到一个有
    //自动驾驶仪,我们决定使用它。
    mavsdk.subscribe_on_new_system([及样品;mavsdk, 及样品;舞会]() {
        汽车 系统 = mavsdk.系统().();

        如果 (system->;has_autopilot()) {
            标准::cout <<; 发现自动驾驶仪\n";;

            // 再次取消订阅,因为我们只想找到一个系统。
            mavsdk.subscribe_on_new_system(nullptr);
            舞会设置值(系统);
        }
    });

    // 我们通常以 1Hz 的频率接收心跳,因此我们应该找到一个
    最长约 3 秒钟后 // 系统肯定会启动。
    如果 (未来。等待(标准::计时器::秒钟(3)) == 标准::未来状态::timeout) {
        标准::cerr <<; 未找到自动驾驶仪,退出。\n";;
        返回 1;
    }

    // 立即发现系统。
    汽车 系统 = 期货。获取();

    // 安装插件。
    汽车 行动 = 行动{系统};

    标准::cout <<; "设置执行器...\n";;
 行动:: 结果 set_actuator_result = 行动。设置促动器(索引,值);

    如果 (set_actuator_result != 行动::结果::Success) {
        标准::cerr <<; "设置执行器失败:"; <<; 设置致动器结果 <<; '\n';
        返回 1;
    }

    返回 0;
}

测试

由伺服器和其他执行器触发的有效载荷(如机械手)可在该系统中进行测试。 预上膛状态这将禁用电机,但允许执行器移动。

这比在载具上膛时进行测试更安全。

可随时触发和测试相机有效载荷。