底盘控制参数改为 BASE_SPEED 和 YAW_VELOCITY,直接发布线速度和角速度
- MAX_LINEAR/MAX_ANGULAR/WHEEL_SEPARATION → BASE_SPEED/YAW_VELOCITY - CMD_WHEEL_TOPIC 话题名改为 /cmd_chassis - 移除前端轮速差计算,发布 [linear, angular] 由底盘自行解算左右轮速
This commit is contained in:
+3
-4
@@ -8,12 +8,11 @@ export const MJPEG_MANUAL_URL = 'http://192.168.0.11/stream?topic=/vision/result
|
||||
export const MJPEG_DEBUG_URL = 'http://192.168.0.11/stream?topic=/vision/debug_image&mode=debug'
|
||||
|
||||
// ROS 话题
|
||||
export const CMD_WHEEL_TOPIC = '/cmd_wheel'
|
||||
export const CMD_WHEEL_TOPIC = '/cmd_chassis'
|
||||
export const CMD_GIMBAL_TOPIC = '/cmd_gimbal'
|
||||
// 键盘控制参数
|
||||
export const MAX_LINEAR = 0.5 // m/s
|
||||
export const MAX_ANGULAR = 1.0 // rad/s
|
||||
export const WHEEL_SEPARATION = 0.2 // 轮距(m)
|
||||
export const BASE_SPEED = 0.5 // 直线基础速度
|
||||
export const YAW_VELOCITY = 1.0 // 角度速率,度每秒
|
||||
|
||||
// 云台角度速率 (度/秒)
|
||||
export const GIMBAL_PITCH_DEG_S = 10
|
||||
|
||||
@@ -24,7 +24,7 @@ import { onBeforeRouteLeave } from 'vue-router'
|
||||
import {
|
||||
MJPEG_MANUAL_URL, ROSBRIDGE_URL,
|
||||
CMD_WHEEL_TOPIC, CMD_GIMBAL_TOPIC,
|
||||
MAX_LINEAR, MAX_ANGULAR, WHEEL_SEPARATION,
|
||||
BASE_SPEED, YAW_VELOCITY,
|
||||
GIMBAL_PITCH_DEG_S, GIMBAL_YAW_DEG_S,
|
||||
API_GIMBAL_MODE_SWITCH, API_CHASSIS_MODE_SWITCH, API_LASER,
|
||||
} from '../config.js'
|
||||
@@ -38,7 +38,7 @@ connect(ROSBRIDGE_URL)
|
||||
const pressed = new Set()
|
||||
const laserOn = ref(false)
|
||||
let animId = null
|
||||
let lastVel = { left: 0, right: 0, pitch: 0, yaw: 0 }
|
||||
let lastVel = { linear: 0, angular: 0, pitch: 0, yaw: 0 }
|
||||
|
||||
function onKeyDown(e) {
|
||||
if (['KeyW','KeyA','KeyS','KeyD','ArrowUp','ArrowDown','ArrowLeft','ArrowRight'].includes(e.code)) {
|
||||
@@ -59,33 +59,29 @@ function onKeyUp(e) {
|
||||
}
|
||||
|
||||
function computeVelocities() {
|
||||
const linear = (pressed.has('KeyW') ? MAX_LINEAR : 0) - (pressed.has('KeyS') ? MAX_LINEAR : 0)
|
||||
const angular = (pressed.has('KeyA') ? MAX_ANGULAR : 0) - (pressed.has('KeyD') ? MAX_ANGULAR : 0)
|
||||
const linear = (pressed.has('KeyW') ? BASE_SPEED : 0) - (pressed.has('KeyS') ? BASE_SPEED : 0)
|
||||
const angular = (pressed.has('KeyA') ? YAW_VELOCITY : 0) - (pressed.has('KeyD') ? YAW_VELOCITY : 0)
|
||||
const pitch = (pressed.has('ArrowDown') ? GIMBAL_PITCH_DEG_S : 0) - (pressed.has('ArrowUp') ? GIMBAL_PITCH_DEG_S : 0)
|
||||
const yaw = (pressed.has('ArrowLeft') ? GIMBAL_YAW_DEG_S : 0) - (pressed.has('ArrowRight') ? GIMBAL_YAW_DEG_S : 0)
|
||||
|
||||
const halfSep = WHEEL_SEPARATION / 2
|
||||
const left = linear - angular * halfSep
|
||||
const right = linear + angular * halfSep
|
||||
|
||||
return { left, right, pitch, yaw }
|
||||
return { linear, angular, pitch, yaw }
|
||||
}
|
||||
|
||||
function startLoop() {
|
||||
function tick() {
|
||||
const { left, right, pitch, yaw } = computeVelocities()
|
||||
const changed = left !== lastVel.left || right !== lastVel.right || pitch !== lastVel.pitch || yaw !== lastVel.yaw
|
||||
const { linear, angular, pitch, yaw } = computeVelocities()
|
||||
const changed = linear !== lastVel.linear || angular !== lastVel.angular || pitch !== lastVel.pitch || yaw !== lastVel.yaw
|
||||
|
||||
if (changed) {
|
||||
publish(CMD_WHEEL_TOPIC, 'std_msgs/Float32MultiArray', {
|
||||
data: [left, right],
|
||||
data: [linear, angular],
|
||||
layout: { dim: [], data_offset: 0 },
|
||||
})
|
||||
publish(CMD_GIMBAL_TOPIC, 'geometry_msgs/Twist', {
|
||||
linear: { x: 0, y: 0, z: 0 },
|
||||
angular: { x: 0, y: pitch, z: yaw },
|
||||
})
|
||||
lastVel = { left, right, pitch, yaw }
|
||||
lastVel = { linear, angular, pitch, yaw }
|
||||
}
|
||||
|
||||
if (pressed.size === 0) {
|
||||
|
||||
Reference in New Issue
Block a user