1.在OSDK 4.0上移植FreeRTOS:
    https://bbs.dji.com/forum.php?mobile=2&mod=viewthread&tid=246023

    问题记录:
    要将gcc版本从7.5降至5.5,使用指令(linux命令行):
    sudo update-alternatives —install /usr/bin/gcc gcc /usr/bin/gcc-5 100 (配置优先级)


    2.代码结构

    3.有哪些功能:
    (1)飞行控制
    姿态控制:采用姿态指令进行低水平控制。
    速度控制:带速度命令的低级控制。
    位置控制:带位置指令的低位控制。
    任务:方便,易于实现飞机的高水平控制。 例如,可以使用Waypoint任务执行定义的飞行路径。
    (2)相机和万向节控制
    万向节:位置和速度控制模式
    (3)飞机遥测
    通过SDK可以获得高达200 Hz的丰富传感器和飞机状态数据:
    惯性传感器数据:全球定位系统、RTK、罗盘、晴雨表
    飞机状态数据:飞行速度、飞行高度、万向节状态、电池状态、四元数、线性加速度、角速率、

    视觉系统和遥测协助 可用来定位
    向下朝向的摄像机可以比消费者卫星定位系统更准确地帮助确定相对位置和速度。它们还可用于悬停在GPS拒绝的环境中,例如建筑物内部

    4.可能的应用:
    (1)使用定制传感器检查任务
    (2)带定制执行器的交付任务
    (3)实时映射和导航
    (4)在难以预先规划的环境中导航(动态或几何复杂)
    (5)在GPS拒绝的环境中飞行

    应用程序通过DJI Onboard SDK中的主要Vehicle类访问DJI产品的功能。
    IMU的状态可在飞行控制器状态数据中监控

    Waypoint任务(航点任务)/Hotpoint任务(热点任务)
    在热点任务中,飞机将在称为热点(也称为兴趣点)的指定点周围反复飞行恒定半径的圆。 海拔高度、速度、热点位置、飞机航向和飞行方向都可以定义为任务的一部分。

    5.了解什么是广播(broadcast)
    在数据广播机制中,数据包以预先配置的频率到达 可以通过DJI Onboard API在应用程序中修改频率,也可以在飞行前通过DJI Assistant 2进行更改。
    I、可获得的广播数据
    广播数据到达包含下列组件的状态信息的包中:时间戳、硬件同步时间戳、四元数、角速率、速度、陀螺仪阅读、全球位置、相对位置、全球定位系统、RTK、磁力仪、遥控器、万向节、航班状态、电池。
    II、可获得的广播频率:0Hz、1Hz、10Hz、50Hz、100Hz

    6.了解RTK定位系统
    DJI DRTK定位系统是与M600和A3飞行控制器兼容的附件,可以进行厘米级定位。 DRTK是一个实时动能卫星定位系统,使用GPS + GLONASS或GPS +北斗星座(取决于DRTK模型)。
    该系统需要基站和移动台接收器,它们通过无线链路连接在一起。基站接收器部署在地面上的已知位置,而移动台部署在飞机上。基站和移动台都将同时经历类似的卫星信号错误。当基站位于已知位置时,它可以向移动台发送实时校正信息,从而为移动台相对于基站产生厘米精确的定位信息。
    移动台配有两个天线,可以部署在飞机的两侧。由于两个天线的位置可以组合成航向矢量,该航向矢量通常比具有高磁场干扰的环境中的罗盘航向更精确(如近大金属结构或高压线路)。

    7.注意问题:
    (1)STM32的板子初始化后要先等待一段时间,可以在初始化中加延时,或者等飞控成功启动再给板子上电,否则通讯会不成功。
    (2)调用OSDK API时
    与飞行控制器通信的每个API在OSDK中都有两个重载:
    I、阻止过载API(Blocking Overload API)
    阻止API等待飞机返回确认。 阻塞调用将该确认以及一些元数据作为API本身的返回值传递给调用者。 大多数阻塞API返回ACK :: ErrorCode; 这允许通过ACK :: getError和ACK :: getErrorCodeMessage API查询错误。 某些阻止API具有一些其他信息,并具有特定的返回类型。

    II、非阻塞过载API(Non-blocking Overload API)
    在将请求发送到飞机后,非阻塞API将立即返回,并且开发人员应该实现并向非阻塞API提供回调函数以处理来自飞机的确认。 在异步程序中使用它们 (其中对确认的处理)对于程序中主要逻辑流程的正确操作不是必不可少的。

    (3)线程问题
    在支持线程的系统(除STM32之外的所有平台)上,OSDK运行三个线程:
    主线程:程序执行的主要流程在这里发生。通常,发送到飞机/ FC的所有命令都在该线程上执行。
    串行读取线程:**来自飞机/ FC的遥测数据在串行读取线程上处理,并在此处填充确认/返回类型。阻塞调用将阻塞主线程,直到读取线程完成处理其确认。一些回调是在这个线程上处理的 ——那些注册来自飞机的异步“推送数据”(这可以通过DJI Assistant 2的SDK页面启用)
    USB**读取线程:如果启用了M210上的高级感应功能,则会创建单独的线程。此功能适用于订阅机制。订阅图像后,推送数据将继续通过USB传输。该线程仅提供读取功能。如果开发人员想对图像数据进行大量计算,建议创建一个单独的线程。
    回调线程:**处理发送到飞机/ FC的命令的确认的所有回调**都在回调线程上执行。

    不要在推送数据回调中进行阻塞API调用,因为这会在读取线程上创建死锁,并且所有后续调用都将失败。
    **