树莓派4B连接大疆M300无人机全网最细教程

树莓派4B连接大疆M300无人机全网最细教程

:本教程适用于树莓派4B连接大疆M300_RTK无人机,若是其余型号可以参考本文思路,但是具体细节请前往官方教程大疆开发者论坛查找,第三方开发板连接大疆无人机,不同型号之间会有很多细节差异,请确认自己的型号然后针对性查找

官方教程网址:Payload SDK (官方的是树莓派4B连接M350!并非M300,实现细节完全不同,请慎重查看)

大疆开发者论坛网址:Payload SDK – 大疆创新SDK技术支持论坛 (优点:几乎能找到所有问题的解决方法;缺点:太零散了,找解决方法如同大海捞针)

1 硬件准备

1.1 硬件选型

  • 无人机型号:M300_RTKM300顶部一共有三个接口,其中OSDK端口和云台口(Payload SDK Port)可以用来运行PSDK程序,TypeC调参口,则是用来与电脑连接,打开DJI Assistant2软件后,可以升级无人机固件,导出日志,使用模拟器,绑定负载等。
在这里插入图片描述
1.FPV摄像头13.左视和右视红外感知系统25.调参接口
2.前视红外感知系统14.左视和右视视觉系统26.OSDK接口
3.前视视觉系统15.智能飞行电池27.PSDK接口
4.云台接口16.电池电量指示灯28.下视红外感知系统
5.云台相机解锁按钮17.电池电量按键29.下视视觉系统
6.机臂18.D-RTK2天线30.下视补光灯
7.电机19.飞行器状态指示灯31.下视夜航灯
8.螺旋桨20.上视夜航灯32.后视红外感知系统
9.电调LED指示灯21.电源按键/指示灯33.后视视觉系统
10.图传天线22.上视红外感知系统34.电池锁紧旋钮
11.起落架23.上视补光灯35.云台相机
12.防尘网24.上视视觉系统36.无线上网卡接口
  • 第三方开发板:Raspberry Pi 4B(树莓派4B)
在这里插入图片描述
  • 大疆开发套件: E-Port 开发者套件
在这里插入图片描述

注:左侧开关,靠近接口侧为off,反之为on;右侧USB主/从设备切换,靠近接口侧位host,反之为device

  • 其余设备:除上面的设备外,还需要下面的设备用于连线

USB-TTL(CH340):某些树莓派的串口性能较差,建议使用USB转TTL模块连接串口

在这里插入图片描述

XT30转TypeC线:E-Port开发套件配套的,用于树莓派供电

在这里插入图片描述

TypeA-TypeC数据线:必须是数据线,需要能够传输数据

在这里插入图片描述

E-Port同轴线:E-Port开发套件配套的

在这里插入图片描述

1.2 硬件连接

  1. 树莓派连接USB-TTL线:TypeA端插入树莓派的USB3.0协议插口(见1.1中的树莓派示意图)

E-Port开发板连接USB-TTL线:连接的引脚分别为RX->TXTX->RXGND->GND,该线主要用于uart数据传输(速度较慢)各串口见下图(也可查看1.1中的 E-Port 开发者套件示意图)

在这里插入图片描述

连线效果见下图,注意RX与TX不要接反了

在这里插入图片描述

连接E-Port同轴线:同轴线的typec插入E-Port开发板的E-Port接口(见1.1中的E-Port 开发者套件示意图),B标识朝上

在这里插入图片描述
在这里插入图片描述
  1. 最终连线效果:将E-Port开发板的开关拨至ON,USB主/从设备切换拨至device,M300无人机做Device从设备,开发板做Host主设备,仅能通过此方式,不要搞成官网教程上的了。启动无人机后,开发板的指示灯会发出绿光,若没亮,检查开关是否拨至ON。

E-Port开发板接入M300无人机:同轴线另一端的A标识朝无人机内部插入OSDK端口(见1.1无人机示意图)PSDK 3.x版本集OSDK,PSDK功能与一体,比OSDK 4.1版本要轻量很多,而且结构更加清晰易懂(信息来源:PSDK 3.x系列文档目录 – 大疆创新SDK技术支持论坛)。这就是为啥我们使用PSDK,会连接在OSDK接口上。而psdk接口通常用于接入专用的PSDK负载,比如Skyport这种。

在这里插入图片描述

**使用TypeA-TypeC数据线,连接E-Port开发板与树莓派:**该线主要用于bulk数据传输(高速)TypeA端接入树莓派的USB2.0接口,TypeC端接入E-Port开发板的USB2.0接口(见1.1中的E-Port开发板示意图)

在这里插入图片描述

使用XT30转TypeC线连接树莓派: 该线主要用于树莓派供电树莓派4B通常使用5V/2A电源供电,E-Port开发板的5V/2A输出接口(见1.1E-Port开发板示意图)连接XT30转TypeC线,见下图

在这里插入图片描述

将XT30转TypeC线接入树莓派4B的TypeC电源接口,见下图

在这里插入图片描述
在这里插入图片描述

至此硬件连线完成,后面我们会在软件部分对线路连接是否成功进行验证。

硬件连接参考教程:PSDK 各机型硬件连接介绍 – 大疆创新SDK技术支持论坛

2 软件准备

PSDK版本:psdk3.11.0,下载地址:dji-sdk/Payload-SDK at release/v3.11.0

PSDK连接模式:DJI_USE_UART_AND_USB_BULK_DEVICE

注: 连接M300无人机最高只能用psdk3.11.0,再往上的版本就无法正常获取相机码流了,因为这个被坑了好长时间!!

2.1 环境下载

安装libusb

sudoapt-getinstall libusb-1.0-0-dev 

安装opecv 3.4.15下载地址:https://opencv.org/releases/

sudoaptinstall libgtk2.0-dev pkg-config #必须安装这个,后续才能使用psdk3.11.0正常订阅相机码流unzip opencv-3.4.15.zip cd opencv-3.4.15/ mkdir build &&cd build/ cmake ../ make -j4 &&sudomakeinstall opencv_version 

opencv打包和安装时间较长,请耐心等待,另外gcc版本过高的话,打包opencv时会出现源代码语法错误,去源文件修改一下重新打包就行了,错误信息如下:

/home/pi/opencv-3.4.15/modules/core/src/persistence_base64.cpp:167:31: error: comparing the result of pointer addition 鈥?src + ((sizetype)off))鈥?and NULL [-Werror=address] 167 | if (src == 0 || src + off == 0) | ~~~~~~~~^~

修改modules/core/src/persistence_base64.cpp 第 167 行

if(src ==0|| src + off ==0) #改成下面的 if(src ==0|| off ==0) #然后重新打包即可 

安装ffmpeg-4.3下载ffmpeg压缩包(https://ffmpeg.org/releases/ffmpeg-4.3.2.tar.gz)

tar -zxvf ffmpeg-4.3.2.tar.gz ./configure --enable-shared make -j4 sudomakeinstall

安装opus-1.3.1在官网(https://opus-codec.org/)下载opus-1.3.1.tar.gz

tar -xzvf opus-1.3.1.tar.gz cd opus-1.3.1/ autoreconf -f -i ./configure make -j4 &&sudomakeinstall

安装libaio

sudoapt-getinstall automake sudoapt-getinstall libaio-dev 

安装GCC/G++工具:

sudoaptinstall gcc g++ -y gcc -v#安装成功会显示版本信息

安装CMake:

sudoaptinstall cmake 

更新树莓派软件仓库由于树莓派默认使用外网镜像下载,因此速度比较慢,建议先自行配置树莓派镜像

sudoapt-get update sudoapt-get upgrade 

2.2 开启树莓派USB能力

Linux设备往往是通用性设备,没有专门为某个功能设计的USB驱动芯片,因此需要通过软件实现UDC功能。Linux USB gadget是Linux环境下的UDC实现。在树莓派中启用USB Gadget,可以让树莓派充当USB设备。通过USB Gadget中的g_multi、g_ether、g_zero、g_audio、g_serial等模块,可以轻松实现USB网卡、串口、键盘、鼠标等功能。当然,除了使用已存在的Gadget模块,还可以通过configfs(functionfs)的方式自定义实现USB设备的定义,配置设备的基础属性和功能,具有很强大的扩展性。

本文脚本是在官方教程的开启bulk脚本基础上进行的修改(Payload SDK),参考了论坛上的一篇教程(树莓派4B配置USB device RNDIS 和 BULK – 大疆创新SDK技术支持论坛)

修改树莓派USB device配置文件修改/boot/firmware/config.txt(有些教程是喊修改/boot/config.txt,但我的系统里的这个文件里提示去/boot/firmware/config.txt文件修改)在文件末尾添加

dtoverlay=dwc2 

注:原有的dtoverlay=vc4-kms-v3d不要删除,会导致图形化界面无法启动修改/boot/firmware/cmdline.txt(理由同上)在rootwait后面加上

modules-load=dwc2 

/etc/modules文件末尾添加

libcomposite 

重新编译start_bulk程序压缩包里有一个start_bulk可执行程序,但并不是所有系统都能使用,因此需要用户自己重新编译一个

cd usb-bulk-configuration-reference make clean make

得到start_bulk可执行文件

关于编译startup_bulk.c文件,有些平台编译可能会报错htole32,htole16没有,按照下面的方式进行解决

a.安装依赖

sudoaptinstall libaio-dev build-essential 

b.编写fix_endian.h头文件

/* fix_endian.h */#if__BYTE_ORDER == __LITTLE_ENDIAN#definecpu_to_le32(x)(x)#definecpu_to_le16(x)(x)#else#definecpu_to_le32(x)\((((x)&0xff000000u)>>24)|(((x)&0x00ff0000u)>>8)|\(((x)&0x0000ff00u)<<8)|(((x)&0x000000ffu)<<24))#definecpu_to_le16(x)((((x)>>8)&0xffu)|(((x)&0xffu)<<8))#endif

c.在startup_bulk.c顶部引入头文件

#include"fix_endian.h"

d.批量替换旧关键字

sed -i 's/\bhtole32\b/cpu_to_le32/g; s/\bhtole16\b/cpu_to_le16/g' startup_bulk.c 

e.重新编译

make clean make

此时应该会出现一个新的start_bulk可执行文件,在之后的脚本中会调用该程序

下载官方start_bulk包链接:https://terra-1-g.djicdn.com/71a7d383e71a4fb8887a310eb746b47f/psdk/e-port/usb-bulk-configuration-reference.zip传入树莓派中,并使用unzip指令进行解压

unzip usb-bulk-configuration-reference.zip 

注:上述配置修改完成后,重启树莓派刷新配置!!!
4. 编写raspi-usb-device-start.sh脚本,用于配置gadget

  • PSDK大致原理是通过linux gadget来驱动USB bulk,然后PSDK来通过functionFS来调用驱动。
  • 该脚本是在官网教程的脚本基础上进行的修改,更加适配psdk3.11.0的版本,脚本中的config.txt、cmdline.txt根据自己系统的实际路径修改。我使用的psdk3.11.0,连接模式为DJI_USE_UART_AND_USB_BULK_DEVICE,只需要开启enable_bulk即可,因此enable_bulk=1其余为0,若要开启其他功能,设置为1即可。
  • 官方教程里的脚本生成了三个/dev/usb-ffs/bulk,而psdk3.11.0,只需要两个即可,因此无需多生成一个
  • 在该脚本中会先检测第三步中的配置是否添加,若未添加则进行配置添加并重启树莓派
#!/bin/bash # The IP address shared by all USB network interfaces created by this script. net_ip=192.168.42.120 # The associated netmask. net_mask=255.255.0.0 enable_vcom=0 enable_rndis=0 enable_bulk=1 startup_bulk_dir=$(dirname "$0") startup_bulk_exe=${startup_bulk_dir}/startup_bulk echo startup_bulk_exe if [ ! -d /sys/kernel/config/usb_gadget ]; then if ! $(grep -q dtoverlay=dwc2 /boot/firmware/config.txt) ; then echo -e "\n\n\n## customized\n# for op-sdk enable USB device RNDIS\n[all]\ndtoverlay=dwc2" >> /boot/firmware/config.txt init 6 fi if ! $(grep -q modules-load=dwc2 /boot/firmware/cmdline.txt) ; then sed -i 's/rootwait /&modules-load=dwc2 /' /boot/firmware/cmdline.txt init 6 fi if ! $(grep -q libcomposite /etc/modules) ; then echo -e "\n\n\n## customized\n# for op-sdk enable USB device RNDIS\nlibcomposite" >> /etc/modules init 6 fi exit 1 fi modprobe g_ether rmmod g_ether sleep 1 #写入gadget配置文件 if [ ! -d /sys/kernel/config/usb_gadget/pi4 ]; then mkdir -p /sys/kernel/config/usb_gadget/pi4 cd /sys/kernel/config/usb_gadget/pi4 echo 0x2ca3 > idVendor # Linux Foundation echo 0xF001 > idProduct # Multifunction Composite Gadget if [ ${enable_vcom} -eq 1 ]; then echo 0xF002 > idProduct # Multifunction Composite Gadget fi if [ ${enable_rndis} -eq 1 ]; then echo 0xF003 > idProduct # Multifunction Composite Gadget fi if [ ${enable_bulk} -eq 1 ]; then echo 0xF001 > idProduct # Multifunction Composite Gadget fi echo 0x0001 > bcdDevice # v1.0.0 echo 0x0200 > bcdUSB # USB2 echo 0xEF > bDeviceClass echo 0x02 > bDeviceSubClass echo 0x01 > bDeviceProtocol mkdir -p strings/0x409 echo "psdk-rpi4b" > strings/0x409/serialnumber echo "raspberry" > strings/0x409/manufacturer echo "PI4" > strings/0x409/product cfg=configs/c.1 mkdir -p "${cfg}" echo 0x80 > ${cfg}/bmAttributes echo 250 > ${cfg}/MaxPower if [ ${enable_rndis} -eq 1 ]; then cfg_str="${cfg_str}+RNDIS" func=functions/rndis.usb0 mkdir -p "${func}" ln -sf "${func}" "${cfg}" # Informs Windows that this device is compatible with the built-in RNDIS # driver. This allows automatic driver installation without any need for # a .inf file or manual driver selection. echo 1 > os_desc/use echo 0xcd > os_desc/b_vendor_code echo MSFT100 > os_desc/qw_sign echo RNDIS > "${func}/os_desc/interface.rndis/compatible_id" echo 5162001 > "${func}/os_desc/interface.rndis/sub_compatible_id" ln -sf "${cfg}" os_desc fi if [ ${enable_vcom} -eq 1 ]; then cfg_str="${cfg_str}+ACM0" func=functions/acm.gs0 mkdir -p "${func}" ln -sf "${func}" "${cfg}" fi if [ ${enable_bulk} -eq 1 ]; then mkdir -p /dev/usb-ffs cfg_str="${cfg_str}+BULK1" mkdir -p /dev/usb-ffs/bulk1 func=functions/ffs.bulk1 mkdir -p "${func}" ln -sf "${func}" "${cfg}" mount -o mode=0777,uid=2000,gid=2000 -t functionfs bulk1 /dev/usb-ffs/bulk1 cfg_str="${cfg_str}+BULK2" mkdir -p /dev/usb-ffs/bulk2 func=functions/ffs.bulk2 mkdir -p "${func}" ln -sf "${func}" "${cfg}" mount -o mode=0777,uid=2000,gid=2000 -t functionfs bulk2 /dev/usb-ffs/bulk2 #cfg_str="${cfg_str}+BULK3" #mkdir -p /dev/usb-ffs/bulk3 #func=functions/ffs.bulk3 #mkdir -p "${func}" #ln -sf "${func}" "${cfg}" #mount -o mode=0777,uid=2000,gid=2000 -t functionfs bulk3 /dev/usb-ffs/bulk3 fi mkdir -p "${cfg}/strings/0x409" echo "${cfg_str:1}" > "${cfg}/strings/0x409/configuration" # cd - fi if [ ${enable_bulk} -eq 1 ]; then if [ ! -f ${startup_bulk_exe} ]; then cd ${startup_bulk_dir} make && ( $? != 0 ) && ( exit 1 ) cp startup_bulk ${startup_bulk_dir}/startup_bulk #make clean cd - fi ${startup_bulk_exe} /dev/usb-ffs/bulk1 & sleep 1 ${startup_bulk_exe} /dev/usb-ffs/bulk2 & sleep 1 #${startup_bulk_exe} /dev/usb-ffs/bulk3 & #sleep 1 fi udevadm settle -t 5 || : ls /sys/class/udc > UDC if [ ${enable_rndis} -eq 1 ]; then /sbin/brctl addbr pi4br0 /sbin/ifconfig pi4br0 ${net_ip} netmask ${net_mask} up /sbin/brctl addif pi4br0 usb0 /sbin/ifconfig usb0 down /sbin/ifconfig usb0 up fi exit 0 
    • 使用TypeA-TypeC数据线,连接树莓派的电源typeC接口,然后接入电脑的USB接口
  1. 配置脚本自启动由于每次启动都需要启动脚本来开启bulk功能,因此建议配置一个脚本自启动服务,有很多配置方式,这里我就讲我是如何配置的至此树莓派USB能力开启完成!

激活该服务

sudo systemctl enable bulk-gadget 

然后重启树莓派,再次进行上面第五步或第六步的验证,查看脚本是否执行即可

写入下列内容ExecStart的值为raspi-usb-device-start.sh所在的路径,请根据实际情况修改

[Unit]Description=Start PSDK USB bulk gadget After=sysinit.target DefaultDependencies=no [Service]Type=oneshot RemainAfterExit=yes ExecStart=/home/pi/program/start_bulk/raspi-usb-device-start.sh StandardOutput=journal StandardError=journal User=root [Install]WantedBy=sysinit.target 

创建系统服务

sudonano /etc/systemd/system/bulk-gadget.service 

使用VID和PID查看USB详细信息ubuntu虚拟机执行指令

sudo lsusb -d 2ca3:f001 -v 

会出现下列格式的信息

Bus 001 Device 003: ID 2ca3:f001
Device Descriptor:

idVendor 0x2ca3 #VID
idProduct 0xf001 #PID

Configuration Descriptor:

iConfiguration 4 BULK1+BULK2 #这里可以看出有两个bulk

Interface Descriptor:

bInterfaceNumber 0

bInterfaceClass 255 Vendor Specific Class

Endpoint Descriptor:

bEndpointAddress 0x81 EP 1 IN

Endpoint Descriptor:

bEndpointAddress 0x01 EP 1 OUT

Interface Descriptor:

bInterfaceNumber 1

bInterfaceClass 255 Vendor Specific Class

Endpoint Descriptor:

bEndpointAddress 0x82 EP 2 IN

Endpoint Descriptor:

bEndpointAddress 0x02 EP 2 OUT

Device Qualifier (for other device speed):

上述所有bInterfaceClass为255 Vendor Specific Class,即为后续我们要填入psdk配置文件中的设备信息,请记住上面加粗的数据项(bInterfaceNumber、bEndpointAddress、bEndpointAddress)

电脑上开启ubuntu虚拟机,并扫描树莓派设备ubuntu虚拟机执行指令

lsusb 

执行结果

在这里插入图片描述

可以看到新出现了一个USB设备,这个就是树莓派USB设备信息,2ca3:f001,分别对应了该设备的VID,PID,这个值其实是raspi-usb-device-start.sh脚本中写死的,大家可以自行修改

查看树莓派USB device信息

在这里插入图片描述

启动脚本

chmod777 raspi-usb-device-start.sh 

使用指令进行验证

ps -ef |grep startup_bulk 

结果如下,说明脚本执行成功

在这里插入图片描述

2.3 验证线路连接

完成1.1的硬件连接后,启动无人机,并将开关拨至ON,USE主/从切换至device,再连接树莓派,进入终端

验证TypeA-TypeC数据线,连接E-Port开发板与树莓派

ls /dev/tty* 

若出现了/dev/ttyACM0则说明USB-TTL线连接成功,ttyACM0为M300无人机->E-Port开发板->树莓派4B所特有的,插上之后才会出现

验证USB-TTL线是否连接成功

ls /dev/tty* 

若出现了/dev/ttyUSB0则说明USB-TTL线连接成功执行指令

lsusb 

也会出现USB-TTL的信息

Bus 001 Device 012: ID 1a86:7523 QinHeng Electronics CH340 serial converter

3 启动PSDK

下载psdk3.11.0压缩包(链接:https://github.com/dji-sdk/Payload-SDK/tree/release/v3.11.0 ),将压缩包传入树莓派中并完成解压

本教程以c++样例代码为例,若想启动c代码,将sample_c++修改为sample_c即可

先在大疆开发者网站上进行注册,申请成为 PSDK 开发者,并创建应用,获取应用信息。

注:app名称不要太长,我最开始的应用名长度为十七个字,启动应用时会提示报错信息过长,改为四个字后才正常运行

3.1 配置用户信息

修改samples/sample_c++/platform/linux/manifold2/application/dji_sdk_app_info.h

(官网教程修改的是raspberry_pi,而psdk3.11.0没有这个目录,我们修改manifold2目录下的文件即可,这个是妙算2平台的,同样适用于树莓派)

#defineUSER_APP_NAME"your_app_name"#defineUSER_APP_ID"your_app_id"#defineUSER_APP_KEY"your_app_key"#defineUSER_APP_LICENSE"your_app_license"#defineUSER_DEVELOPER_ACCOUNT"your_developer_account"#defineUSER_BAUD_RATE"921600"

将开发者网站上的应用信息填入上述位置,USER_DEVELOPER_ACCOUNT就是你的登录邮箱

关于USER_BAUD_RATE的选择,使用921600即可,可适用于所有无人机型号,详细可见下表

无人机串口波特率/bps
M350 RTK11520、230400、460800、921600、1000000
M300 RTK11520、230400、460800、921600、1000000
M30/M30T11520、230400、460800、921600、1000000
M3D/M3TD921600
M3E/M3T921600

表格来源:《无人机应用开发指南:基于大疆Payload SDK》

3.2 配置硬件连接方式

修改samples/sample_c++/platform/linux/manifold2/application/dji_sdk_config.h

本文主要以DJI_USE_UART_AND_USB_BULK_DEVICE模式为主,其余模式请自行查询资料,另外M300 OSDK端口仅支持DJI_USE_

ONLY_UART、DJI_USE_UART_AND_USB_BULK_DEVICE

#defineDJI_USE_ONLY_UART(0)#defineDJI_USE_UART_AND_USB_BULK_DEVICE(1)#defineDJI_USE_UART_AND_NETWORK_DEVICE(2)#defineDJI_USE_ONLY_USB_BULK_DEVICE(3)#defineDJI_USE_ONLY_NETWORK_DEVICE(4)/*!< Attention: Select your hardware connection mode here. * */#defineCONFIG_HARDWARE_CONNECTIONDJI_USE_UART_AND_USB_BULK_DEVICE

不同机型端口所支持的PSDK链路情况:PSDK 各机型硬件连接介绍 – 大疆创新SDK技术支持论坛

3.3 修改UART配置文件

修改samples/sample_c++/platform/linux/manifold2/hal/hal_uart.h

使用E-Port开发板只需修改下面的内容即可,DEV1为USB-TTL线的USB路径,DEV2为TypeA-TypeC数据线的USB路径,可查看2.3 验证线路连接进行查看

//User can config dev based on there environmental conditions#defineLINUX_UART_DEV1"/dev/ttyUSB0"#defineLINUX_UART_DEV2"/dev/ttyACM0"

关于DEV2,这个是M300才需要配置的,其他机型可以不用处理,M300会用到USB的通道作为串口功能使用,因此需要配置额外的UART端口。

M300机型建议DEV1 DEV2均连接,如果有使用E-Port拓展板,需要把拨码开关拨到Device(唯一配置,M300不支持Host),此时飞机做Device,设备做Host设备,连接方式:飞机->同轴线->E-port拓展板(拨码开关为Device) -> TypeC -> 设备USBA。

以上信息来源:PSDK如何配置串口端口 – 大疆创新SDK技术支持论坛

3.4 修改bulk配置文件

修改samples/sample_c++/platform/linux/manifold2/hal/hal_usb_bulk.h

#defineLINUX_USB_BULK1_EP_IN_FD"/dev/usb-ffs/bulk1/ep1"//修改为2.2中树莓派上查看到的值#defineLINUX_USB_BULK1_EP_OUT_FD"/dev/usb-ffs/bulk1/ep2"//同上#defineLINUX_USB_BULK1_INTERFACE_NUM(0)//修改为2.2中Ubuntu查看的bInterfaceNumber的值#defineLINUX_USB_BULK1_END_POINT_IN(0x81)//修改为2.2中的bEndpointAddress的值#defineLINUX_USB_BULK1_END_POINT_OUT(0x01)//修改为2.2中的bEndpointAddress的值#defineLINUX_USB_BULK2_EP_IN_FD"/dev/usb-ffs/bulk2/ep1"#defineLINUX_USB_BULK2_EP_OUT_FD"/dev/usb-ffs/bulk2/ep2"#defineLINUX_USB_BULK2_INTERFACE_NUM(1)#defineLINUX_USB_BULK2_END_POINT_IN(0x82)#defineLINUX_USB_BULK2_END_POINT_OUT(0x02)#defineLINUX_USB_VID(0x2CA3)//修改为2.2中的VID值#defineLINUX_USB_PID(0xF001)//修改为2.2中的PID值

上面的信息不要改错了,否则会导致无法获取无人机数据

3.5 编译运行

先修改CMakeLists.txt

if (USE_SYSTEM_ARCH MATCHES LINUX) add_definitions(-DSYSTEM_ARCH_LINUX) add_subdirectory(samples/sample_c/platform/linux/manifold2)#路径修改成这个 add_subdirectory(samples/sample_c++/platform/linux/manifold2) 

再进行编译

cd Payload-SDK/ mkdir build &&cd build cmake ../ &&make -j4 

执行程序

sudo ./dji_sdk_demo_linux_cxx 

若成功运行,则会出现下面的内容

'Logs/latest.log' ->'DJI_0009_20251210_16-34-36.log'[0.024][core]-[Info]-[DjiCore_Init:107) Payload SDK Version : V3.11.0-beta.0-build.2206 Mar 12202512:41:40 [3.237][utils]-[Info]-[DjiSdkVersionAck_Parse:183) Identify aircraft serial number = 1ZNBJ8700C019S, Firmware =3.4.18.68 [3.242][adapter]-[Info]-[DjiAccessAdapter_Init:314) Identify aircraft series is Matrice 300 Series [3.242][adapter]-[Info]-[DjiAccessAdapter_Init:353) Identify mount position type is Extension Port Type [3.270][adapter]-[Info]-[DjiAccessAdapter_Init:475) Identity uart0 baudrate is 921600 bps [3.270][adapter]-[Info]-[DjiPayloadNegotiate_Init:134) No need negotiate device info [4.434][core]-[Info]-[DjiIdentityVerify_UpdatePolicy:493) Updating dji sdk policy file... [5.434][core]-[Info]-[DjiIdentityVerify_UpdatePolicy:501) Update dji sdk policy file successfully [5.438][core]-[Info]-[DjiCore_Init:169) Identify AircraftType = Matrice 300 RTK, MountPosition = Extension Port, SdkAdapterType = None [5.475][core]-[Info]-[DjiCore_SetAlias:186) Set alias: PSDK_APPALIAS [5.475][gimbal]-[Error]-[DjiGimbal_Init:205) Can't support this function [5.476][user]-[Error]-[DjiTest_GimbalStartService:154) init gimbal module error: 0x000000E0 [5.476][user]-[Error]-[DjiUser_ApplicationStart:316) psdk gimbal init error [5.983][user]-[Info]-[SetVolume:583) Set widget speaker volume: 60 [5.983][user]-[Warn]-[SetVolume:601) No audio device found, please add audio device and init speaker volume here!!! [10.985][core]-[Info]-[DjiCore_ApplicationStart:247) Start dji sdk application [10.985][user]-[Info]-[DjiUser_ApplicationStart:363) Application start. | Available commands: | | [0] Fc subscribe sample - subscribe quaternion and gps data | | [1] Flight controller sample - you can control flying by PSDK | | [2] Hms info manager sample - get health manger system info by language | | [a] Gimbal manager sample - you can control gimbal by PSDK | | [c] Camera stream view sample - display the camera video stream | | [d] Stereo vision view sample - display the stereo image | | [e] Run camera manager sample - you can test camera's functions interactively ||[f] Start rtk positioning sample - you can receive rtk rtcm data when rtk signal is ok |
[5.475][gimbal]-[Error]-[DjiGimbal_Init:205) Can’t support this
function [5.476][user]-[Error]-[DjiTest_GimbalStartService:154) init
gimbal module error: 0x000000E0
[5.476][user]-[Error]-[DjiUser_ApplicationStart:316) psdk gimbal init
error

以上错误信息是正常情况,这是因为M300 RTK OSDK接口仅有psdk中的部分功能,有些功能无法使用,因此报这个错误,不影响其他功能的使用。M300 RTK OSDK接口支持 数据订阅、相机管理、云台管理、电源管理、飞行控制、自定义控件、自定义HMS 功能、HMS 管理功能、低速数据传输、获取相机码流、SDK互联互通、运动规划、喊话器控件等功能,信息来源:init gimbal module error: 0x000000E0 – 大疆创新SDK技术支持论坛

之后就可以向官方教程那样使用样例程序里面的功能啦,飞行控制的话,可以使用数据线通过无人机调参接口(见1.1无人机示意图)将无人机与电脑直接相连,然后启动DJI Assistant 2 (Enterprise Series) 2.1.20中的模拟飞行,来进行测试

参考链接:1.3 DJI 无人机与调参仿真软件 – DJI Assistant2 – 大疆创新SDK技术支持论坛

常见问题

(1)如果串口性能不佳,有可能出现“protocol frame crc8 error”警告。少量的警告可以忽略。如 果该警告大量出现,可以使用性能更强的USB-TTL,或者更换质量更好、长度更短的串口线。

(2)如果提示“DjiAccessAdapter_IsUartConnect,returnCode=236”错误,说明负载端的串口设备 连接存在问题,可以尝试检查串口功能是否开启,USB-TTL设备是否正常。

(3)如果提示“Try identify UART0 connection failed.Probably because SDK adapter or aircraft not finish init or UART connect error.”错误,说明无人机端的串口设备连接存在问题,可以检查无人机 是否开机、E-Port等转接板是否开机,以及接线是否正常。

(4)若出现无法订阅相机码流功的情况,【成功运行了c++示例程序,并且功能0可以成功订阅到一些数据显示出来,但是关于视频的功能c→0→1,无法像文档中展示的那样弹出一个显示视频画面的窗口,停留在终端等待按q退出】,降低psdk版本即可,一开始我使用的psdk3.14.0一直无法成功订阅,在降低到psdk3.11.0之后就可以正常订阅了

附录

Read more

RUST异步微服务架构的最佳实践与常见反模式

RUST异步微服务架构的最佳实践与常见反模式

RUST异步微服务架构的最佳实践与常见反模式 一、项目优化前的问题分析 1.1 任务调度不合理 💡在第21篇项目中,用户同步服务的任务调度使用了Cron调度器,但Cron调度器的精度有限,可能导致任务执行延迟。此外,任务的并发度没有配置,可能导致任务积压。 1.2 I/O资源限制不足 订单处理服务的TCP连接队列大小没有配置,可能导致连接失败。数据库连接池的大小没有配置,可能导致数据库连接耗尽。 1.3 同步原语使用不当 实时监控服务中,Redis连接没有使用连接池,可能导致连接开销过大。任务结果的处理没有使用批量操作,可能导致上下文切换过多。 1.4 错误处理不完善 任务失败的处理逻辑不够完善,没有进行任务重试和错误统计。服务之间的通信没有进行超时管理和错误处理。 二、异步架构设计模式的应用 2.1 命令查询分离(CQS) CQS是一种架构设计模式,将系统的操作分为命令和查询两种类型。命令用于修改系统状态,查询用于获取系统状态,两者互不干扰。 在项目中,我们可以将用户同步任务视为命令操作,将系统状态查询视为查询操作: // 用户同步任务(

By Ne0inhk
新能源汽车电子架构革命:深度解析AUTOSAR标准与实践

新能源汽车电子架构革命:深度解析AUTOSAR标准与实践

新能源汽车电子架构革命:深度解析AUTOSAR标准与实践(附完整技术图谱) 引言:软件定义汽车时代的破局之道 在特斯拉FSD芯片算力突破72TOPS、华为ADS 2.0实现城市高阶智驾的今天,一场围绕汽车"大脑"的战争正在悄然打响。传统分布式电子架构已逼近物理极限,而集中式EE架构的进化离不开底层软件的革新——这就是AUTOSAR标准诞生的时代背景。本文将从技术原理、工程实践、未来趋势三个维度,为您揭开智能汽车灵魂的神秘面纱。 目录 * 第一章 AUTOSAR的前世今生:汽车软件革命的序章 * 第二章 技术解密:AUTOSAR的三层架构精要 * 第三章 工程实践:AUTOSAR落地全流程详解 * 第四章 进阶应用:新能源汽车场景实践 * 第五章 未来趋势:AUTOSAR的进化之路 * 结语:站在软件定义汽车的十字路口 第一章 AUTOSAR的前世今生:汽车软件革命的序章 1.1 行业困局:当摩尔定律遇见机械工业 (插入图表:2010-2025年汽车ECU数量增长曲线) 传统架构痛点解析: 硬件依赖症:

By Ne0inhk
【MYSQL】MYSQL学习的一大重点:MYSQL库的操作

【MYSQL】MYSQL学习的一大重点:MYSQL库的操作

🎬 个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬 艾莉丝的简介: 文章目录 * 0 ~> 实际场景:创建和删除数据库 * 0.1 创建方式1 * 0.2 创建方式2 * 0.3 创建方式3 * 1 ~> 数据库的编码集 * 1.1 目前整个数据库支持的字符集 * 1.2 目前整个数据库支持的字符集 * 1.3 UTF-8需要设置配置文件 * 1.4 MySQL 中与字符集排序规则(

By Ne0inhk
IoTDB AINode 实战指南:SQL 原生时序 AI 建模,毫秒级预测 / 异常检测落地

IoTDB AINode 实战指南:SQL 原生时序 AI 建模,毫秒级预测 / 异常检测落地

IoTDB AINode 实战指南:SQL 原生时序 AI 建模,毫秒级预测 / 异常检测落地 AINode 作为 IoTDB 原生时序 AI 节点,内置 Timer 系列等业界领先时序大模型,支持通过标准 SQL 语句完成模型注册、管理与推理全流程,无需 Python/Java 编程,更无需迁移 IoTDB 存储的数据。本文详细拆解 AINode 的核心优势、模型注册 / 调用 / 权限管理等关键操作,结合电力负载预测、变电站电压预测、民航旅客异常检测三大工业级案例,手把手演示如何通过简单 SQL 实现时序数据的趋势预测、缺失值填补与异常识别,助力开发者快速落地毫秒级实时时序 AI 应用。 AINode 是支持时序相关模型注册、管理、调用的 IoTDB

By Ne0inhk