电子产业一站式赋能平台

PCB联盟网

搜索
查看: 226|回复: 0
收起左侧

基于Mobile SDK V5版固件开发大疆无人机手机端遥控器(5)

[复制链接]

854

主题

854

帖子

8396

积分

高级会员

Rank: 5Rank: 5

积分
8396
发表于 2023-7-7 12:01:00 | 显示全部楼层 |阅读模式

d5kqz13hmwm64023070118.gif

d5kqz13hmwm64023070118.gif
0 R! s! s* f; z* h
点击上方蓝色字体,关注我们8 V  ~) o; J' x6 ^, f! ?

; A# L8 D5 b7 @  tv5.x版本的功能与v4.x基本相同,都是获取飞机的姿态信息、获取无人机多媒体文件、操作多媒体文件、航线规划等。不过在上一章节中也大致说了一些两个版本的中API的差别,下面是根据一些API使用所完成的一些功能,因为项目原因只能提供部分代码供参考,后续如果有这方面需求的小伙伴可以对其进行开发指导。8 Z8 u  F0 ~' n0 ~$ q6 w" P8 {, t
1/ q( y1 O& u) ~9 ]
获取姿态信息
' j! P1 g1 I, f/ o% y1、KeyManager调用! \- N: B4 w7 I

, X0 q' J$ p* qKeyManager类提供了一组方法来访问硬件模块的参数和控制硬件模块的行为,包括DJIKey的Value设置,Value获取,Value监听和Action执行。通过KeyTools类提供的createKey方法可以更加方便的创建DJIKey实例。' }7 s  w: O* ]0 W* @
下图展示了使用KeyManager的接口判断飞控正常连接并且GPS信号等级大于等于2级,然后给飞行器设置返航点,最后执行返航操作的调用流程。
& k4 G: s) f4 q; p/ s0 ?" D% U

1hygojudocf64023070218.png

1hygojudocf64023070218.png

) {5 }8 L8 c/ {: Z- F9 C& H此处是示例的操作方式,后面有在项目中使用的过程。. g6 s0 C* k: X& W

; t4 a* Q9 e! ~' e+ t2、示例
8 o2 `- l& H: ~- l' B+ h% g6 ?; _; I9 b2 V
//获取飞机信息、云台信息
" Y( N! w/ e$ S( F    private void get3DLocation() {
. ?+ v# @) h0 e* U, m        KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyAircraftLocation3D), this, new CommonCallbacks.KeyListener() {, \2 U8 K* X' U% _; z, u2 N
            @Override
) n0 h% H, ^1 y2 X" Z: I: ]5 K            public void onValueChange(@Nullable LocationCoordinate3D oldValue, @Nullable LocationCoordinate3D newValue) {( o/ o, u, S2 S' [8 M
                if (newValue!=null){4 D! F$ _& ]4 ~' V! s0 `) d
                    lat = newValue.latitude;$ z- ]; W. |' ]0 a' y
                    lon = newValue.longitude;( h- Z+ x' h5 \8 P) [) }; B
                    high = newValue.altitude;" F! i2 g( ]4 b% H6 V8 h
                }
1 }- U+ D! T' b( N8 x) c/ U            }, h2 m9 i0 v; K
        });
! `0 @1 q4 e6 ^: i( U) H5 E    }  {9 [' i$ V4 x7 O. S2 G6 k, \. N
    private void getAttitude() {) O# w2 T# A( |# x4 b
        KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyAircraftAttitude), this, new CommonCallbacks.KeyListener() {1 {* `+ ]& q; m: [
            @Override
# T& c  z" U/ K, V3 ~& Y6 i            public void onValueChange(@Nullable Attitude oldValue, @Nullable Attitude newValue) {
, |7 h% P7 R6 H6 a                if (newValue!=null){9 |0 W: i- S3 A, ^
                    pitch = newValue.pitch;
2 h* I6 W9 ?/ N4 }, I% `                    roll = newValue.roll;% {* O3 X, w) y
                    yaw = newValue.yaw;, z! V7 V" w2 {: Z- Q
                }
4 ^8 F3 N( ~5 w6 E1 q, G6 H            }* N  J: ^+ n8 y2 c, ?
        });5 b8 d1 |3 ~, \" s* d" ?! `
    }5 b$ a* \3 I) h0 T
    private void getVelocity() {
" X# @# K; S  B* ^; k; h        KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyAircraftVelocity), this, new CommonCallbacks.KeyListener() {
) o3 _+ Q6 t8 V8 h5 h! d9 W9 }0 f            @Override# D1 G8 k+ ~, `9 N+ ^# J1 S
            public void onValueChange(@Nullable Velocity3D oldValue, @Nullable Velocity3D newValue) {
9 f; ]5 y9 |) b4 ~" N' ?9 f# P                if (newValue!=null){8 }1 F/ U# A3 V
                    velocity_X = newValue.x;
5 X; c8 ~3 U8 h$ |: }                    velocity_Y = newValue.y;' n$ Z8 r- x( a! I' I
                    velocity_Z = newValue.z;% L! C/ ?/ \" }& n- T
                }
4 M3 T* h( q$ Z: G            }
- _  H+ G, U$ T( w* @2 |% e        });
' P; x6 b# K/ w$ l+ n$ b( X    }
" {& v8 b" ^7 M" I2 l7 ?+ l4 [6 I    private void getIsFly(){- N4 c/ p# Y0 ]% Y7 |
        KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyIsFlying), this, new CommonCallbacks.KeyListener[B]() {
9 ?1 k% q( p4 L' ~            @Override
) Q0 t3 `- w* ]  z3 B7 W9 {            public void onValueChange(@Nullable Boolean oldValue, @Nullable Boolean newValue) {6 H' F/ u4 @& b6 I
                if (newValue!=null){
; {# G: V: x, `, L3 G7 G+ Y; S                    isFlying = newValue;, z, d, ^$ g3 ]) f. `; l1 S2 y
                }) \# Z8 g: Q7 d, P% S% p
            }/ F& o  t% x- Q# V/ ?& k( j. L' I
        });8 E3 v5 d# y3 a4 A1 s6 ]
    }
4 L4 d7 x- s& C! A& m$ _6 r; z1 j    private void getGimbalAttitude() {
5 _( l" R0 e, g8 t9 D/ [+ w9 u        KeyManager.getInstance().listen(KeyTools.createKey(GimbalKey.KeyGimbalAttitude), this, new CommonCallbacks.KeyListener() {! Z- g" O. y* ^. l! ^& D
            @Override8 `7 _4 {( q9 H* l% d* A+ n+ Z/ W0 u5 q
            public void onValueChange(@Nullable Attitude oldValue, @Nullable Attitude newValue) {
3 f  l( y* X9 G                if (newValue!=null){$ u/ I/ ^1 G& L' _- {% Y
                    g_pitch = newValue.pitch;
/ x- y$ t8 v& X- Y1 q" g8 N1 t! _                    g_roll = newValue.roll;! y2 B& Y; |: v6 Q& L& a; D
                    g_yaw = newValue.yaw;) v( }" X2 E0 E/ e- L- @, L
                }
3 Z+ W, a' R& h2 G' R7 S. l' t. G            }7 |9 |! d* Q0 ]7 e8 @2 d; W9 ]9 o
        });1 c1 b' V6 \) F2 W& f( ?% s
    }" x2 G4 [8 \% l: U8 ^9 }
    private void getPower() {
8 R/ z9 g. ^( b/ _4 K: T. {2 J        KeyManager.getInstance().listen(KeyTools.createKey(BatteryKey.KeyChargeRemainingInPercent), this, new CommonCallbacks.KeyListener[I]() {
' d! D4 m  P$ T# i% e$ }; w6 n            @Override8 {4 L1 g# e7 C  a
            public void onValueChange(@Nullable Integer oldValue, @Nullable Integer newValue) {% _4 O' r8 |4 E
                power = newValue;
9 l1 {9 o4 C5 [            }
) O  T- f1 W! u& |        });4 W8 Z; B7 `0 b: y" I
    }, s$ W- R* x) p/ H/ Y6 l$ n8 `
    private void getTemperature() {
$ E! v* l5 j: g% `$ o/ E        KeyManager.getInstance().listen(KeyTools.createKey(BatteryKey.KeyBatteryTemperature), this, new CommonCallbacks.KeyListener() {
* W7 O+ y( h: {) m            @Override$ @4 ^! J& o9 \  u5 Z3 |, L
            public void onValueChange(@Nullable Double oldValue, @Nullable Double newValue) {
# y- J  |1 G7 M. F2 @                temperature = newValue;/ ~$ v; R" Q( j3 F- _0 C
            }
+ D% k- {) B6 y' z6 l. X        });0 c* E% u- `! _2 a  l
    }
3 ^+ g- C- e* n- t6 v' s
  • get3DLocation()方法为获取飞机经纬度信息。
  • getAttitude()方法获取飞机的姿态信息(分别是航偏角、旋转角、俯仰角)。
  • getVelocity()方法获取飞机的飞行速度(分别是X、Y、Z三个方向的速度值)。
  • getIsFly()方法获取当前飞机的状态值(是否正在飞行)。
  • getGimbalAttitude()方法获取镜头的姿态信息(分别是航偏角、旋转角、俯仰角)。
  • getPower()获取飞机的电池电量
  • getTemperature()获取飞机的电池温度onValueChange()方法为1秒执行10次,这个可以根据后续要求进行获取;) c, s, N- X% ], U; u# P$ i# B

    ! l( n/ U3 i* s/ G  c
    0 d. ~3 |1 P; r  E' Q2! w0 Z- k* \/ t; X  U* G
    多媒体使用
    6 o3 ?9 f: Y* h1 a* P' y- T1、Sample介绍- L8 V5 x! }5 r: ]# p6 k3 P4 a- [
    % O. S  b8 x% D0 r
    拍照、录像是无人机的重要功能,对拍摄的照片、视频等多媒体文件进行管理也就必不可少。多媒体文件的管理包括访问飞机存储空间内的多媒体文件资源、获取多媒体文件列表与列表状态、视频文件播放等。  B& L9 t! U2 P4 p4 t
    下图为完整的接口展示以及接口调用流程示例。3 b  L) L8 [! k+ c6 s$ [  R# X. \
  • 多媒体文件管理调用流程
    8 _9 z5 D5 o+ x

    nx0bv4uu1dw64023070319.png

    nx0bv4uu1dw64023070319.png
  • 视频文件播放调用流程
    ; R/ ], y$ h5 D0 z7 E
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表