发布控制命令

控制来源

目前有三个控制来源,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来源的命令