大疆无人机二次开发进阶-DJI mobile SDK和DJI onboard SDK联合开发行业应用项目

本文介绍如何使用 DJI Mobile SDK 和 Onboard SDK 进行联合开发,包括申请 Onboard SDK KEY、激活板载设备、理解通信协议等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PS:最近又涉及该项目,增加部分没写内容,记录下详细步骤。

上一篇文章讲到了怎么使用DJI mobile SDK,这次主要讲解DJI mobile SDK和DJI onboard SDK联合开发。

android APP那端向DJI onborad SDK端发数据和收数据我就不做详细介绍了,调一个函数即可,无需封装和解析协议,如下:

if (mFlightController == null) {
                    Aircraft mAircraft2 = (Aircraft) DJISDKManager.getInstance().getProduct();
                    if (mAircraft2 != null)
                        mFlightController = mAircraft2.getFlightController();
 }             
FlightController.OnboardSDKDeviceDataCallback receiveCallback = new FlightController.OnboardSDKDeviceDataCallback() {
                    @Override
                    public void onReceive(byte[] bytes) {
            
                    }
                };
mFlightController.setOnboardSDKDeviceDataCallback(receiveCallback);
if (mFlightController != null) {
                    mFlightController.sendDataToOnboardSDKDevice(bean.getActivateByte(), null);

下面详细介绍DJI onborad SDK的使用,以M600 PRO为例:

 

1、首先申请DJI onborad SDK KEY,地址:https://developer.dji.com/cn/user/apps/

得到 APP ID 和 APP key。

2、如果要使用DJI onborad SDK,必须开启无人机的API控制,下载大疆调参软件(For 经纬系列,其他自行在官网产品下载查找地址)https://dl.djicdn.com/downloads/dji_assistant/20190527/DJI+Assistant+2+For+Matrice+2.0.8.exe
DJI Assistant 2开启API控制,将串口波特率调为230400,其余如果不需要,可以选择不发送。

3、激活你的key,将你电脑的UART串口(USB串口)与飞控的API口连接如下图

只需要接123口即可,不需要接电。

然后在大疆GITHUB上下载QT的激活程序https://github.com/dji-sdk/Onboard-SDK/releases

用QT编译生成后执行,该过程飞机遥控器必须打开,并且连上平板的DJI GO和平板联网,然后这样就可以激活你的KEY,

激活成功你的板载设备以后无需联网就可以使用该KEY了。

QT可执行程序,点击下载

4、激活你的板载设备

将你的设备和飞控SDK的API串口连接,和上面一样,然后在你的设备程序中打开串口,波特率230400,第一步你先要获得

SDK的版本

大疆协议链接https://developer.dji.com/onboard-sdk/documentation/protocol-doc/open-protocol.html

你先要读懂大疆的协议,还有一点好像他的CRC检验不太一样,具体可以从QT工程的源码中获取该函数,如下

/*
typedef signed char int8_t;
typedef unsigned char   uint8_t;
typedef short  int16_t;
typedef unsigned short  uint16_t;
typedef int  int32_t;
typedef unsigned   uint32_t;
*/

//! CRC16_IBM standard, polygon code 0x8005
const uint16_t crc_tab16[] = {
  0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241, 0xc601,
  0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440, 0xcc01, 0x0cc0,
  0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40, 0x0a00, 0xcac1, 0xcb81,
  0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841, 0xd801, 0x18c0, 0x1980, 0xd941,
  0x1b00, 0xdbc1, 0xda81, 0x1a40, 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01,
  0x1dc0, 0x1c80, 0xdc41, 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0,
  0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081,
  0x1040, 0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240,
  0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441, 0x3c00,
  0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41, 0xfa01, 0x3ac0,
  0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840, 0x2800, 0xe8c1, 0xe981,
  0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01, 0x2ec0, 0x2f80, 0xef41,
  0x2d00, 0xedc1, 0xec81, 0x2c40, 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700,
  0xe7c1, 0xe681, 0x2640, 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0,
  0x2080, 0xe041, 0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281,
  0x6240, 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
  0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41, 0xaa01,
  0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840, 0x7800, 0xb8c1,
  0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41, 0xbe01, 0x7ec0, 0x7f80,
  0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40, 0xb401, 0x74c0, 0x7580, 0xb541,
  0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101,
  0x71c0, 0x7080, 0xb041, 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0,
  0x5280, 0x9241, 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481,
  0x5440, 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40,
  0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841, 0x8801,
  0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00, 0x8ec1,
  0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41, 0x4400, 0x84c1, 0x8581,
  0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201, 0x42c0, 0x4380, 0x8341,
  0x4100, 0x81c1, 0x8081, 0x4040
};

//! CRC32_Common standard, polygon code 0x04C11DB7
const uint32_t crc_tab32[] = {
  0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
  0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
  0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
  0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
  0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
  0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
  0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
  0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
  0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
  0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
  0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
  0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
  0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
  0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
  0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
  0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
  0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
  0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
  0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
  0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
  0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
  0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
  0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
  0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
  0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
  0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
  0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
  0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
  0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
  0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
  0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
  0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
  0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
  0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
  0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
  0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
  0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
  0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
  0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
  0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
  0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
  0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
  0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};

const uint16_t CRC_INIT   = 0x3AA3;

uint16_t crc16Update(uint16_t crc, uint8_t ch)
{
  uint16_t tmp;
  uint16_t msg;

  msg = 0x00ff & static_cast<uint16_t>(ch);
  tmp = crc ^ msg;
  crc = (crc >> 8) ^ crc_tab16[tmp & 0xff];

  return crc;
}

uint32_t crc32Update(uint32_t crc, uint8_t ch)
{
  uint32_t tmp;
  uint32_t msg;

  msg = 0x000000ffL & static_cast<uint32_t>(ch);
  tmp = crc ^ msg;
  crc = (crc >> 8) ^ crc_tab32[tmp & 0xff];
  return crc;
}

uint16_t crc16Calc(const uint8_t* pMsg, size_t nLen)
{
  size_t   i;
  uint16_t wCRC = CRC_INIT;

  for (i = 0; i < nLen; i++)
  {
    wCRC = crc16Update(wCRC, pMsg[i]);
  }

  return wCRC;
}

uint32_t crc32Calc(const uint8_t* pMsg, size_t nLen)
{
  size_t   i;
  uint32_t wCRC = CRC_INIT;

  for (i = 0; i < nLen; i++)
  {
    wCRC = crc32Update(wCRC, pMsg[i]);
  }

  return wCRC;
}

下面是板载设备激活流程,因为我的key和你不太一样,具体需要自己去读协议

//查询固件版本                 
//回传固件版本,解析版本号                        
//激活 (必须带ID和固件版本)                   
//回传激活成功

如果激活成功后,你就可以和moblie SDK进行通信了,不过你的数据要进行打包封装。接收亦是如此。

好了,基本流程就是这样,主要还是协议那块要自己摸索下。

"Android 大疆无人机二次开发 优快云"这个问题,我理解的是关于如何在 Android 平台上进行大疆无人机二次开发,并且有关于 优快云(中国软件开发网)的资源资料。下面我将用300字回答这个问题。 大疆无人机是一款功能强大的无人机产品,其提供了 Android SDK 供开发者进行二次开发。开发者可以利用这个 SDK,通过编写 Android 应用程序,实现与大疆无人机的交互控制。 在二次开发之前,我们可以在 优快云 上搜索学习相关的资源资料,帮助我们更好地理解掌握大疆无人机的开发。 首先,我们可以在 优快云 上找到大疆无人机相关的博文、教程开发者分享的经验,从而了解无人机开发的基础知识技术要求。同时,优快云 还有一些专门的板块、论坛社区,可以与其他开发者进行交流讨论,获取更多的经验指导。 其次,在 优快云 上还可以获取到大疆无人机开发 SDK 的相关信息,包括如何引入、配置使用 SDK 的步骤文档。这些文档示例代码可以帮助我们迅速上手,并且理解无人机的控制命令数据交互方式。 最后,优快云 上还有一些开发者发布的项目应用程序,例如无人机的飞行控制、图像处理、路径规划等方面的工具库。我们可以参考这些项目,加速我们的开发进程,并在实际应用中做出一些优化扩展。 总之,Android 大疆无人机二次开发可以通过在 优快云 上查找相关资源资料来支持帮助。我们可以从基础知识入手,通过学习文档示例代码,掌握无人机的开发技术。同时,与其他开发者交流分享经验,可以更好地提高我们的开发水平解决问题的能力。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值