大疆 DJI PSDK1.5.1 实现时间同步以及精准定位功能

1.时间同步

对于M210 RTK来说:

PPS信号是1HZ 的脉冲信号(一秒一次)同时一个PPS信号包含一个UTC数据

UTC数据包里包含含以下信息:

typedef struct {
    int32_t year;          /*!< Specifies year. */
    int32_t month;         /*!< Specifies month. */
    int32_t day;           /*!< Specifies day. */
    int32_t hour;          /*!< Specifies hour. */
    int32_t minute;        /*!< Specifies minute. */
    int32_t second;        /*!< Specifies second. */
    int32_t nanosecond;    /*!< Specifies nanosecond. */
} T_UtcTsMsg;

该结构体可在psdk_cmdset_msg_push.h文件中查看

由于UTC数据来自卫星则可以看作是精准时间,而用户的板载系统需要与这个时间进行同步。UTC数据推送频率与PPS脉冲信号频率一致,如此可以同步飞控系统以及STM32的时间,同步方法如下:

  1. PPS信号的上升沿作为起始信号,STM32端接收到PPS上升沿信号时记录下自己的系统的时间T1
  2. 而该上升沿信号的发送时间为UTC(整秒),所以可以计算出两个系统的时间差为T1-UTC
  3. 由该时间差我们可以同步两个系统的时间,知道任何一个系统的时间都能可以计算出另一个系统的时间

注:可参考OSDK的讲解进行理解:https://developer.dji.com/onboard-sdk/documentation/guides/component-guide-hardware-sync.html#principles-of-operation

2.如何精准的请求照片的信息

目前我们所能提供的UTC时间精度为微妙(us)级别,如果使用我们的sample,用get到的UTC时间去请求位置,只能获取到秒的时间,因为sample中 UTC时间是对齐到整秒的。那么如何得到微妙级别的精度呢?举例如下:

Step 1:相机触发拍照时,记录下曝光时间为Te

Step 2:随后检测下一个PPS上升沿到来的时间为Tp,记录该上升沿获取的UTC时间

Step 3:根据上面的时间同步原理,可以计算出相机曝光的准确时间为UTC-(Tp-Te)

Step 4:将曝光时间分离成year、month、day、hour、minute、second、nanosecond

Step 5:定义结构体:T_UtcTsMsg  test_time;并把曝光时间值赋给test_time

注:T_UtcTsMsg格式sample中已提供:

typedef struct {
    int32_t year;          /*!< Specifies year. */
    int32_t month;         /*!< Specifies month. */
    int32_t day;           /*!< Specifies day. */
    int32_t hour;          /*!< Specifies hour. */
    int32_t minute;        /*!< Specifies minute. */
    int32_t second;        /*!< Specifies second. */
    int32_t nanosecond;    /*!< Specifies nanosecond. */
} T_UtcTsMsg;

Step 6:将test_time值赋给posAcqReq准备请求位置信息

memcpy(&posAcqReq.year, &test_time, sizeof(T_UtcTsMsg));

posAcqReq的格式sample已提供:

T_PsdkPcePosMultiCamPosReq posAcqReq = {0};

typedef struct {
    uint8_t    camNum;                /*!< Specifies camera number. */
    uint8_t    taskId;                    /*!< Specifies task index. */
    int32_t year; /*!< Specifies year. */
    int32_t month; /*!< Specifies month. */
    int32_t day; /*!< Specifies day. */
    int32_t hour; /*!< Specifies hour. */
    int32_t minute; /*!< Specifies minute. */
    int32_t second; /*!< Specifies second. */
    int32_t reserved; /*!< Specifies nanosecond. */
    T_PsdkPcePosExpoDetlInfo expoDetlInfo[PCEPOS_MAX_PIC_NUM_ONE_POS_REQ];  /*!< Specifies exposure time offset of picture. */

} T_PsdkPcePosMultiCamPosReq;

请注意,这个结构体内的纳秒变成了保留位,所以这里的赋值只是到秒级别,那么曝光时间分离出的纳秒在Step 7里面将会用到

Step 7:完善请求信息:

posAcqReq.camNum = 1;              //相机数,最高为5个
posAcqReq.taskId = 1;                 //任务ID
posAcqReq.expoDetlInfo[0].picId = 1;     //请求照片的ID
posAcqReq.expoDetlInfo[0].camId = 1;    //请求相机的ID
posAcqReq.expoDetlInfo[0].timeOfsNs = ;  //照片曝光时间的nanosecond

所以曝光时间分离出的纳秒需要赋值给posAcqReq.expoDetlInfo[0].timeOfsN,因为可能会出现同一秒内,用户使用多个相机,拍摄了多张照片的情况。我们把纳秒提出来是为了在一次请求中把所有的照片信息都请求完,而不是分多次请求。我们以一秒内,用户使用一个相机拍摄了两张照片为例:

memcpy(&posAcqReq.year, &test_time, sizeof(T_UtcTsMsg)); //
posAcqReq.camNum = 1;              //相机数,最高为5个
posAcqReq.taskId = 1;                 //任务ID
posAcqReq.expoDetlInfo[0].picId = 1;     //请求照片的ID
posAcqReq.expoDetlInfo[0].camId = 1;    //请求相机的ID
posAcqReq.expoDetlInfo[0].timeOfsNs = ;  //照片1曝光时间的nanosecond
posAcqReq.expoDetlInfo[1].picId = 2;     //请求照片的ID
posAcqReq.expoDetlInfo[1].camId = 1;    //请求相机的ID
posAcqReq.expoDetlInfo[1].timeOfsNs = ;  //照片2曝光时间的nanosecond

Step 8:调用请求接口,打印位置信息

if (PsdkPcePos_MutilCamPosAcq(&s_psdkUpperHandle, &posAcqReq, &posAcqAck) == PSDK_STAT_OK&& posAcqAck.ackCode == PSDK_CMD_ACK_CODE_OK)
{
PSDK_LOG_DEBUG("Get precise position success.");
PSDK_LOG_DEBUG("pos: %f %f %f", posAcqAck.posDetlInfo[0].mainAntPos.longitude,posAcqAck.posDetlInfo[0].mainAntPos.latitude, posAcqAck.posDetlInfo[0].mainAntPos.height);
}

请求所获得的位置信息为一号云台口中心点的位置信息,如果您想获取您相机的中心点位置,可以根据飞机姿态,以及您相机的云台的姿态,进行几何运算。

3.Mark文件

Mark文件简介:https://blog.csdn.net/qq_35781447/article/details/107186832

如何触发飞控记录Mark文件

当PSDK向飞控请求位置信息时,飞控便会返回位置信息给PSDK,并且记录在Mark文件中。请求接口以及返回值判断如下:

if (PsdkPcePos_MutilCamPosAcq(&s_psdkUpperHandle, &posAcqReq, &posAcqAck) == PSDK_STAT_OK&& posAcqAck.ackCode == PSDK_CMD_ACK_CODE_OK)
{
 PSDK_LOG_DEBUG("Get precise position success.");
 PSDK_LOG_DEBUG("pos: %f %f %f", posAcqAck.posDetlInfo[0].mainAntPos.longitude,
 posAcqAck.posDetlInfo[0].mainAntPos.latitude, posAcqAck.posDetlInfo[0].mainAntPos.height);
}

 

<think>好的,用户想了解大疆PSDK的使用指南和开发文档。首先,我需要参考之前提供的引用内容,看看哪些信息相关。引用[2]提到有《无人机应用开发指南:基于大疆Payload SDK.pdf》和《大疆无人机二次开发教程.pdf》,还有资料包的链接,应该先推荐这些文档。然后引用[3]详细说明了启动文件的示例代码和配置,这部分对开发者来说很实用,需要详细说明初始化步骤。引用[4]强调了PSDK的应用场景和兼容性,可以举几个例子帮助用户理解用途。用户可能还需要知道如何获取官方文档,引用[1]和[4]都提到了官网和社区支持,应该指导用户去官网注册下载。另外,用户可能对开发流程不熟悉,需要分步骤讲解环境配置、初始化、功能开发、调试和部署。还要注意生成相关问题,比如开发环境搭建、通信协议、调试工具等,帮助用户深入探索。最后,确保回答结构清晰,分点说明,并正确引用来源,避免格式错误。</think>### 大疆 Payload SDK (PSDK) 使用指南与开发文档解析 #### 一、核心开发文档与资源 1. **官方开发文档** 大疆官网提供完整的《DJI Payload SDK 开发文档》,包含以下内容: - **硬件接口定义**:GPIO、UART、CAN 等通信协议[^2] - **API 函数说明**:如`psdk_init()`初始化函数、传感器数据订阅接口[^3] - **通信协议规范**:数据传输格式与校验机制[^2] *获取方式:需在大疆开发者平台注册后下载[^4]* 2. **教程资料包** 推荐以下实用资源: - 《无人机应用开发指南:基于大疆Payload SDK》 含硬件集成示意图与通信时序图示例: ``` +----------------+ CAN总线 +---------------+ | 无人机飞控系统 | <----------------> | PSDK设备模块 | +----------------+ +---------------+ ``` - 《DJI Payload SDK 使用教程》 提供代码模板与编译工具链配置说明[^3] #### 二、开发流程关键步骤 1. **环境配置** - 操作系统:支持 Ubuntu 18.04/20.04 LTS 或 Windows 10(需安装Linux子系统) - 工具链:GCC 7.5+/CMake 3.10+[^3] 2. **初始化流程** 典型启动代码结构: ```c #include "psdk_lib/psdk_lib.h" int main() { psdk_init(PSDK_DEVICE_TYPE_CAMERA); // 声明设备类型 psdk_enable_highspeed_channel(); // 启用高速数据传输 psdk_subscribe_sensor_data(SENSOR_GPS); // 订阅GPS数据 while(1) { psdk_event_loop(); // 事件循环处理 } psdk_release(); } ``` 3. **功能开发** - **数据采集**:通过`psdk_get_sensor_data()`获取IMU、GPS等数据[^3] - **设备控制**:使用`psdk_send_control_command()`实现云台转动/负载开关[^4] #### 三、典型应用场景 1. **行业解决方案** - 农业植保:通过PSDK控制多光谱传感器与变量喷洒系统 - 电力巡检:集成红外热成像仪与激光测距模块 *数据流示例:* $$ T_{object} = \epsilon \cdot \sigma \cdot (V_{sensor}^4 - V_{ambient}^4) $$ 其中$\sigma$为斯特藩-玻尔兹曼常数 2. **创新开发案例** - 应急救援:搭载生命探测仪与物资投放装置[^1] - 测绘工程:与RTK模块协同实现厘米级定位[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MacalDan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值