DJI MSDK waypoint mission开发
前言:因为公司有一个需要飞机飞到某个点的需求,所以在此记录一下开发过程。
文章目录
- DJI MSDK waypoint mission开发
一、waypoint mission介绍:
Waypoint mission是可以通过设置好的waypoint(坐标点、高度航向、角半径、转弯模式、俯仰角、航点动作等)执行飞行任务。
二、Waypoint构造:
1、飞行任务的航点:
1.Waypoint(double latitude, double longitude, float altitude)
2、航点航向:
1.int heading
飞机到达航点时,飞机将旋转到的航向。范围在-180-180,0代表真实的北。如果航向任务的航向不同,飞机的航向将逐渐设置为下一个航向,同时在两个相邻的航路点之间飞行。
3、角半径:
1.float cornerRadiusInMeters
默认情况下路径的拐角半径未0.2m
4、转弯模式:
1.WaypointTurnMode turnMode
5、俯仰角:
1.float gimbalPitch
设置到达航点的时候,万向节的俯仰角范围在[-90,0]。
6、路径点动作(waypointaction):
1.WaypointAction(WaypointActionType actionType, int actionParam)
当飞机到达路点时,飞机将执行此操作。所有可能的操作都在WaypointActionType enum中定义。
(1)WaypointActionType:
1)STAY:
让飞机保持在航路点的位置,参数将确定飞机停留在[0,32767]毫秒范围内的时间(毫秒)。
2)START_TAKE_PHOTO
开始拍照片,执行此方法点操作的最大时间设置为6秒。如果执行航向点动作的时间超过6秒,飞机将停止执行航向点动作,如果存在,飞机将继续执行下一个航向点动作。
3)START_RECORD
开始录音,执行此方法点操作的最大时间设置为6秒。如果执行航向点动作的时间超过6秒(例如,摄像机不存在),则飞机将停止执行航向点动作,如果存在方向点动作,飞机将继续前进到下一个航向点动作。
4)ROTATE_AIRCRAFT
旋转飞机的偏航,旋转方向由上面设置的turnmode决定,范围在[-180,180].
5)GIMBAL_PITCH
旋转万向节的角度,范围在[-90,0]。
(2)actionParam:
路径点动作的动作参数
1)STAY:
参数将确定飞机停留在[0,32767]毫秒范围内的时间(毫秒)。
2)START_TAKE_PHOTO
开始拍照片,执行此方法点操作的最大时间设置为6秒。
3)START_RECORD
开始录音,执行此方法点操作的最大时间设置为6秒。
4)ROTATE_AIRCRAFT
范围在[-180,180]
5)GIMBAL_PITCH
旋转万向节的角度,范围在[-90,0]。
Waypoint waypoint1 = new Waypoint(v, v1, v2); Waypoint waypoint2 = new Waypoint(v, v1, v2); //航向 waypoint1.heading =50; //角半径 waypoint1.cornerRadiusInMeters =0.2f wp.getWaypocornerRadiusInMeters(); //转弯模式 顺时针:WaypointTurnMode.CLOCKWISE 逆时针WaypointTurnMode.COUNTER_CLOCKWISE waypoint1.turnMode=WaypointTurnMode.COUNTER_CLOCKWIS; //俯仰角 waypoint1.gimbalPitch = -50; //航点动作 waypoint1.addAction(new WaypointAction(WaypointActionType.STAY,100));
三、WaypointMission构造:
1、添加航点:
1.addWaypoint(waypoint)
传入一组wayPoint的list,就是传入一组航点,然后任务按照航点顺序去执行,一个wayPoint代表一个航点。飞机会按照上面制定的航点按顺序去执行任务,目前消费级无人机最多支持99个航点设置。
至少要添二个点否则loadmission的时候会出错。
2、定义飞机如何前往第一个航点:
1.gotoFirstWaypointMode()
(1)SAFELY:
安全地去路上。如果当前的高度较低,则飞机将上升到航向点的同一高度。然后,它从当前高度进入路径点坐标,然后继续到路径点的高度。
(2)POINT_TO_POINT:
从当前的飞机点直接转到航路点。
3、定义飞机执行所有的航点后的动作:
1.finishedAction()
(1)NO_ACTION:
在完成任务后,将不再采取进一步行动。此时,飞机可由遥控器控制。
(2)GO_HOME:
任务完成后,飞机将返航。如果飞机离返回点有超过20米的距离,它就会回家着陆。否则,它将直接降落在目前的位置。
(3)AUTO_LAND:
飞机将在最后一个方向自动着陆。
(4)GO_FIRST_WAYPOINT:
飞机将返回其第一个航向,并在适当位置盘旋。。
(5)CONTINUE_UNTIL_END:
当飞机到达最后一个航点时,它将在不结束任务的情况下盘旋。操纵杆仍然可以用来把飞机沿着以前的航向向后拉。唯一能结束这一任务的方法就是召唤停止任务。
4、航点间的航线设置:
1.headingMode()
(1)AUTO:
飞机的航向总是在飞行方向。
(2)USING_INITIAL_DIRECTION:
当到达第一个航向点时,飞机的航向将被设置为航向。在到达第一个航向点之前,飞机的航向可以由遥控器控制。当飞机到达第一个航向点时,航向将固定。
(3)CONTROL_BY_REMOTE_CONTROLLER:
飞机的航向将由遥控器控制。
(4)USING_WAYPOINT_HEADING:
飞机的航向将逐渐设置为下一个航向,同时在两个相邻的航路点之间飞行。
(5)TOWARD_POINT_OF_INTEREST:
飞机的航向总是指向感兴趣的点。
5、飞行路径模式:
1.flightPathMode()
(1)NORMAL:
飞行路线将是正常的,飞机将从一个方向移动到下一个直线。
(2)CURVED:
飞行路径将是弯曲的,飞机将以弯曲运动从一个路径点移动到下一个路径点。但是需要配合 waypoint 的 cornerRadiusInMeters。
6、最大飞行速度:
1.maxFlightSpeed()
当飞机在航路点之间飞行时,你可以使用遥控器上的油门操纵杆来抵消它的速度。getMaxFlightSpeed这是当操纵杆被推到最大偏转时的偏移量。例如,如果最大飞行速度为10米/秒,那么一路推油门操纵杆会使飞机速度增加10米/秒,而向下推则会从飞机速度中减去10米/秒。如果遥控器杆没有最大挠度,那么偏移速度将在[0,getMaxFlightSpeed]分辨率为1000步。如果偏移速度为负值,则飞机将返回到以前的航向点。当它到达第一个路径点时,它将在适当的位置盘旋,直到正速度被应用。getMaxFlightSpeed范围为[2,15]米/秒。
7、校验设置的参数:
1.checkParameters()
WaypointMission waypointMission = new WaypointMission.Builder() //航点 //一定要加入俩个点以上否则不能成功执行航线任务 .addWaypoint(waypoint1) .addWaypoint(waypoint2) .waypointCount(2) //定义飞机如何前往第一个航点 .gotoFirstWaypointMode(WaypointMissionGotoWaypointMode.SAFELY) //定义飞机执行所有的航点后的动作 .finishedAction(WaypointMissionFinishedAction.GO_HOME) //航点间的航线设置 .headingMode(WaypointMissionHeadingMode.AUTO) //飞行路径模式 .flightPathMode(WaypointMissionFlightPathMode.NORMAL) .maxFlightSpeed(10) .build(); if (waypointMission.checkParameters()!=null){
Log.d(TAG,"misson任务无效:"+waypointMission.checkParameters()); }
四、WaypointMission的上传和执行和状态监听:
operator是管理的。控制、运行和监视Waypoint任务的唯一对象。可以从MissionControl获取。
1、加载任务
1.loadMission()
加载WaypointMission到设备内存中。这也验证了任务的所有信息。如果有不正确的地方,callback.result()将被调用并伴有错误。否则,callback.result()将以空值调用。即使在WaypointMission执行完成后,任务对象仍将留在设备内存中。
2、上传任务
1.uploadMission()
开始向飞机上传getLoadedMission。它只能在getLoadedMission完成且getCurrentState为READY_TO_UPLOAD时被调用。如果在上一个上传过程中发生超时错误,上传操作将从上一个断点恢复。成功上传任务后,WaypointMissionState将变为READY_TO_EXECUTE。
3、开始任务
1.startMission()
开始执行上传的任务。它只能在getCurrentState是READY_TO_EXECUTE时调用。任务成功启动后,getCurrentState变成EXECUTING。
4、暂停任务
1.pauseMission()
暂停执行任务。只能在WaypointMissionState为EXECUTING的时候。任务成功暂停后,getCurrentState会变成EXECUTION_PAUSED。
5、恢复暂停的任务
1.resumeMission()
恢复暂停的任务。只能在getCurrentState是EXECUTION_PAUSED的时候。任务成功恢复后,getCurrentState会变成EXECUTING。
6、设置飞行速度
1.setAutoFlightSpeed(float speed,callback)
7、任务状态监听
1.addListener()
(1)onUploadUpdate:
当上传事件发生时调用。
(2)onDownloadUpdate:
当上传事件发生时调用。
(3)onExecutionStart:
当上传事件发生时调用。
(4)onExecutionUpdate:
当上传事件发生时调用。
(5)onExecutionFinish:
当上传事件发生时调用。
DJIError loadError= Operator.loadMission(waypointMission); if (loadError!=null){
Log.d(TAG,"任务加载失败"+loadError.toString()); }else {
Operator.uploadMission(new CommonCallbacks.CompletionCallback() {
@Override public void onResult(DJIError djiError) {
if (djiError!=null){
Log.d(TAG,"任务上传失败"+djiError.toString()); }else {
Log.d(TAG,"任务上传成功"); } } }); } Operator.addListener(new WaypointMissionOperatorListener() {
@Override public void onDownloadUpdate(WaypointMissionDownloadEvent waypointMissionDownloadEvent) {
} public void onUploadUpdate(WaypointMissionUploadEvent waypointMissionUploadEvent) {
Log.d(TAG,waypointMissionUploadEvent.getCurrentState().toString()); if (waypointMissionUploadEvent.getCurrentState().equals(WaypointMissionState.READY_TO_EXECUTE)){
Operator.startMission((DJIError djiError) -> {
if (null == djiError) {
Toast.makeText(getApplicationContext(), "任务开始执行", Toast.LENGTH_SHORT).show(); Log.d(TAG, "任务开始执行"); } else {
Log.d(TAG, "任务执行失败" + djiError.toString()); } }); } } @Override public void onExecutionUpdate(WaypointMissionExecutionEvent waypointMissionExecutionEvent) {
} @Override public void onExecutionStart() {
} @Override public void onExecutionFinish(DJIError djiError) {
} });
Tags:DJI WapointMission
五、
1、两个航点之间允许设定的最大距离为2km,最小距离为0.5m,最多设定99个航点,但是P4R可以设定200个航点,单条航线最长距离为40km。
2、DJI用的坐标系为WGS84。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205590.html原文链接:https://javaforall.net
