通用执行器控制
您可以将任意硬件连接到未使用的 PX4 输出端,并使用 遥控控制 或 MAVLink (作为命令或在 使命).
当您需要使用的有效载荷类型没有相关的 MAVLink 命令,或者 PX4 没有对其进行任何特定的集成时,这将非常有用。
信息
更倾向于使用集成硬件和特定于硬件的 MAVLink 命令,例如用于 夹具在可能的情况下,使用通用执行器控制。使用集成硬件可以优化 任务规划和行为 因为任务可以知道硬件的关键信息,例如触发需要多长时间。
使用 MAVLink 进行通用推杆控制
mav_cmd_doo_set_actuator 可用于设置最多 6 个执行机构(一次)的值。该命令可用于 任务 通过创建一个 "设置执行器"任务项目,或作为一个独立的命令。
要控制的输出端在 致动器 在配置屏幕上分配功能 外围通过执行器套件 1
至 外围通过执行器套件 6
到所需的 执行器输出.
mav_cmd_doo_set_actuator
参数1
至 参数6
控制由 外围通过执行器套件 1
至 外围通过执行器套件 6
分别是
例如,在上图中 AUX5
输出被赋予功能 外围通过执行器套件 1
功能要控制连接到 AUX5
的值。 MAV_CMD_DO_SET_ACTUATOR.param1
.
使用 RC 控制通用致动器
使用 RC 通道最多可控制 6 个自动驾驶仪 PWM 或 CAN 输出。要控制的输出可在 致动器 在配置屏幕上分配功能 RC 辅助 1
至 RC 辅助 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 只需将输出设置为指定值,然后立即进入下一个任务项目。如果硬件需要时间来激活,而您需要在当前航点暂停以实现激活,那么您就需要在计划任务时添加额外的项目,以实现所需的行为。
信息
这也是首选集成硬件的原因之一!它允许以通用方式编写任务,由飞行算法池配置管理任何特定于硬件的行为或定时。
在任务中使用通用执行器:
在需要执行器命令的地方创建一个航点任务项目。
将航点任务项目更改为 "设置推杆 "任务项目:
- 在航点任务编辑器上选择标题,打开 选择任务指令 编辑
- 选择类别 高级然后 设置执行机构 项目(如果该项目不存在,请尝试更新版的 QGroundControl 或每日构建)。这将把任务物品类型改为 "设置推杆"。
选择已连接的执行机构,并设置其数值(数值在 -1 和 1 之间正常化)。
MAVSDK (脚本示例)
以下是 MAVSDK 示例代码 展示了如何使用 MAVSDK 动作插件触发有效载荷释放。 set_actuator()
方法。
set_actuator()
索引值映射到为机身定义的 MAVLink 有效载荷输出。
信息
MAVSDK 发送 mav_cmd_doo_set_actuator 引擎盖下的 MAVLink 命令。
#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;
}
测试
由伺服器和其他执行器触发的有效载荷(如机械手)可在该系统中进行测试。 预上膛状态这将禁用电机,但允许执行器移动。
这比在载具上膛时进行测试更安全。
可随时触发和测试相机有效载荷。