接收控制命令

接收云台/底盘命令

直接从”cmd_chassis”和”cmd_gimbal”这两个topic订阅即可

接收事件

首先执行器要声明自身可以响应的事件,比如底盘可以选择放松/跟随云台/小陀螺

typedef enum {
    SET_MODE_RELAX,
    SET_MODE_FOLLOW,
    SET_MODE_ROTOR,
} ChassisEvent;

然后声明事件改变的处理函数。ctrl应当为信号量或互斥锁,保证不会在控制过程中对模式进行更改。

auto event_callback = [](uint32_t event, void* arg) {
    ctrl_lock_.Take(UINT32_MAX);
    switch(event){
        case SET_MODE_RELAX:
            ...
            break;
        ...
    }
    ctrl_lock_.Give();
};

编写配置文件,将控制器与执行器的事件绑定。此步骤一般在robot.cpp中完成

const std::vector<Component::CMD::EventMapItem> EVENT_MAP = {
    Component::CMD::EventMapItem{
        Component::CMD::CMD_EVENT_LOST_CTRL,
        Module::RMBalance::SET_MODE_RELAX
    },
    Component::CMD::EventMapItem{
        Device::DR16::DR16_SW_L_POS_TOP,
        Module::RMBalance::SET_MODE_RELAX
    },
    Component::CMD::EventMapItem{
        Device::DR16::DR16_SW_L_POS_MID,
        Module::RMBalance::SET_MODE_RELAX
    },
    Component::CMD::EventMapItem{
        Device::DR16::DR16_SW_L_POS_BOT,
        Module::RMBalance::SET_MODE_FOLLOW
    }
};

最后在执行器初始化时注册处理函数和map即可

Component::CMD::RegisterEvent<ArgType, EventType>(event_callback, this, this->param_.EVENT_MAP);