guoshilong
2023-11-15 55be62c63d9faedb48d47dd1c18cf1a74e3eea6c
图斑多点飞行,拍照
6 files modified
106 ■■■■ changed files
src/main/java/com/dji/sample/control/service/IControlService.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java 63 ●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/wayline/controller/WaylineJobController.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/wayline/model/param/FlyAreaParam.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/wayline/service/IWaylineJobService.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java 22 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/control/service/IControlService.java
@@ -43,7 +43,7 @@
     * @param headers
     * @return
     */
    CommonTopicReceiver handleFlyToPointProgress(CommonTopicReceiver receiver, MessageHeaders headers);
    CommonTopicReceiver handleFlyToPointProgress(CommonTopicReceiver receiver, MessageHeaders headers) throws Exception;
    /**
     * Control the drone to take off.
@@ -63,6 +63,7 @@
    /**
     * Seize the control authority of the drone or the payload control authority.
     * 抢占无人机控制权限或有效载荷控制权限
     * @param sn
     * @param authority
     * @param param
@@ -79,4 +80,13 @@
    ResponseResult requestsConfig(String sn,String method, RequestsParam param);
    /**
     * 拍照
     * @param sn
     * @param payloadIndex
     * @return
     * @throws Exception
     */
     ResponseResult takePhoto(String sn,String payloadIndex) throws Exception;
}
src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSONObject;
import com.dji.sample.common.error.CommonErrorEnum;
import com.dji.sample.common.model.ResponseResult;
import com.dji.sample.common.util.SpringBeanUtils;
import com.dji.sample.component.mqtt.model.*;
import com.dji.sample.component.mqtt.service.IMessageSenderService;
import com.dji.sample.component.redis.RedisConst;
@@ -13,10 +14,7 @@
import com.dji.sample.control.model.dto.PointDTO;
import com.dji.sample.control.model.dto.ResultNotifyDTO;
import com.dji.sample.control.model.dto.TakeoffProgressReceiver;
import com.dji.sample.control.model.enums.DroneAuthorityEnum;
import com.dji.sample.control.model.enums.DroneControlMethodEnum;
import com.dji.sample.control.model.enums.FlyToStatusEnum;
import com.dji.sample.control.model.enums.RemoteDebugMethodEnum;
import com.dji.sample.control.model.enums.*;
import com.dji.sample.control.model.param.*;
import com.dji.sample.control.service.IControlService;
import com.dji.sample.manage.model.dto.DeviceDTO;
@@ -189,7 +187,7 @@
    }
    @ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_FLY_TO_POINT_PROGRESS, outputChannel = ChannelName.OUTBOUND_EVENTS)
    public CommonTopicReceiver handleFlyToPointProgress(CommonTopicReceiver receiver, MessageHeaders headers) {
    public CommonTopicReceiver handleFlyToPointProgress(CommonTopicReceiver receiver, MessageHeaders headers) throws Exception {
        String dockSn = receiver.getGateway();
        Optional<DeviceDTO> deviceOpt = deviceRedisService.getDeviceOnline(dockSn);
@@ -213,13 +211,14 @@
            if (jsonObject != null) {
                List<PointPOJO> targetList = (List<PointPOJO>) jsonObject.get("targetList");
                int curIndex = (Integer) jsonObject.get("curIndex");
                flyToNextPoint(targetList, curIndex, dockSn);
                String payloadIndex = jsonObject.getString("payloadIndex");
                flyToNextPoint(targetList, curIndex, dockSn, payloadIndex);
            }
        }
        return receiver;
    }
    private ResponseResult flyToNextPoint(List<PointPOJO> targetList, int curIndex, String sn) {
    private ResponseResult flyToNextPoint(List<PointPOJO> targetList, int curIndex, String sn, String payloadIndex) throws Exception {
        curIndex = curIndex + 1;
        //当无人机状态为人工时再发布下一个命令
        while (true) {
@@ -234,8 +233,7 @@
                    RedisOpsUtils.del("tuban:" + sn);
                    return returnHome;
                }
                else {
                } else {
                    //当前不是最后一个点,飞行到下一个点
                    FlyToPointParam flyToPointParam = new FlyToPointParam();
                    flyToPointParam.setMaxSpeed(14);
@@ -248,22 +246,67 @@
                    pointDTOS.add(pointDTO);
                    flyToPointParam.setPoints(pointDTOS);
                    //执行拍照
                    ResponseResult responseResult = takePhoto(sn, payloadIndex);
                    //发布下一个飞行指令
                    ResponseResult flyToRes = flyToPoint(sn, flyToPointParam);
                    if (flyToRes.getCode() == ResponseResult.CODE_SUCCESS) {
                        JSONObject jsonObject = new JSONObject();
                        jsonObject.put("targetList", targetList);
                        jsonObject.put("curIndex", curIndex);
                        jsonObject.put("payloadIndex",payloadIndex);
                        RedisOpsUtils.set("tuban:" + sn, jsonObject);
                    }
                    return flyToRes;
                }
            }
        }
    }
    @Override
    public ResponseResult takePhoto(String sn, String payloadIndex) throws Exception {
        //获取负载控制权
        DronePayloadParam dronePayloadParam = new DronePayloadParam();
        dronePayloadParam.setPayloadIndex(payloadIndex);
        ResponseResult seizeAuthorityRes = seizeAuthority(sn, DroneAuthorityEnum.PAYLOAD, dronePayloadParam);
        //切换为相机模式
        if (seizeAuthorityRes.getCode() != ResponseResult.CODE_SUCCESS) {
            return seizeAuthorityRes;
        }
        PayloadCommandsParam payloadCommandsParam = new PayloadCommandsParam();
//            DronePayloadParam switchParam = new DronePayloadParam();
//            switchParam.setCameraMode(CameraModeEnum.PHOTO);
//            switchParam.setPayloadIndex(payloadIndex);
//            payloadCommandsParam.setSn(sn);
//            payloadCommandsParam.setCmd(PayloadCommandsEnum.CAMERA_MODE_SWitCH);
//            payloadCommandsParam.setData(switchParam);
//
//            ResponseResult switchModeRes = payloadCommands(payloadCommandsParam);
//            if (switchModeRes.getCode() != ResponseResult.CODE_SUCCESS){
//                return  switchModeRes;
//            }
        //拍照
        payloadCommandsParam.setCmd(PayloadCommandsEnum.CAMERA_PHOTO_TAKE);
        DronePayloadParam takePhotoParam = new DronePayloadParam();
        takePhotoParam.setPayloadIndex(payloadIndex);
        payloadCommandsParam.setData(takePhotoParam);
        payloadCommandsParam.setSn(sn);
        ResponseResult responseResult = payloadCommands(payloadCommandsParam);
        return responseResult;
    }
    private void checkTakeoffCondition(String dockSn) {
        Optional<DeviceDTO> dockOpt = deviceRedisService.getDeviceOnline(dockSn);
src/main/java/com/dji/sample/wayline/controller/WaylineJobController.java
@@ -191,7 +191,7 @@
     */
    @PostMapping("/{sn}/jobs/{device_sn}/flyByArea")
    @SysLogAnnotation(operModul = "根据区域飞行", operType = "根据区域飞行", operDesc = "根据区域飞行")
    public ResponseResult flyByArea(@PathVariable(name = "sn") String sn, @RequestBody FlyAreaParam flyAreaParam,@PathVariable(name = "device_sn")String deviceSn) {
        return waylineJobService.flyByArea(sn, flyAreaParam,deviceSn);
    public ResponseResult flyByArea(@PathVariable(name = "sn") String sn, @RequestBody FlyAreaParam flyAreaParam,@PathVariable(name = "device_sn")String deviceSn)throws Exception {
            return waylineJobService.flyByArea(sn, flyAreaParam,deviceSn);
    }
}
src/main/java/com/dji/sample/wayline/model/param/FlyAreaParam.java
@@ -18,4 +18,7 @@
    private  Double radius;
    @JsonProperty(value = "jsonPath")
    private String jsonPath;
    @JsonProperty(value = "payloadIndex")
    private String payloadIndex;
}
src/main/java/com/dji/sample/wayline/service/IWaylineJobService.java
@@ -168,7 +168,7 @@
    void updateJobCollect(WaylineJobEntity waylineJob);
    ResponseResult flyByArea(String sn, FlyAreaParam flyAreaParam,String deviceSn);
    ResponseResult flyByArea(String sn, FlyAreaParam flyAreaParam,String deviceSn) throws Exception;
    /**
     * 判断是否有下一次任务
src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java
@@ -12,14 +12,16 @@
import com.dji.sample.common.model.Pagination;
import com.dji.sample.common.model.PaginationData;
import com.dji.sample.common.model.ResponseResult;
import com.dji.sample.common.util.SpringBeanUtils;
import com.dji.sample.component.mqtt.model.*;
import com.dji.sample.component.mqtt.service.IMessageSenderService;
import com.dji.sample.component.redis.RedisConst;
import com.dji.sample.component.redis.RedisOpsUtils;
import com.dji.sample.control.model.dto.PointDTO;
import com.dji.sample.control.model.param.DrcModeParam;
import com.dji.sample.control.model.param.FlyToPointParam;
import com.dji.sample.control.model.param.TakeoffToPointParam;
import com.dji.sample.control.model.enums.CameraModeEnum;
import com.dji.sample.control.model.enums.DroneAuthorityEnum;
import com.dji.sample.control.model.enums.PayloadCommandsEnum;
import com.dji.sample.control.model.param.*;
import com.dji.sample.control.service.IControlService;
import com.dji.sample.control.service.IDrcService;
import com.dji.sample.geo.entity.GeoJson;
@@ -701,7 +703,7 @@
    }
    @Override
    public ResponseResult flyByArea(String sn, FlyAreaParam flyAreaParam, String deviceSn) {
    public ResponseResult flyByArea(String sn, FlyAreaParam flyAreaParam, String deviceSn) throws Exception {
        //获取所有中心点
//        List<PointPOJO> targetList = GeoUtils.caculatePointList(flyAreaParam);
@@ -738,25 +740,17 @@
                if (flyToRes.getCode() == ResponseResult.CODE_SUCCESS) {
                    //第一个点指令飞行成功后,把数组存到redis中
                    /**
                     * {
                     *      targetList:[],
                     *      curIndex:
                     * }
                     */
                    JSONObject jsonObject = new JSONObject();
                    jsonObject.put("targetList",targetList);
                    jsonObject.put("payloadIndex",flyAreaParam.getPayloadIndex());
                    jsonObject.put("curIndex",0);
                    RedisOpsUtils.set("tuban:"+sn,jsonObject);
                }
                break;
            }
        }
        return ResponseResult.success();
        return ResponseResult.success(targetList);
    }
    public TakeoffToPointParam buildTakeoffToPointParam(PointPOJO dockPoint) {