1、 什么是控制权 控制权就是飞机实际的受控主体,飞机正在被哪个设备控制飞行。这里需要澄清的是,控制权是指飞机飞行的控制权,相机云台的控制不属于控制权的范畴。此外在没有获取控制权的时候也是可以控制飞机起飞降落的,但是没有办法前后左右飞行。 2、 控制权的优先级 正如官网的文档所说,控制权的优先级遥控>MSDK>OSDK。这个优先级的意思是优先级高的可以从优先级低的手中强行夺回控制权。 3、 如何知道飞机的控制权在哪个设备 目前仅发现OSDK有一个TOPIC_CONTROL_DEVICE,通过订阅这个topic可以知道飞机的控制权在哪个设备。具体过程如下: 首先创建一个package,以一定的频率来发送这个数据
// Package 0: Subscribe to flight status at freq 1 Hz int pkgIndex = 0; int freq = 1; TopicName topicList1Hz[] = { TOPIC_CONTROL_DEVICE, TOPIC_STATUS_FLIGHT }; int numTopic = sizeof(topicList1Hz) / sizeof(topicList1Hz[0]); bool enableTimestamp = false;
bool pkgStatus = vehicle->subscribe->initPackageFromTopicList( pkgIndex, numTopic, topicList1Hz, enableTimestamp, freq); if (!(pkgStatus)) { return pkgStatus; } subscribeStatus = vehicle->subscribe->startPackage(pkgIndex, responseTimeout); if (ACK::getError(subscribeStatus) != ACK::SUCCESS) { ACK::getErrorCodeMessage(subscribeStatus, __func__); // Cleanup before return vehicle->subscribe->removePackage(pkgIndex, responseTimeout); return false;
}
然后,在循环中不断去get这个数据。
control_device= vehicle->subscribe->getValue<TOPIC_CONTROL_DEVICE>(); 最后把数据转换成int类型打印出来。 std::cout << "Control Devic = " << (int)controlGK7efkajZiW//7sZaszg4qVHdI0skrUkOJ1jpiaaTAPBzeTgRbeJ9uFaFs1hEv5XsBZxoz6Jvjn2/fAC/9ZzJ02KJzxWtC/50FH1xPBQ2fTK1I3/1t4I9wsICAisTARmiX5l9n+BXrsYHuhnWPApXwAb4ZKAgIDAjxGBN5Dof4zTKIxZQEBAQEBgcQT+H5VxwrndZki9AAAAAElFTkSuQmCC[/img]
4、 有关MSDK的控制权 MSDK没有专门获取控制权的函数。实测发现,调用setVirtualStickModeEnabled方法可以获取和释放控制权。通过MSDK执行航点任务,没有发现控制权的交换。而OSDK执行航点任务,需要先获取控制权。 5、 调用释放控制权的函数,控制权会怎么变更 控制权会回到之前所在的设备。例如,控制权在OSDK,调用MSDK获取控制权,然后释放控制权。此时控制权会回到OSDK。 6、 不建议在高控制权设备控制飞机时,低控制权设备调用获取控制权函数去抢夺控制权。此时控制会变得很不稳定。低控制权设备获取控制权,一定要在高控制权设备没有发送控制命令时进行。 |