搭建DJI 无人机Onboard SDK ROS开发环境及测试

news2024/11/13 14:41:36

搭建DJI 无人机Onboard SDK ROS开发环境及测试

  • 功能包简介
  • 开发环境搭建
  • 测试功能包
    • 连接设备
    • 启动SDK

功能包简介

ROS功能包名称:dji_sdk

功能包功能:用于DJI 板载SDK的ROS版本

OSDK 是一个用于开发无人机应用程序的开发工具包,基于OSDK 开发的应用程序能够运行在机载计算机上(如Manifold 2),开发者通过调用OSDK 中指定的接口能够获取无人机上的各类数据,经开发者设计的软件逻辑和算法框架,执行相应的计算和处理,生成对应的控制指令控制无人机执行相应的动作,实现如自动化飞行、负载控制和视频图像分析等功能。
在这里插入图片描述
主要优势

  • 兼容广泛的软硬件平台
    使用OSDK 开发的应用程序能够运行在主流的嵌入式硬件平台上,如STM32等,也可运行在主流的嵌入式操作系统和软件架构中,如Linux、ROS及RTOS,开发者按照跨平台移植中的步骤执行所需的工作后,即可在不同版本的软硬件平台上运行基于OSDK 开发的应用程序。

  • 满足复杂的控制需要
    通过调用OSDK 开放的接口,即可使无人机按照指定的控制逻辑在极端环境中实现自主飞行、负载控制及图像感知等应用功能。

  • 支持丰富的拓展方案
    OSDK 提供了丰富的接口,方便开发者使用第三方应用程序和算法框架,使用图像识别、自主巡航及SLAM 等技术开发出专业的应用软件,此外,还方便开发者接入第三方传感器、相机或检测设备,采集所需的数据信息,满足用户个性化的应用功能和控制需求。

该功能包为 DJI 机载 SDK 提供了 ROS 接口,使用户能够使用 ROS 消息和服务完全控制无人机。
目前支持的无人机平台有:

  • DJI M300
  • DJI M100
  • M600
  • M210
  • 配备 A3/N3 飞控的无人机。

功能包依赖DJI SDK 核心库,链接地址为:DJI SDK 核心库

注意:功能包有很多的版本,要根据自己的平台,选择正确的版本
在这里插入图片描述
其中4.0和4.1是能够支持M300无人机飞行平台的
对于 A3/N3 飞控的无人机,最新的支持版本是3.8版本

ROS WIKI地址:http://wiki.ros.org/dji_sdk

开发环境搭建

下载 Onboard-SDK-ROS
git地址:https://github.com/dji-sdk/Onboard-SDK-ROS

下载指定分支命令
git clone -b 分支名+仓库地址

具体指令如下:

git clone -b 3.8 https://github.com/dji-sdk/Onboard-SDK-ROS

在这里插入图片描述
放到ROS的工作空间中,进行编译

catkin_make

编译的时候,会检测依赖库,检测到没有Onboard-SDK的时候会自动下载,这时候会花费些时间
在这里插入图片描述
自动下载完成后,会在功能包里,出现两个文件夹:Onboard-SDK-3.8.1、Onboard-SDK-3.8.1-build
在这里插入图片描述
中间还会安装一些依赖的库,所以会慢些,等到最后报了一个这样的错误:

CMake Error at /home/jk-jone/jone_ws/devel/share/dji_sdk/cmake/dji_sdkConfig.cmake:197 (find_package):
Could not find a package configuration file provided by “nmea_msgs” with
any of the following names:
nmea_msgsConfig.cmake
nmea_msgs-config.cmake
Add the installation prefix of “nmea_msgs” to CMAKE_PREFIX_PATH or set
“nmea_msgs_DIR” to a directory containing one of the above files. If
“nmea_msgs” provides a separate development package or SDK, be sure it has
been installed.
Call Stack (most recent call first):
/opt/ros/noetic/share/catkin/cmake/catkinConfig.cmake:76 (find_package)
Onboard-SDK-ROS/dji_sdk_demo/CMakeLists.txt:10 (find_package)

这个好办,就是缺少nmea_msgs包的依赖,下载就行,指令如下:

sudo apt-get install ros-noetic-nmea-msgs

其中的noetic需要根据自己ros的版本进行替换

然后再次编译

编译成功!
在这里插入图片描述

测试功能包

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 有
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/342010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CUDA线程层次一文搞懂|参加CUDA线上训练营

设备术语 Host&#xff1a;CPU 和 内存 (host memory)Device&#xff1a;GPU 和显存 (device memory) CUDA 线程层次 CUDA 线程层次分为&#xff1a; Thread 所有线程执行相同的核函数并行执行 Thread Block 执行在一个 Streaming Multiprocessor &#xff08;SM&#xff09…

Python快速上手系列--异常处理--详解篇

本章所说的就是我们经常遇到的一个问题&#xff0c;报错、异常。我们应该如何处理&#xff0c;让它不影响后面的程序运行。异常首先我们看看一个简单的示例。print(2/0)其结果可想而知&#xff0c;当然是报错了&#xff01;程序被终止了&#xff01;这里会提示用户&#xff0c;…

索引-性能分析-慢查询日志

索引语法 1、创建索引时候 [UNIQUE | FULLTEXT] 关键字是可选的&#xff1b; 1&#xff09;加上 UNIUQE 就是创建唯一索引&#xff08;唯一索引&#xff0c;说明改字段不能出现重复数据&#xff09;&#xff1b; 2&#xff09;加上FULLTEXT 创建的是一个全文索引&#xff1b;…

Webpack5 环境下 Openlayers 标注(Icon) require 引入图片问题

Webpack5 环境下 Openlayers 标注&#xff08;Icon&#xff09; require 引入图片问题环境版本Openlayers 使用 require 问题Webpack5 正确配置构建新环境的时候&#xff0c;偶然发现 Openlayers 使用 require 的方式加载图片&#xff08;Icon&#xff09;报错&#xff0c;开始…

电子技术——DC偏移

电子技术——DC偏移 因为差分放大器是直接耦合的并且对于DC有着有限的增益&#xff0c;因此本节我们讨论差分放大器在DC相关方面的问题。 MOS差分放大器的输入偏移电压 考虑下面的电路&#xff0c;我们将MOS差分放大器的输入端都置地&#xff1a; 此时假如电路完全对称&#…

IP地址:揭晓安欣警官自证清白的黑科技

《狂飙》这部电视剧&#xff0c;此从播出以来可谓是火爆了&#xff0c;想必大家都是看过的。剧中&#xff0c;主人公“安欣”是一名警察。一直在与犯罪分子做斗争。 莽村的李顺案中&#xff0c;有匿名者这个案件在网上发帖恶意造谣&#xff0c;说安欣是黑恶势力的保护伞&#…

将视频作为桌面动态壁纸,只需要两步,让你保存的视频在桌面动起来,动态壁纸工具,视频动态壁纸,小风车,桌面美化工具

这款软件可以让你宝贵的视频资源变成动态壁纸显示在你的电脑上&#xff0c;体积小巧&#xff0c;不需要安装&#xff0c;即点即用。 一、软件简介 这是一款可以将视频文件作为动态壁纸展示在电脑桌面的软件&#xff0c;它体积小巧&#xff0c;占用资源也不多&#xff0c;相比…

SpringMVC基础入门(一)之理论基础概念

文章目录SpringMVC1.概念2.常用注解请求与响应1.请求参数2.JSON传输3.常用注解响应1.响应页面2.响应JSON数据Rest风格1.介绍2.常用注解SpringMVC 1.概念 &#xff08;1&#xff09;定义 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架。 &#xff08;2&#xff09;为什…

test2

物理层故障分析 一、传输介质故障 a.主要用途简述 传输介质主要分为 导向传输介质和非导向传输介质。前者包括双绞线&#xff08;两根铜线并排绞合&#xff0c;距离过远会失真&#xff09;、同轴电缆&#xff08;铜质芯线屏蔽层&#xff0c;抗干扰性强&#xff0c;传输距离更…

VScode查看python f.write()的文件乱码

VScode查看python f.write()的文件乱码 在使用 VScode 编写 python 代码&#xff0c; print&#xff08;&#xff09;&#xff0c;汉字正常显示&#xff0c; 使用 with open&#xff08;&#xff09;as f&#xff1a; f.write&#xff08;&#xff09;文件后&#xff0c; 在 …

【Java】HashMap原理

哈希表&#xff08;Hash table&#xff09; 也叫散列表&#xff0c;是根据键&#xff08;Key&#xff09;而直接访问在内存存储位置的数据结构。也就是说&#xff0c;它通过计算一个关于键值的函数&#xff0c;将所需查询的数据映射到表中一个位置来访问记录&#xff0c;这加快…

nvm安装后出现‘node‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

出现这个问题多半是path地址不对。 打开系统环境变量。看看path里面有没有&#xff1f;没有的话&#xff0c;加上就行&#xff01; 我的报错原因就是因为path里没有自动加上nvm的相关路径。 注意项&#xff1a; 1&#xff0c;在安装nvm之前&#xff0c;提前要把本机以前安装…

剑指 Offer 32 - II. 从上到下打印二叉树 II(java解题)

剑指 Offer 32 - II. 从上到下打印二叉树 II&#xff08;java解题&#xff09;1. 题目2. 解题思路3. 数据类型功能函数总结4. java代码5. 踩坑记录1. 题目 从上到下按层打印二叉树&#xff0c;同一层的节点按从左到右的顺序打印&#xff0c;每一层打印到一行。 例如: 给定二叉…

2023年开始,为什么公司运营依赖于流程文档?

当您的业务扩展时&#xff0c;您会得到越来越多的活动部件&#xff0c;跟踪复杂性是某人的工作。人员和任务需要以最有成效的方式组织&#xff0c;您必须找到某种方式让员工知道如何执行有效完成工作所需的流程。为了使过程可重复&#xff0c;需要将其记录在案。有人需要写下你…

关于conda env导出yaml无法create的问题解决

在使用conda env 命令创建package 列表之后&#xff0c;无法用yml文件创建新的环境。 这是因为在环境导出的时候没有加--no-builds 这个选项。 conda env export 正确的导出环境的做法如下&#xff1a; conda env export --no-builds > environment.yml--no-builds 的作用…

(C语言)自定义类型,枚举与联合

问&#xff1a;1. 结构体在自引用的时候不能怎么样&#xff1f;可以怎么样&#xff1f;2. Solve the problems&#xff1a;自定义一个学生结构体类型&#xff0c;要包含姓名&#xff0c;性别&#xff0c;年龄&#xff0c;六科成绩&#xff0c;家乡&#xff08;也为结构体&#…

服务器开发29:Kubernetes (K8S)上手简单实践(2/13)

文章目录一、Kubernetes (K8S) 简介1&#xff09;简介2&#xff09;主要特性&#xff1a;3&#xff09;学习前提4&#xff09;不同部署方案5&#xff09;为什么需要K8S6&#xff09;K8S集群架构7&#xff09;Kubernetes 组件二、安装k8s集群1&#xff09;安装方式介绍2&#xf…

python笔记-- “__del__”析构方法

-#### 1、基本概念&#xff08;构造函数与析构函数&#xff09; 特殊函数&#xff1a;由系统自动执行&#xff0c;在程序中不可显式地调用他们 构造函数&#xff1a; 建立对象时对对象的数据成员进行初始化&#xff08;对象初始化&#xff09; 析构函数&#xff1a; 对象生命期…

【IPD】集成产品开发培训课程「3月4-5日」

课程名称集成产品开发&#xff08;Integrate Product Development&#xff09;参加对象企业CEO/总经理、产品总监、研发总监/副总、总工/技术总监、市场总监、制造总监、采购总监、产品经理/研发项目经理、研发管理部/技术管理部经理、流程管理部/质量管理部经理、项目管理及质…

Spring Cloud alibaba之Feign

JAVA项目中如何实现接口调用&#xff1f;HttpclientHttpclient是Apache Jakarta Common下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持Http协议的客户端编程工具包&#xff0c;并且它支持HTTP协议最新版本和建议。HttpClient相比传统JDK自带的URL Connection&a…