树莓派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

AirSim无人机仿真入门(一):实现无人机的起飞与降落

AirSim无人机仿真入门(一):实现无人机的起飞与降落

概述: 安装好所需要的软件和环境,通过python代码控制无人机进行起飞和降落。 参考资料: 1、知乎宁子安大佬的AirSim教程(文字教程,方便复制) 2、B站瑜瑾玉大佬的30天RL无人机仿真教程(视频教程,方便理解) 3、AirSim官方手册(资料很全,不过是纯英文的) AirSim无人机仿真入门(一):实现无人机的起飞与降落 * 1 安装AirSim * 1.1 参考教程 * 1.2 内容梳理 * 1.3 步骤总结 * 2 开始使用 AirSim * 2.1 参考教程 * 2.2 内容梳理 * 2.3 步骤总结 * 3 撰写python控制程序 * 3.1 参考教程 * 3.2 内容梳理

By Ne0inhk

OpenClaw 安装 + 接入飞书机器人完整教程

OpenClaw 安装 + 接入飞书机器人完整教程 OpenClaw 曾用名:ClawdBot → MoltBot → OpenClaw(同一软件,勿混淆) 适用系统:Windows 10/11 最后更新:2026年3月 一、什么是 OpenClaw? OpenClaw 是一款 2026 年爆火的开源个人 AI 助手,GitHub 星标已超过 10 万颗。 与普通 AI 聊天机器人的核心区别: * 真正的执行能力:不只回答问题,能实际操作你的电脑 * 24/7 全天候待命:睡觉时也能主动完成任务 * 完全开源免费:数据完全掌控在自己手中 * 支持国内平台:飞书、钉钉等均已支持接入 二、安装前准备:安装 Node.js 建议提前手动安装

By Ne0inhk
【机器人】复现 StreamVLN 具身导航 | 流式VLN | 连续导航

【机器人】复现 StreamVLN 具身导航 | 流式VLN | 连续导航

StreamVLN 通过在线、多轮对话的方式,输入连续视频,输出动作序列。 通过结合语言指令、视觉观测和空间位姿信息,驱动模型生成导航动作(前进、左转、右转、停止)。 论文地址:StreamVLN: Streaming Vision-and-Language Navigation via SlowFast Context Modeling 代码地址:https://github.com/OpenRobotLab/StreamVLN 本文分享StreamVLN 复现和模型推理的过程~ 下面是示例效果: 1、创建Conda环境 首先创建一个Conda环境,名字为streamvln,python版本为3.9; 然后进入streamvln环境,执行下面命令: conda create -n streamvln python=3.9 conda activate streamvln 2、 安装habitat仿真环境

By Ne0inhk
OpenClaw配置Bot接入飞书机器人+Kimi2.5

OpenClaw配置Bot接入飞书机器人+Kimi2.5

上一篇文章写了Ubuntu_24.04下安装OpenClaw的过程,这篇文档记录一下接入飞书机器+Kimi2.5。 准备工作 飞书 创建飞书机器人 访问飞书开放平台:https://open.feishu.cn/app,点击创建应用: 填写应用名称和描述后就直接创建: 复制App ID 和 App Secret 创建成功后,在“凭证与基础信息”中找到 App ID 和 App Secret,把这2个信息复制记录下来,后面需要配置到openclaw中 配置权限 点击【权限管理】→【开通权限】 或使用【批量导入/导出权限】,选择导入,输入以下内容,如下图 点击【下一步,确认新增权限】即可开通所需要的权限。 配置事件与回调 说明:这一步的配置需要先讲AppId和AppSecret配置到openclaw成功之后再设置订阅方式,

By Ne0inhk