DJI 无人机Onboard SDK ROS 3.8.1 软件默认配置运行问题及解决方法

DJI 无人机Onboard SDK ROS 3.8.1 软件默认配置运行问题及解决方法

DJI Onboard SDK ROS 3.8.1是可以直接适配 M210飞机,但是对于A3飞控,由于没有双目相机,直接运行会报错,本篇博客记录遇到的问题,及解决办法。

dji_sdk 的 launch 文件夹中有一个 sdk.launch 文件
原文件如下:

<launch>
    <node pkg="dji_sdk" type="dji_sdk_node" name="dji_sdk" output="screen">
    <!-- node parameters -->
    <param name="acm_name" type="string" value="/dev/ttyACM0"/>
    <param name="serial_name" type="string" value="/dev/ttyUSB0"/>
    <param name="baud_rate" type="int" value="921600"/>
    <param name="app_id" type="int" value="your app id here"/>
    <param name="app_version" type="int" value="1"/>
    <param name="align_time" type="bool" value="false"/>
    <param name="enc_key" type="string" value="your app key here"/>
    <param name="use_broadcast" type="bool" value="false"/>
    </node>
</launch>

注意这里默认配置的串口设备是 /dev/ttyUSB0 ,这里可以做一个设备修改和绑定,到时候也要增加串口的访问权限
波特率默认是921600,与上位机的设置要一致
app_id enc_key 需要从官网上申请,申请下来后,填入,即可。

连接设备

用一个USB转TTL模块,将TTL端的接口与无人机API接口连接,USB端插入电脑。

通过dji 上位机,设置API串口波特率为921600(ROS 默认订阅的主题相对较多,为保证ROS 与基于OSDK 开发的应用程序间有足够的通信带宽,UART 的波特率应大于921600,修改完上位机,需要重新启动飞机)

启动SDK

增加串口权限

添加用户组,可长期使用

sudo usermod -aG dialout ${
    
    USER}

指定串口单次有效

sudo chmod 777 /dev/ttyUSB0

启动sdk

roslaunch dji_sdk sdk.launch 

运行会返回一个错误

ERRORLOG/1 @ AdvancedSensing, L58: Please make sure the connected drone is a M210 and firmware version is supported.
[ERROR] [1675676083.363339870]: drone activation error
[ERROR] [1675676083.363366996]: Vehicle initialization failed

程序默认是用于M210飞机的,当不是该飞机的时候,程序开着避障传感器的功能,冲突了,所以需要修改程序,将避障传感器功能关闭。


在这里插入图片描述
这几个文件内

#ifdef ADVANCED_SENSING
  enable_advanced_sensing = true;
  ROS_INFO("Advanced Sensing is Enabled on M210.");
#endif

改为:

#ifdef ADVANCED_SENSING
  enable_advanced_sensing = false;
  ROS_INFO("Advanced Sensing is Enabled on M210.");
#endif

编译后,再次运行,会出现程序die掉的情况,很明显是访问了非法地址。
在这里插入图片描述
可能还是因为ADVANCED_SENSING的原因,将dji_sdk_node.cpp中的关于ADVANCED_SENSING这个宏里的内容,全部注释掉再次运行

NODES
/
dji_sdk (dji_sdk/dji_sdk_node)
auto-starting new master
process[master]: started with pid [28159]
ROS_MASTER_URI=http://localhost:11311
setting /run_id to d899f17a-a604-11ed-8bc2-87af082c8f87
process[rosout-1]: started with pid [28169]
started core service [/rosout]
process[dji_sdk-2]: started with pid [28176]
STATUS/1 @ init, L55: Attempting to open device /dev/ttyUSB0 with baudrate 921600…
STATUS/1 @ init, L65: …Serial started successfully.
STATUS/1 @ parseDroneVersionInfo, L727: Device Serial No. = 0670169082
STATUS/1 @ parseDroneVersionInfo, L729: Hardware = A3
STATUS/1 @ parseDroneVersionInfo, L730: Firmware = 3.3.8.47
ERRORLOG/1 @ initVirtualRC, L1103: Virtual RC is not supported on this platform!
STATUS/1 @ activate, L1313: version 0x303082F
STATUS/1 @ activate, L1326: Activation successful
STATUS/1 @ verify, L244: Verify subscription successful.
STATUS/1 @ initGimbal, L890: Checking if gimbal is connected …
STATUS/1 @ startPackage, L350: Start package 0 result: 0.
STATUS/1 @ startPackage, L352: Package 0 info: freq=50, nTopics=1.
STATUS/1 @ removePackage, L468: Remove package 0 successful.
STATUS/1 @ initGimbal, L934: Gimbal not mounted!
[ INFO] [1675677533.046816131]: drone activated
[ INFO] [1675677533.060621911]: Use data subscription to get telemetry data!
[ INFO] [1675677533.060638745]: align_time_with_FC set to false. We will use ros time to time stamp messages!
STATUS/1 @ verify, L244: Verify subscription successful.
STATUS/1 @ startPackage, L350: Start package 2 result: 0.
STATUS/1 @ startPackage, L352: Package 2 info: freq=100, nTopics=3.
STATUS/1 @ startPackage, L350: Start package 1 result: 0.
STATUS/1 @ startPackage, L352: Package 1 info: freq=50, nTopics=14.
STATUS/1 @ startPackage, L350: Start package 0 result: 0.
STATUS/1 @ startPackage, L352: Package 0 info: freq=5, nTopics=1.
STATUS/1 @ removePackage, L468: Remove package 0 successful.
STATUS/1 @ startPackage, L350: Start package 0 result: 0.
STATUS/1 @ startPackage, L352: Package 0 info: freq=5, nTopics=12.
STATUS/1 @ startPackage, L350: Start package 3 result: 0.
STATUS/1 @ startPackage, L352: Package 3 info: freq=400, nTopics=1.

运行成功!

并且可以通过日志输出的信息看到订阅了很多的topic
这里总结下:

  • 400hz的1个
  • 100hz的3个
  • 50hz的14个
  • 5hz的1个和12个

订阅的初始功能在 dji_sdk_node.cpp
例如

  std::vector<Telemetry::TopicName> topicList5hz;
  topicList5hz.push_back(Telemetry::TOPIC_GPS_DATE);
  topicList5hz.push_back(Telemetry::TOPIC_GPS_TIME);
  topicList5hz.push_back(Telemetry::TOPIC_GPS_POSITION);
  topicList5hz.push_back(Telemetry::TOPIC_GPS_VELOCITY);
  topicList5hz.push_back(Telemetry::TOPIC_GPS_DETAILS);
  topicList5hz.push_back(Telemetry::TOPIC_BATTERY_INFO);

之后可以根据使用情况,将没有用到的信息关闭,或者减少频率。减少通信和计算压力。

默认的ROS topic 有
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_32761549/article/details/128906342