发布控制命令
控制来源
目前有三个控制来源,RC(dr16遥控器和键鼠)/AI(上位机)/TERM(命令行控制)
typedef enum {
CTRL_SOURCE_RC,
CTRL_SOURCE_AI,
CTRL_SOURCE_TERM,
CTRL_SOURCE_NUM
} ControlSource;
控制方式
OP(操作手使用RC控制,同时使用AI辅助),AUTO(AI控制),TERM(模拟器中使用命令行控制)
typedef enum {
CMD_OP_CTRL,
CMD_AUTO_CTRL,
CMD_TERM_CTRL,
} Mode;
控制命令
完整的控制命令包含底盘的运动向量,云台的控制模式和目标角度,控制器的在线状态和来源。
typedef Type::Vector3 ChassisCMD;
typedef struct {
Type::Eulr eulr;
GimbalCommandMode mode;
} GimbalCMD;
typedef struct {
GimbalCMD gimbal; /* 云台命令 */
ChassisCMD chassis; /* 底盘命令 */
bool online; /* 在线状态 */
ControlSource ctrl_source; /* 命令来源 */
} Data;
控制事件
向事件控制器”cmd_event”发布对应事件,注意不同控制器的事件名通过枚举声明,但是所有控制器的不同事件对应的数字量不能相同。
命令发布
无论是否检测到控制器在线,都需要向cmd的话题cmd_data_in
发布控制命令和报告状态。
可以先创建一个topic,然后使用RegisterController链接到cmd_data_in
(参考dev_dr16.cpp),也可以直接发布到cmd_data_in
。
事件发布
auto cmd_event = Message::Event::FindEvent("cmd_event");
cmd_event.Active(YOUR_EVENT);
优先级决策
控制权由Component::CMD::self_->ctrl_source_
决定。操作手控制默认为RC,自动控制默认为AI,模拟器中默认为TERM。调用SetCtrlSource
更改这个变量即可更改控制权
根据控制方式,有以下两种决策方法
操作手/自动控制
RC离线时,所有控制量置0。RC在线时,优先使用当前控制权指向的控制器的命令,如果控制器离线,继续使用RC。
命令行控制
直接发布TERM来源的命令