本文主要介绍Onboard-SDK-ROS的代码设计思想和文件分析,该软件包主要用来完成M100的开发等。
该软件包框架图如图1所示,主要有3个部分
1. 核心的API部分dji-sdk-lib,用于串口通信,建立各种任务的线程,读取信息的线程。
2. 用于封装核心API为ROS接口的dji_sdk
3. 简单的demo,给出了dji_sdk的使用方法。
图1
1 设计思想
所有的控制和信息都是从一个串口读写的,因此在解析串口的API的里边上边做了一个Adapter,将原来的cpp的接口转换为ROS的订阅广播机制。因此构造了三种ROS 通信机制分别是messages, services, actionlib. 第一种用来广播飞机的状态数据,第二种用来对飞机完成任务的控制。第三种同样是任务控制,但是增加了任务的监控。
2 DJI_SDK
2.1 dji_sdk_node.h/dji_sdk_node.cpp
定义了一个类DJISDKNode,成员变量有飞机的状态信息,如位姿,加速度,速度等。如图2所示,该类定义并初始化Publisher,上述飞机的状态信息通过ros的广播发布出去;定义并初始化Service Server,提供飞机的位置姿态控制服务,速度控制服务;定义并初始化ActionLib Server,提供沿特定飞行路线飞行、导航等高级行为,功能同服务提供类似,但增加了反馈和监控。
其中service和action对应回调函数由定义好的.srv文件和.action文件自动编译产生。
图2
2.2
dji_sdk_mission.h
图3
定义了一个类DJISDKMission,成员变量有任务状态、任务事件等,如图3所示,定义并初始化Publisher,将任务状态、任务事件等信息发布成广播;定义并初始化Service,提供开始、暂停、取消任务等服务。
2.3 dji_sdk.h
包含dji_lib_ros_adapter.h及众多由.msg文件、.srv文件、.action文件生成的头文件,作为其他文件公共的头文件。
2.4 dji_lib_ros_adapter.h
将原生dji_sdk_lib包装成ROS能够使用的形式。
2.5 DJI_HardDriver_Manifold.h
运行在妙算上的M100驱动文件
2.6 dji_drone.h
定义了一个dji_drone类,该类构成了ROS中的客户端,定义并初始化Subscriber,订阅dji_sdk_node中发布的话题信息;定义并初始化Service Client和ActionLib Client,调用相关服务和行为。总之,该头文件的作用是将ROS中的功能封装成dji_drone类中的方法,以方便开发者调用。