|
1inmvfs13jo64015957912.gif
' `, @8 M! m, e7 W3 l2 o: j/ s
点击上方蓝色字体,关注我们
p! s) J$ K" z1 Y+ l" w% C) m" I+ l9 z' T7 y
v5.x版本的功能与v4.x基本相同,都是获取飞机的姿态信息、获取无人机多媒体文件、操作多媒体文件、航线规划等。不过在上一章节中也大致说了一些两个版本的中API的差别,下面是根据一些API使用所完成的一些功能,因为项目原因只能提供部分代码供参考,后续如果有这方面需求的小伙伴可以对其进行开发指导。
' z, E' x. W1 o" ^1
5 @. J7 E r v7 c. t获取姿态信息8 t- T+ ?/ u3 M1 T9 A0 C
1、KeyManager调用! n d0 A# c- ~( U
7 s$ e H3 B1 {" K
KeyManager类提供了一组方法来访问硬件模块的参数和控制硬件模块的行为,包括DJIKey的Value设置,Value获取,Value监听和Action执行。通过KeyTools类提供的createKey方法可以更加方便的创建DJIKey实例。4 L; P, o9 w: h0 d
下图展示了使用KeyManager的接口判断飞控正常连接并且GPS信号等级大于等于2级,然后给飞行器设置返航点,最后执行返航操作的调用流程。+ [ _" b6 s/ c8 X; F
j4djlphjkqv64015958012.png
% J1 @, m; X! c9 Q此处是示例的操作方式,后面有在项目中使用的过程。, {: ]! U( v" ~/ R6 o! k
8 A V7 k0 a* Q2、示例
/ I" T% n! s9 m) \) P5 N7 j
% F8 e$ y' B: {//获取飞机信息、云台信息" T( ~( s k8 M' M' z3 n: q0 t. V, R
private void get3DLocation() {/ U; M* U- ?' I/ j# z2 C
KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyAircraftLocation3D), this, new CommonCallbacks.KeyListener() {
. } A8 Q% ]# j l @Override7 W; x1 q" G+ L& U+ \. q% c
public void onValueChange(@Nullable LocationCoordinate3D oldValue, @Nullable LocationCoordinate3D newValue) {
* H. ^" U0 q) y' n! J7 Y6 b if (newValue!=null){/ D9 X( W) k7 m( r
lat = newValue.latitude;
$ U! `& ^% A. n( M lon = newValue.longitude;
$ q) E. i3 l- G+ E. l high = newValue.altitude;
|0 |2 Q( ?" T }! E i- z. v. W( L5 _
}
0 {- `2 y/ g( ]* c4 j });
2 K/ _1 d" {) l9 L. y% X) d% r }
9 [6 u2 w L' J" `" U8 e7 V: c8 o private void getAttitude() {
8 t1 t1 h' @7 x* M. Q; R. |2 v KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyAircraftAttitude), this, new CommonCallbacks.KeyListener() {
) y3 B' d d% a H @Override4 _7 U/ Z* i. ^# ~4 U x" Z; g% q' @
public void onValueChange(@Nullable Attitude oldValue, @Nullable Attitude newValue) {
) P6 N1 P) s: a1 [" b! b9 e if (newValue!=null){+ ~0 V: o* Z1 q" Y0 _4 I/ }" p
pitch = newValue.pitch;
& k+ ^ W- p$ E roll = newValue.roll;
: D5 {0 D* [, f* w yaw = newValue.yaw;
6 m6 i, p3 d0 x3 r7 r- w# B }; _# `7 ]5 P8 |* B5 U( f4 ^4 f
}
/ Q6 e- T1 S; m! w# L });" T8 @6 \$ d4 g; q4 C" P; ?& {
}
% ^ i9 w+ r ]$ R( V# ~ private void getVelocity() {$ |1 T0 K9 k) e" ^" e: Q, J3 z
KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyAircraftVelocity), this, new CommonCallbacks.KeyListener() {, U/ P. ~, ?/ A7 M( b
@Override$ p8 R' C6 A8 D* L# \
public void onValueChange(@Nullable Velocity3D oldValue, @Nullable Velocity3D newValue) {, u+ C" W/ q& w' V
if (newValue!=null){8 X) p0 E) Y5 A
velocity_X = newValue.x;) E# K% H, {3 r/ s Y
velocity_Y = newValue.y;( x" d2 l2 i$ p- c" k) T
velocity_Z = newValue.z;, s1 P3 |% C ^+ V( l7 V
}
) x3 C9 L& W0 F$ [ }0 o- t1 I, f1 O4 w6 P
});6 B, H4 y3 F& r+ S* q* r8 v4 d1 J" w
}3 \0 ]! F G. y: k1 J
private void getIsFly(){
, q" C* F: w/ L$ j+ w4 S KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyIsFlying), this, new CommonCallbacks.KeyListener[B]() {
7 U+ w. c& I0 `9 Q @Override
0 N2 F2 _* |3 V! _, J" P5 x3 u+ U public void onValueChange(@Nullable Boolean oldValue, @Nullable Boolean newValue) {+ r; \/ I B- a# z# _% k( w
if (newValue!=null){4 n+ B* j# I4 h! E1 Q$ _% G0 F# ~
isFlying = newValue;: ]0 u5 m) H$ ?( c J
}
! v& l$ Z4 d7 T4 T5 @3 a }+ y" t, \7 H# m2 N1 w
});( }# O4 G7 _5 F$ i
}/ i& H5 c) `" r( `2 d
private void getGimbalAttitude() {( W5 }, G6 o: e* t2 U7 }1 T* I
KeyManager.getInstance().listen(KeyTools.createKey(GimbalKey.KeyGimbalAttitude), this, new CommonCallbacks.KeyListener() {
' `4 e! J6 T+ L @Override7 I% N5 ~+ C( _: O; {5 n7 |2 N
public void onValueChange(@Nullable Attitude oldValue, @Nullable Attitude newValue) {5 v2 [# k1 v1 ?8 X8 Y
if (newValue!=null){6 a+ x( S+ r$ M( n
g_pitch = newValue.pitch;$ w8 ~3 e4 s5 z. Z( B5 ]
g_roll = newValue.roll;7 ~/ w! p ^$ H5 j
g_yaw = newValue.yaw;+ W, B% M) \& G c Y
}* z6 B i5 N! ]$ {
}& z1 {% h+ `+ r S5 R
}); H, c9 A4 B. ^" z9 C
}: P' J& ~8 T0 c$ j
private void getPower() {
8 @. f) @$ g- F: `* V0 N& P0 {+ @4 h7 Y KeyManager.getInstance().listen(KeyTools.createKey(BatteryKey.KeyChargeRemainingInPercent), this, new CommonCallbacks.KeyListener[I]() {
$ F. ]# r: D9 N" b9 { g @Override
4 |! ~% n, `4 H0 v2 g1 h# e9 S( e public void onValueChange(@Nullable Integer oldValue, @Nullable Integer newValue) {
# ^) S9 k/ R) j! ?9 z power = newValue;
M- e v+ Y/ N3 W) Z2 Y2 _ }* K( c6 g% Z; h
});
7 _3 m# ^8 m7 M) T8 I: q }
# l* q# p& B1 _* R' W. R private void getTemperature() {
$ r9 @. i3 O2 I KeyManager.getInstance().listen(KeyTools.createKey(BatteryKey.KeyBatteryTemperature), this, new CommonCallbacks.KeyListener() {! @3 S( \5 I) j1 i- \0 ]9 S
@Override
/ f: N2 W/ e% R6 _* Y7 I% b7 z5 M public void onValueChange(@Nullable Double oldValue, @Nullable Double newValue) {
2 e$ G7 Y* \/ y; r0 o- `( @0 i temperature = newValue;
* l+ D& B) [! _8 b }* ?% M! `# f4 f
});% a5 S% @/ p6 G, P# Y+ Y0 A
}9 c. Q& _- F$ {! q5 h" N7 z5 w
get3DLocation()方法为获取飞机经纬度信息。getAttitude()方法获取飞机的姿态信息(分别是航偏角、旋转角、俯仰角)。getVelocity()方法获取飞机的飞行速度(分别是X、Y、Z三个方向的速度值)。getIsFly()方法获取当前飞机的状态值(是否正在飞行)。getGimbalAttitude()方法获取镜头的姿态信息(分别是航偏角、旋转角、俯仰角)。getPower()获取飞机的电池电量getTemperature()获取飞机的电池温度onValueChange()方法为1秒执行10次,这个可以根据后续要求进行获取;
& x6 G, H; \, ~' G# G8 e& z
6 T x% r3 n$ c$ v2 a* ~
5 ^; _# u" b! N) d, O2
- b# R" I3 J* Z2 H$ X/ f多媒体使用
3 y% U& b$ d* {- L6 p+ ~: ~8 s1、Sample介绍
/ U( b! Q" s# j7 j/ @- A- ?9 m# q2 C4 S1 p; i; Y
拍照、录像是无人机的重要功能,对拍摄的照片、视频等多媒体文件进行管理也就必不可少。多媒体文件的管理包括访问飞机存储空间内的多媒体文件资源、获取多媒体文件列表与列表状态、视频文件播放等。4 K& N/ a$ J6 ]' w2 Q& v
下图为完整的接口展示以及接口调用流程示例。0 |- e, h! N; ^4 G
多媒体文件管理调用流程
% p g( w: t' Y% W$ \: o6 F: T+ C' f. f
fgsd4zol05b64015958112.png
视频文件播放调用流程
4 Z$ P- x0 J3 E. Z# Q |
|