ard-admin/src/main/java/com/ard/web/controller/work/UavManualFlyController.java
@@ -108,6 +108,25 @@ return AjaxResult.success(); } @ApiOperation(value = "开始环绕飞行", notes = "速度speed:0~20 单位m/s " + "环绕半径radius:单位m,"+ "飞行模式flyMode:0-节能模式【飞机直线飞到目标点,需飞机在空中】," + "1-安全模式【飞机飞行至目标点高度再平飞到目标点,飞机可以在地面或空中】 默认为节能模式") @ApiOperationSupport(order = 9) @PostMapping("/flyRoundControl") public AjaxResult flyRoundControl(@RequestBody FlyRoundControlDTO flyRoundControlDTO) { tyService.FlyRoundControl(flyRoundControlDTO); return AjaxResult.success(); } @ApiOperation("停止环绕飞行") @ApiOperationSupport(order = 10) @PostMapping("/flyRoundControlCancel") public AjaxResult flyRoundControlCancel(@RequestBody FlyRoundControlCancelDTO flyRoundControlCancelDTO) { tyService.FlyRoundControlCancel(flyRoundControlCancelDTO); return AjaxResult.success(); } @ApiOperation(value = "紧急制动", notes = "动作参数actionParam: 0-解除紧急制动 1-紧急制动") @ApiOperationSupport(order = 11) @PostMapping("/emeragencyBrake") ard-work/src/main/java/com/ard/work/component/netty/command/manual/FlyRoundControlCancelCmd.java
New file @@ -0,0 +1,33 @@ package com.ard.work.component.netty.command.manual; import com.ard.work.component.netty.command.BaseCmd; import com.ard.work.domain.dto.manual.FlyRoundControlCancelDTO; import com.ard.work.domain.dto.manual.FlyRoundControlDTO; import io.netty.buffer.ByteBuf; /** * 环绕飞行控制指令 * * @author liusuyi * @date 2024年10月26日15:43 **/ public class FlyRoundControlCancelCmd extends BaseCmd { public FlyRoundControlCancelCmd(FlyRoundControlCancelDTO flyRoundControlCancelDTO) { setDataHeader((short) 0x7479); setDataLength((short) 18); setBoxSn(flyRoundControlCancelDTO.getBoxSn().getBytes()); setCmdCode((byte) 0xD1); } public void encode(ByteBuf out) { out.writeShort(getDataHeader()); // 写入数据头 out.writeShort(getDataLength()); // 写入数据长度 out.writeBytes(getBoxSn()); // 写入盒子SN out.writeByte(getCmdCode()); // 写入命令码 out.writeByte(0x00); // 写入加密标志 out.writeByte(0x3C); // 写入动作编号 } } ard-work/src/main/java/com/ard/work/component/netty/command/manual/FlyRoundControlCmd.java
New file @@ -0,0 +1,50 @@ package com.ard.work.component.netty.command.manual; import com.ard.work.component.netty.command.BaseCmd; import com.ard.work.domain.dto.manual.FlyPointControlDTO; import com.ard.work.domain.dto.manual.FlyRoundControlDTO; import io.netty.buffer.ByteBuf; /** * 环绕飞行控制指令 * * @author liusuyi * @date 2024年10月26日15:43 **/ public class FlyRoundControlCmd extends BaseCmd { private final double longitude; // 兴趣点经度 private final double latitude; // 兴趣点纬度 private final float altitude; // 兴趣点高度 private final float speed; // 环绕速度 private final float radius; // 环绕半径 private final byte flyMode; // 飞行模式 public FlyRoundControlCmd(FlyRoundControlDTO flyRoundControlDTO) { setDataHeader((short) 0x7479); setDataLength((short) 47); setBoxSn(flyRoundControlDTO.getBoxSn().getBytes()); setCmdCode((byte) 0xD1); this.longitude = flyRoundControlDTO.getLongitude(); this.latitude = flyRoundControlDTO.getLatitude(); this.altitude = flyRoundControlDTO.getAltitude(); this.speed = flyRoundControlDTO.getSpeed(); this.radius= flyRoundControlDTO.getRadius(); this.flyMode = flyRoundControlDTO.getFlyMode(); } public void encode(ByteBuf out) { out.writeShort(getDataHeader()); // 写入数据头 out.writeShort(getDataLength()); // 写入数据长度 out.writeBytes(getBoxSn()); // 写入盒子SN out.writeByte(getCmdCode()); // 写入命令码 out.writeByte(0x00); // 写入加密标志 out.writeByte(0x3B); // 写入动作编号 out.writeDouble(longitude); // 写入兴趣点经度 out.writeDouble(latitude); // 写入兴趣点纬度 out.writeFloat(altitude); // 写入兴趣点高度 out.writeFloat(speed); // 写入环绕速度 out.writeFloat(radius); // 写入环绕半径 out.writeByte(flyMode); // 写入飞行模式 } } ard-work/src/main/java/com/ard/work/component/netty/command/manual/FlyRoundReplyCmd.java
New file @@ -0,0 +1,35 @@ package com.ard.work.component.netty.command.manual; import com.ard.work.component.netty.command.BaseCmd; import io.netty.buffer.ByteBuf; import lombok.Data; import lombok.EqualsAndHashCode; /** * 到达环绕位置回复指令 * * @author liusuyi * @date 2024年10月26日15:43 **/ @Data @EqualsAndHashCode(callSuper = false) public class FlyRoundReplyCmd extends BaseCmd { private final byte encryptFlag = 0x00; // 加密标志 private final byte actionCode = 0x3B; // 动作编号 private final byte result; // 执行结果 private final Integer errorCode; // 错误码 public FlyRoundReplyCmd(String boxSn, Byte result, Integer errorCode) { setDataHeader((short) 0x6A77); setDataLength((short) 19); setBoxSn(boxSn.getBytes()); setCmdCode((byte) 0xD1); this.result = result; this.errorCode = errorCode; } public void encode(ByteBuf out) { } } ard-work/src/main/java/com/ard/work/component/netty/handler/MessageProtocolDecoder.java
@@ -174,6 +174,8 @@ return new EmergencyBrakeReplyCmd(boxSn, result, errorCode); case 0x39: return new PointControlReachedReplyCmd(boxSn, result, errorCode); case 0x3B: return new FlyRoundReplyCmd(boxSn, result, errorCode); case 0x22: return new CameraModeReplyCmd(boxSn, result, errorCode); case 0x23: ard-work/src/main/java/com/ard/work/domain/dto/manual/FlyRoundControlCancelDTO.java
New file @@ -0,0 +1,22 @@ package com.ard.work.domain.dto.manual; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; /** * 环绕飞行控制实体对象 * * @author liusuyi * @date 2024年10月26日9:02 **/ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class FlyRoundControlCancelDTO { private String boxSn; } ard-work/src/main/java/com/ard/work/domain/dto/manual/FlyRoundControlDTO.java
New file @@ -0,0 +1,51 @@ package com.ard.work.domain.dto.manual; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; /** * 环绕飞行控制实体对象 * * @author liusuyi * @date 2024年10月26日9:02 **/ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class FlyRoundControlDTO { private String boxSn; /** * 兴趣点经度 */ private Double longitude; /** * 兴趣点纬度 */ private Double latitude; /** * 兴趣点高度 */ private Float altitude; /** * 环绕速度 */ private Float speed; /** * 环绕半径 */ private Float radius; /** * 飞行模式 */ @Builder.Default private byte flyMode = 0; } ard-work/src/main/java/com/ard/work/service/ITyService.java
@@ -206,6 +206,17 @@ */ Boolean flyPointControlCancel(FlyPointControlCancelDTO flyPointControlCancelDTO); /** * 环绕飞行控制 */ Boolean FlyRoundControl(FlyRoundControlDTO flyRoundControlDTO); /** * 停止环绕飞行 */ Boolean FlyRoundControlCancel(FlyRoundControlCancelDTO flyRoundControlCancelDTO); /** * 紧急制动 */ ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java
@@ -603,6 +603,37 @@ return true; } /** * 环绕飞行控制 */ @Override public Boolean FlyRoundControl(FlyRoundControlDTO flyRoundControlDTO) { String boxSn = flyRoundControlDTO.getBoxSn(); ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(boxSn); if (ardDroneInfo == null) { throw new ControlException("未找到对应的飞行器信息,boxSn:{}" + boxSn); } FlyRoundControlCmd flyPointControlCmd = new FlyRoundControlCmd(flyRoundControlDTO); this.sendMessage(ardDroneInfo.getServerId(), flyPointControlCmd); return true; } /** * 停止环绕飞行控制 */ @Override public Boolean FlyRoundControlCancel(FlyRoundControlCancelDTO flyRoundControlCancelDTO) { String boxSn = flyRoundControlCancelDTO.getBoxSn(); ArdDroneInfo ardDroneInfo = ardDroneService.selectArdDroneByboxSn(boxSn); if (ardDroneInfo == null) { throw new ControlException("未找到对应的飞行器信息,boxSn:{}" + boxSn); } FlyRoundControlCancelCmd flyRoundControlCancelCmd = new FlyRoundControlCancelCmd(flyRoundControlCancelDTO); this.sendMessage(ardDroneInfo.getServerId(), flyRoundControlCancelCmd); return true; } /** * 紧急制动 */ @@ -1042,6 +1073,12 @@ logPrint("设置返航点", returnPointSettingReplyCmd.getResult(), returnPointSettingReplyCmd.getErrorCode()); } //到达环绕位置回复 if (tyCommand instanceof FlyRoundReplyCmd) { FlyRoundReplyCmd flyRoundReplyCmd = (FlyRoundReplyCmd) tyCommand; logPrint("到达环绕位置", flyRoundReplyCmd.getResult(), flyRoundReplyCmd.getErrorCode()); } break; case (byte) 0xD2: //设置视频码流回复