树莓派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 硬件连接
- 树莓派连接USB-TTL线:TypeA端插入树莓派的USB3.0协议插口(见1.1中的树莓派示意图)
E-Port开发板连接USB-TTL线:连接的引脚分别为RX->TX、TX->RX、GND->GND,该线主要用于uart数据传输(速度较慢)各串口见下图(也可查看1.1中的 E-Port 开发者套件示意图)
连线效果见下图,注意RX与TX不要接反了
连接E-Port同轴线:同轴线的typec插入E-Port开发板的E-Port接口(见1.1中的E-Port 开发者套件示意图),B标识朝上
- 最终连线效果:将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 环境下载
- 树莓派系统:Raspberry PI OS(64-bit)通过官方烧录工具Raspberry Pi Imager正常烧录即可,参考教程:开始使用树莓派:给树莓派安装操作系统 | 树莓派实验室
安装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))#endifc.在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接口
- 配置脚本自启动由于每次启动都需要启动脚本来开启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 RTK | 11520、230400、460800、921600、1000000 |
| M300 RTK | 11520、230400、460800、921600、1000000 |
| M30/M30T | 11520、230400、460800、921600、1000000 |
| M3D/M3TD | 921600 |
| M3E/M3T | 921600 |
表格来源:《无人机应用开发指南:基于大疆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之后就可以正常订阅了
附录
- PSDK开发常用参考文章链接:PSDK常用参考文章 – 大疆创新SDK技术支持论坛