| | |
| | | private Timer steeringControlTimer; // 转向控制定时器 |
| | | private int targetForwardSpeed = 0; // 目标前进/后退速度 |
| | | private int targetSteeringSpeed = 0; // 目标转向速度 |
| | | // 独立跟踪每个摇杆的当前速度,避免相互影响 |
| | | private int independentForwardSpeed = 0; // 独立的前进速度(不受转向摇杆影响) |
| | | private int independentSteeringSpeed = 0; // 独立的转向速度(不受前进摇杆影响) |
| | | private List<JButton> bladeButtons = new ArrayList<>(); // 存储刀盘控制按钮,用于清理定时器 |
| | | private String bladeUpDefaultText = "刀盘升"; // 刀盘升按钮默认文字 |
| | | private String bladeDownDefaultText = "刀盘降"; // 刀盘降按钮默认文字 |
| | |
| | | moveJoystick.setJoystickListener(new JoystickListener() { |
| | | @Override |
| | | public void onJoystickMoved(double x, double y) { |
| | | // 只使用Y轴控制前进后退,向上(北)为正 |
| | | // 计算并四舍五入到整数速度值,正为前进,负为后退 |
| | | // 只使用Y轴控制前进后退 |
| | | // y值范围:-1.0(向上)到 1.0(向下) |
| | | // 计算速度值:向下(y>0)为后退(负值),向上(y<0)为前进(正值) |
| | | // 后退值范围:0 到 -100,前进值范围:0 到 100 |
| | | int forwardVal = (int) Math.round(-y * 100.0); |
| | | // 限制在 [-100, 100] |
| | | forwardVal = Math.max(-100, Math.min(100, forwardVal)); |
| | | |
| | | // 更新目标速度 |
| | | targetForwardSpeed = forwardVal; |
| | | |
| | | if (Math.abs(y) > 0.1) { |
| | | // 摇杆不在中心位置,启动持续发送定时器 |
| | | startForwardControlTimer(); |
| | | } else { |
| | | // 摇杆回到中心位置,停止发送 |
| | | stopForwardControlTimer(); |
| | | stopForward(); |
| | | // 死区处理:如果速度值在-10到10之间,视为0(避免微小抖动) |
| | | if (Math.abs(forwardVal) <= 10) { |
| | | forwardVal = 0; |
| | | } |
| | | |
| | | // 更新顶部显示(移动显示当前前进/后退速度,转向取当前转向速度作为参考) |
| | | int steeringVal = Control03.getCurrentSteeringSpeed(); |
| | | updateJoystickValues(forwardVal, steeringVal); |
| | | // 更新目标速度和独立速度 |
| | | targetForwardSpeed = forwardVal; |
| | | independentForwardSpeed = forwardVal; |
| | | |
| | | if (forwardVal != 0) { |
| | | // 摇杆不在死区,启动持续发送定时器 |
| | | // 后退时 forwardVal 为负值(-100到-11),前进时 forwardVal 为正值(11到100) |
| | | startForwardControlTimer(); |
| | | } else { |
| | | // 摇杆在死区或中心位置,停止定时器 |
| | | stopForwardControlTimer(); |
| | | // 将独立的前进速度设置为0 |
| | | independentForwardSpeed = 0; |
| | | // 发送停止指令(保持转向速度不变) |
| | | Control03.setAndSendSpeeds(independentSteeringSpeed, 0); |
| | | } |
| | | |
| | | // 更新顶部显示(使用独立的速度值) |
| | | updateJoystickValues(forwardVal, independentSteeringSpeed); |
| | | } |
| | | }); |
| | | // 转向摇杆(蓝色主题) |
| | |
| | | turnJoystick.setJoystickListener(new JoystickListener() { |
| | | @Override |
| | | public void onJoystickMoved(double x, double y) { |
| | | // 只使用X轴控制左右转向,向右为正 |
| | | // 计算并四舍五入到整数转向值,正为右转,负为左转 |
| | | // 只使用X轴控制左右转向 |
| | | // x值范围:-1.0(向左)到 1.0(向右) |
| | | // 计算转向值:向左(x<0)为左转(负值),向右(x>0)为右转(正值) |
| | | // 左转值范围:0 到 -100,右转值范围:0 到 100 |
| | | int steeringVal = (int) Math.round(x * 100.0); |
| | | steeringVal = Math.max(-100, Math.min(100, steeringVal)); |
| | | |
| | | // 更新目标速度 |
| | | targetSteeringSpeed = steeringVal; |
| | | |
| | | if (Math.abs(x) > 0.1) { |
| | | // 摇杆不在中心位置,启动持续发送定时器 |
| | | startSteeringControlTimer(); |
| | | } else { |
| | | // 摇杆回到中心位置,停止发送 |
| | | stopSteeringControlTimer(); |
| | | stopSteering(); |
| | | // 死区处理:如果速度值在-10到10之间,视为0(避免微小抖动) |
| | | if (Math.abs(steeringVal) <= 10) { |
| | | steeringVal = 0; |
| | | } |
| | | |
| | | // 更新顶部显示(转向显示当前转向速度,移动显示当前前进速度) |
| | | int forwardVal = Control03.getCurrentForwardSpeed(); |
| | | updateJoystickValues(forwardVal, steeringVal); |
| | | // 更新目标速度和独立速度 |
| | | targetSteeringSpeed = steeringVal; |
| | | independentSteeringSpeed = steeringVal; |
| | | |
| | | if (steeringVal != 0) { |
| | | // 摇杆不在死区,启动持续发送定时器 |
| | | // 左转时 steeringVal 为负值(-100到-11),右转时 steeringVal 为正值(11到100) |
| | | startSteeringControlTimer(); |
| | | } else { |
| | | // 摇杆在死区或中心位置,停止定时器 |
| | | stopSteeringControlTimer(); |
| | | // 将独立的转向速度设置为0 |
| | | independentSteeringSpeed = 0; |
| | | // 发送停止指令(保持前进速度不变) |
| | | Control03.setAndSendSpeeds(0, independentForwardSpeed); |
| | | } |
| | | |
| | | // 更新顶部显示(使用独立的速度值) |
| | | updateJoystickValues(independentForwardSpeed, steeringVal); |
| | | } |
| | | }); |
| | | joystickPanel.add(moveJoystick); |
| | |
| | | } |
| | | |
| | | private void stopForward() { |
| | | if (Control03.getCurrentForwardSpeed() != 0) { |
| | | boolean success = Control03.approachForwardSpeedToZero(20); |
| | | if (!success) { |
| | | showSerialClosedWarning(); |
| | | return; |
| | | } |
| | | serialWarningShown = false; |
| | | } |
| | | // 将独立的前进速度设置为0,保持转向速度不变 |
| | | independentForwardSpeed = 0; |
| | | Control03.setAndSendSpeeds(independentSteeringSpeed, 0); |
| | | } |
| | | |
| | | private void applySteeringSpeed(int speed) { |
| | |
| | | } |
| | | |
| | | private void stopSteering() { |
| | | if (Control03.getCurrentSteeringSpeed() != 0) { |
| | | boolean success = Control03.approachSteeringSpeedToZero(25); |
| | | if (!success) { |
| | | showSerialClosedWarning(); |
| | | return; |
| | | } |
| | | serialWarningShown = false; |
| | | } |
| | | // 将独立的转向速度设置为0,保持前进速度不变 |
| | | independentSteeringSpeed = 0; |
| | | Control03.setAndSendSpeeds(0, independentForwardSpeed); |
| | | } |
| | | |
| | | /** |
| | |
| | | * 持续发送前进/后退速度指令 |
| | | */ |
| | | private void applyForwardSpeedContinuously(int targetSpeed) { |
| | | int currentSpeed = Control03.getCurrentForwardSpeed(); |
| | | int currentSteeringSpeed = Control03.getCurrentSteeringSpeed(); |
| | | // 更新独立的前进速度 |
| | | independentForwardSpeed = targetSpeed; |
| | | |
| | | // 如果已经达到目标速度,直接发送一次以保持状态 |
| | | if (currentSpeed == targetSpeed) { |
| | | // 直接发送目标速度指令以保持状态(即使速度相同也要发送) |
| | | Control03.setAndSendSpeeds(currentSteeringSpeed, targetSpeed); |
| | | } else { |
| | | // 逐步调整到目标速度 |
| | | int delta = targetSpeed > currentSpeed ? 10 : -10; |
| | | Control03.adjustForwardSpeed(delta); |
| | | } |
| | | // 使用独立的转向速度(不受前进摇杆影响),只更新前进速度 |
| | | // 这样前进摇杆的操作不会影响转向速度 |
| | | Control03.setAndSendSpeeds(independentSteeringSpeed, independentForwardSpeed); |
| | | } |
| | | |
| | | /** |
| | | * 持续发送转向速度指令 |
| | | */ |
| | | private void applySteeringSpeedContinuously(int targetSpeed) { |
| | | int currentSpeed = Control03.getCurrentSteeringSpeed(); |
| | | int currentForwardSpeed = Control03.getCurrentForwardSpeed(); |
| | | // 更新独立的转向速度 |
| | | independentSteeringSpeed = targetSpeed; |
| | | |
| | | // 如果已经达到目标速度,直接发送一次以保持状态 |
| | | if (currentSpeed == targetSpeed) { |
| | | // 直接发送目标速度指令以保持状态(即使速度相同也要发送) |
| | | Control03.setAndSendSpeeds(targetSpeed, currentForwardSpeed); |
| | | } else { |
| | | // 逐步调整到目标速度 |
| | | int delta = targetSpeed > currentSpeed ? 15 : -15; |
| | | Control03.adjustSteeringSpeed(delta); |
| | | } |
| | | // 使用独立的前进速度(不受转向摇杆影响),只更新转向速度 |
| | | // 这样转向摇杆的操作不会影响前进速度 |
| | | Control03.setAndSendSpeeds(independentSteeringSpeed, independentForwardSpeed); |
| | | } |
| | | |
| | | // 更新顶部显示的摇杆数值(在 EDT 上调用),文字根据数值映射为方向描述 |