DJI ROS dji_sdk 源码分析|整体框架
- launch文件
- CMakeLists.txt
- cpp文件
- main.cpp
OSDK 是一个用于开发无人机应用程序的开发工具包,基于OSDK 开发的应用程序能够运行在机载计算机上(如Manifold 2),开发者通过调用OSDK 中指定的接口能够获取无人机上的各类数据,经开发者设计的软件逻辑和算法框架,执行相应的计算和处理,生成对应的控制指令控制无人机执行相应的动作,实现如自动化飞行、负载控制和视频图像分析等功能。
本篇博客通过对dji_sdk 源码分析梳理出了整体框架。
launch文件
运行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="123456"/>
<param name="app_version" type="int" value="1"/>
<param name="align_time" type="bool" value="false"/>
<param name="enc_key" type="string" value="abcd1234"/>
<param name="use_broadcast" type="bool" value="false"/>
</node>
</launch>
节点的名字为dji_sdk_node
,之后可以看CMakeLists.txt 可以看这个节点对应的 cpp文件。
节点有几个参数,需要配置。
- acm_name 不用管
- serial_name 串口的名称
- baud_rate 波特率
- app_id 申请的app id
- app_version 不用管
- align_time 是否开启时间同步
- enc_key 申请的app id 对应的KEY
- use_broadcast 是否使用广播,默认不使用
CMakeLists.txt
前面的依赖配置就不看了,直接看 exe生成部分
add_executable(dji_sdk_node
src/main.cpp
src/modules/dji_sdk_node_control.cpp
src/modules/dji_sdk_node_services.cpp
src/modules/dji_sdk_node.cpp
src/modules/dji_sdk_node_mission_services.cpp
src/modules/dji_sdk_node_subscriber.cpp
src/modules/dji_sdk_node_publisher.cpp
src/modules/dji_sdk_node_mobile_comm.cpp
src/modules/dji_sdk_node_payload_comm.cpp
src/modules/dji_sdk_node_time_sync.cpp)
依赖的cpp文件在 src文件夹下和src/modules文件夹下
cpp文件
main.cpp
首先来看 main.cpp
该文件完成 ros的最基础功能,然后对DJISDKNode
类的实例化
#include <dji_sdk/dji_sdk_node.h>
包含dji_sdk_node.h
,DJISDKNode
类的定义就在这个文件中。
int main(int argc, char **argv) {
ros::init(argc, argv, "dji_sdk");
ros::NodeHandle nh;
ros::NodeHandle nh_private("~");
ros 节点的初始基本操作
DJISDKNode* dji_sdk_node = new DJISDKNode(nh, nh_private);
对DJISDKNode
类的实例化
ros::AsyncSpinner spinner(4); // Use 4 threads
spinner.start();
开启4个线程
ros::waitForShutdown();
delete dji_sdk_node;
dji_sdk_node = NULL;
return 0;
}
结束部分
DJISDKNode
类的定义在dji_sdk_node.hpp文件中
其中的实现在主要在dji_sdk_node.cpp中,特殊功能的在modle文件夹下的其它对应cpp文件中实现