dji开发之获取订阅

当选择的平台是Linux时,应该如何获取无人机的传感器信息呢?

大疆OnBoard SDK提供了两种方式(广播和订阅),这里讲如何订阅无人机传感器数据:

初始化订阅后,通过TopicName topicList50Hz[] = {}添加需要订阅的话题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Telemetry: Verify the subscription
int responseTimeout = 1;
ACK::ErrorCode subscribeStatus;
subscribeStatus = vehicle->subscribe->verify(responseTimeout);
if (ACK::getError(subscribeStatus) != ACK::SUCCESS)
{
ACK::getErrorCodeMessage(subscribeStatus, __func__);
return false;
}
// Telemetry: Subscribe to quaternion, fused lat/lon and altitude at freq 50 Hz
int pkgIndex = 2;
int freq = 50;
TopicName topicList50Hz[] = {TOPIC_QUATERNION, TOPIC_GIMBAL_ANGLES, TOPIC_GPS_FUSED, TOPIC_RC };
int numTopic = sizeof(topicList50Hz) / sizeof(topicList50Hz[0]);
bool enableTimestamp = false;

bool pkgStatus = vehicle->subscribe->initPackageFromTopicList(
pkgIndex, numTopic, topicList50Hz, 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;

这里以TOPIC_GIMBAL_ANGLES话题为例。

当订阅了该话题后获取话题的数据:

1
2
TypeMap<TOPIC_GIMBAL_ANGLES>::type subscriptionGimbal;
subscriptionGimbal = vehicle->subscribe->getValue<TOPIC_GIMBAL_ANGLES>();

如何知道subscriptionGimbal包含哪些数据呢?下面是大疆官方提供对各种订阅话题的说明,可以找到对应的模块:

DJI Onboard SDK: Telemetry Topics

djiTopic

于是便可正常获取传感器的具体数据了:

1
2
3
std::cout<<"Gimbal pitch:" << subscriptionGimbal.x << std::endl;
std::cout<<"Gimbal roll:" << subscriptionGimbal.y << std::endl;
std::cout<<"Gimbal yaw:" << subscriptionGimbal.z << std::endl;