接收控制命令
接收云台/底盘命令
直接从”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);