Droidplanner(tower) 系统分析

来源:互联网 发布:免费苹果恢复软件 编辑:程序博客网 时间:2024/06/09 03:29

个人使用 DroidPlanner 手机地面站(简称DP),觉得很好用。也想了解其系统构成。就 git 下载了一个,在Android Studio 中编译成功,而后又看了下代码

写下系统分析笔记 ( 我分析的版本是 2.7.6.1  ):


层次型的大系统结构

DP设计中充满的模式和抽象,  包含两个大包 core 和 android (这里是指包 ), 把跟Android 和地图等不相关的抽象到Core模块中,  跟Android系统相关的部分放在Android包中。 也就是说你编译一个非Android设备的地面站,你可以复用Core这部分(但其实apple平板用的object c,  win平板用 c#,  还真难把java代码用在非Android平板上,但有这层抽象,可能让系统层次更清晰) (  在3.0后续版本, core 单独发展成 3DR services,   而 DP android 部分改名叫tower   )


Core 包含的模块

Model_Drone

定义Drone的抽象接口,Core 最关键对 Drone 进行了抽象

Drone

定义一个Drone的实现,Drone就代表一个无人机(可以是Rover),有近20个或简单或复杂的Variable ( Altitude, Battery, Calibration, GuidedPoint等 ) ,

这是就是 MVC模式的Model.  当Mavlink 来消息的,调用Varible的set 方法,传来触发 listener ( 多是View) 更新(显示 )

(注意  Variabale 不是Parameters,  Parameters只算一个Variable)


Mavlink

此模块并不是Mavlink系统提供者用python脚本自动生成的pacakge ( 那个自动生成的 package在core包之外), 此包在Mavlink自动生成包基础了,定义了 DP 需要的 10多个Mavlink命令以方便调用(Arm, Heartbeat, Modes, 等)

另定义了MavlinkConnection接口(包括一般, Tcp, Udp)


parameters包

定义了 parameter class,   而Drone的 Parameters包含若干parameter


mission

描述任务的 model, 这不是一个小模块, 抽象了 mission item, 包含近10种 waypoint 类型,还有 survey的构造 等


GeoTools

提供一些GEO 运算功能


srtm

srtm 是NASA提供高精度(30米)地理信息图, 还没研究 DP用它来实现何种功能


gcs 功能

与地面站结合的相关功能,gcs heartbeat, 自动发送地面站 heartbeat给drone; 还有follow,  follow  实现 drone 跟随地面站的功能。


下面继续介绍 core层子上的Android包, 这部分也是构造在Android 系统提供设施之上(Activity, Fragment, Services,Bluetooth等)


Widgets

DP需要的界面构件, 近20个或简单或复杂的构件


Utils

不好归类的工具类放在这里


notification

通知子系统,包括界面通知(Pebble, StatusBar)和其他(Beep, TTS)


dialogs

提供DP需要7种左右Dialog


maps

 抽象了DPMAP 接口,有两个实现: 一个是 GoogleMapFragment, 另一个是MapBoxFragment; 包括以及map相关的其他功能Gesture Detector, ProviderPreference等。


map_edit_proxy

通过在map编辑marker, 构造waypoints 和mission 的模块,比较花时间的一个模块,有10多种 Marker与之相关的Fragment设计处理。


graphics.map

map 的特殊标记( home, drone, guided, PolygonPoint)


communication

Mavlink 的通信模块,, 包括connection模块 ,有 usb, tcp, udp, bluetooth.  另有service模块, DP把Mavlink的发送和接收做了 service (没有跨进程,但这样做可能是因为系统结构清晰。)


fragments

比较头痛的一个模块,包含好几十个界面。 (有大有小,一个大的fragments就是一个activity呀)


activities

包含系统几个主要activity (Flgith, Editor, Setting)


Drone Mode 设计

Drone包含10多个Variable,  有多个DroneListener, 但这些Variabl改变时,用DroneEvents通知



MavLink 部分的设计


MavLink 协议设计者提供 python 脚本,生成各种Mavlink  packet。 因此DP只需要设计了MavLinkConnection 来管理连接的package以及通知Listener

MavLink 的连接可以是串口,蓝牙,tcp, udp,  DP用继承关系来组织他们,MavlinkConnection 模板方法会调用 readDataBlock( 各Connect 子类实现),来轮询飞控回传数据。

而后给 MavlinkConnectionlistener 发送 onReceiveMessage(MAVLinkMessage msg), 之后再转 droneListener等其他调用。

在DP中,有一个发送队列(ToSend),和一个接收队列 (ToLog, 实际已经接收了,只是要用来打log),分别启动两个线程处理。




DP使用 Mavlink 数据的方式,每次获取数据,更新model 再触发 listener接口
而Mission Planner 有 cs ( current state) 结构  缓存数据,但没有listner接口,可能是UI需要显示的时候,自己来读取,更新显示。


Mavlink 给飞控回传数据有两种方式
1) 飞控自动发送。(设置那几个串口参数,比如 SR2_EXTRA2)
2) 地面站向飞控请求数据
(一般情况都是1)吧, DP会轮询数据(有待证实))


MavLink 消息传递

由以下基础类组合完成



消息的方向如下,经过多个类,又在MavLinkMsgHandler中定向转化为 drone 的 set 方法,最后drone listener更新界面

MAVLinkService -> MavLinkConnectionListener ->MavlinkInputStream(MAVLinkClient)->MavLinkMsgHandler -> (drone set) (in droid PlannerApp.java)



UI层次设计

使用DP 总是看到  在最上面的Action bar,而且Action bar 回显示飞行模式。所以DP抽象了SuperUI, 实现 Action Bar, 等其他代码 的共用。

DrawerNavigationUI 实现抽屉状 HUD 界面。 FlightActivtiy 是进应用见到的第一屏,最复杂的Editor (plan 编辑界面),用若干callback接口。

因为Android 制作界面比较复杂,有待详细分析。





Follow子系统设计

无人机跟随地面站的飞行模式,其实并不是飞控支持的飞行模式,而且 Guided模式时不断更新goal。因此需要地面站和无人机协同完成。

Follow从DroneListerner, locationRecevier中派生(即要知道无人机状态,也要知道地面站位置),使用策略模式抽象了FollowAlgorithm, 有follow above, left right等




mission(任务)编辑器功能

Mission 只是Drone一个Varibale, 但却使最难搞定的一个,因为这个编辑器涉及复杂的用户交互。

在Core层,DP抽象了Mission和MissionItem, 在Android构造了与之对应的MissonProxy, MissionItemProxy, 而MissonItemProxy又关联了MarkerInfo, 而MarkerInfo有与之关联的Fragment.  以上还没有分析编辑时的交互。 现在 DP的 mission 编辑是也不好做也不好用的状态。




Notification

这个模块比较简单,NotificationHandler 调用各Provider进行Notification






0 0