原理:通过mavlink控制台可以执行命令,在循环中调用控制台指令的函数就行了
查阅commander文件下, 所有模式切换都在commder_main函数
int commander_main(int argc, char *argv[])
{
...
if (!strcmp(argv[1], "start")) {
...
}
if (!strcmp(argv[1], "stop")) {
...
}
...
}
这个函数入参指令argv[]就是模式切换的指令,这个主函数是从底层调用的,入参也是在操作系统那一层判断的,但在函数中使用在if判断入参的指令,判断完成后会调用它的执行函数,这样,我们可以从一个循环中,去订阅mavlink消息,直接调用执行哪一个模式的函数就实现了,比如解锁和上锁的指令
if (!strcmp(argv[1], "arm")) {
if (TRANSITION_CHANGED != arm_disarm(true, &mavlink_log_pub, "command line")) {
warnx("arming failed");
}
return 0;
}
if (!strcmp(argv[1], "disarm")) {
if (TRANSITION_DENIED == arm_disarm(false, &mavlink_log_pub, "command line")) {
warnx("rejected disarm");
}
return 0;
}
可以从run函数中,while循环里我们订阅一个uorb消息.检查此消息是否更新(如何添加新的mavlink消息和urob消息看前几篇博客)
这样去写
orb_check(_missle_ctrl_sub,&updated);
if (updated)
{
warnx("_missle_ctrl.cmd_id:%d",_missle_ctrl.cmd_id);
orb_copy(ORB_ID(missle_control), _missle_ctrl_sub, &_missle_ctrl);
if(_missle_ctrl.cmd_id == 0)
{
if (TRANSITION_CHANGED != arm_disarm(true, &mavlink_log_pub, "command line")) {
warnx("arming failed");
}
}
if(_missle_ctrl.cmd_id == 7)
{
if (TRANSITION_DENIED == arm_disarm(false, &mavlink_log_pub, "command line")) {
warnx("rejected disarm");
}
}
}
只要我发送过来的_missle_ctrl.cmd_id 的值等于 0 就会执行解锁指令,等与7就会执行上锁指令
同理,这样可以设置所有的飞行模式