自定义运动指令
调用流程图:

实现一个自定义运动指令的例子:
第一步设置运动参数
第二步调用SendCmd下发到控制器。
实现指令PMoveL(point,speed,zone,tool,wobj);
该指令跟现在的MOVEL指令类似,用户可在指令内部实现自己的逻辑,比如搭配焊机等使用。
/**
* @brief 实现指令PMoveL
*/
void RegPMoveL() {
// 1.指令配置,如名称、触发方式、任务限制等
RLCmdConfigAPI cfg;
cfg.SetFuncName("pmovel");
//设置指令前瞻方式为运动指令
cfg.SetLookAhead(CmdLookAheadImplAPI::MOVEMENT_ITSELF) ;
//设置任务限制类型
cfg.SetTaskLimit(TaskLimitAPI::TASK_NO_LIMIT);
//设置步退的类型
cfg.SetStepBack(StepBackAPI::STEP_BACK_CUSTOM);
// 2.根据配置创建指令
BEGIN_COMMAND_API(cfg)
// 3.为指令配置参数检查器
PARAMS_API(
ArgTypeAPI(ValueTypeAPI::VALUE_ROBTARGET),
ArgTypeAPI(ValueTypeAPI::VALUE_SPEED),
ArgTypeAPI(ValueTypeAPI::VALUE_ZONE),
ArgTypeAPI(ValueTypeAPI::VALUE_TOOL),
ArgTypeAPI(ValueTypeAPI::VALUE_WOBJ)
)
// 4.指令正向执行体
RLCmdActionAPI cmd_func = [=](std::shared_ptr<RLCallFrameAPI> frame,
std::vector<std::shared_ptr<SymbolVarBaseAPI>> args) -> CommandExecuteAPI {
// 获取参数数据
auto point = args[0]->GetPointAPI();
auto speed = args[1]->GetSpeedAPI();
auto zone = args[2]->GetZoneAPI();
auto tool = args[3]->GetToolAPI();
auto wobj = args[4]->GetWobjAPI();
CommandExecuteAPI cmd_exec = [=]()
{
MotionCmdArgsAPI args_api;
// 设置目标点
args_api.SetTargetPoint(point);
// 设置运动类型为直线
args_api.SetMoveType(MoveTypeAPI::MOVE_L);
// 设置工具工具速度转弯区域信息
args_api.SetTool(tool);
args_api.SetWobj(wobj);
args_api.SetZone(zone);
args_api.SetSpeed(speed);
// 设置解释当前执行位置的指针
args_api.SetUpdatePointer(frame->GetCmdTask(), frame->GetCmdFile(), frame->GetCmdLine());
// 设置trigger
TriggerAPI t;
t.type = TriggerAPI::TriggerType::DISTANCE;
t.reference_is_from_start = true;
t.value_from_reference = 0.1;
t.trigger_callback = [=]
{
LOG_DEBUG<<frame->GetCmdTask()<<" "<<frame->GetCmdFile()<<" "<<frame->GetCmdLine()<<" 100mm trigger callback";
};
args_api.SetTriggers({t});
// 设置路径的回调
args_api.SetCallback(CallBackTypeAPI::MOVE_START,[]{LOG_INFO<<"movel start callback";});
args_api.SetCallback(CallBackTypeAPI::MOVE_FINISH,[]{LOG_INFO<<"movel finish callback";});
args_api.SetCallback(CallBackTypeAPI::MOVE_PAUSE,[]{LOG_INFO<<"movel pause callback";});
MotionCmdAPI api;
// 发送指令
int ret = api.SendCmd(args_api);
LOG_INFO<<"send motion cmd:"<<ret;
LOG_DEBUG<<"point:"<<point<<" speed:"<<speed<<" zone:"<<zone
<<" tool:"<<tool<<" wobj:"<<wobj;
LOG_DEBUG<<":"<<frame->GetCmdTask()<<" "<<frame->GetCmdFile()<<" "<<frame->GetCmdLine();
if (ret == 0){
return CommandProcessResultAPI::CMD_PROCESS_EXTRA;
}else{
return CommandProcessResultAPI::CMD_PROCESS_ERROR;
}
};
return cmd_exec;
};
EXECUTE_API(cmd_func)
// 5.将指令注册给控制器
REGISTER_COMMAND_API
}
经过以上步骤就新建了一个运动指令。可在RL里面调用PMoveL指令了。
更多指令的使用可参考examples/motion_cmd.cpp