优化 arc_turn_around_hori_line 函数,改进旋转过程中的减速控制逻辑

- 增加旋转精度监控,达到目标角度的85%时开始减速
- 直接发送停止命令,替代平滑停止方法
- 添加观察输出信息,便于调试和分析旋转过程中的状态
- 处理旋转完成后的角度微调,确保最终角度准确
This commit is contained in:
Havoc 2025-05-15 20:32:51 +08:00
parent 8c899fda7d
commit 24f98da1a3

View File

@ -398,8 +398,16 @@ def arc_turn_around_hori_line(ctrl, msg, target_distance=0.2, angle_deg=90, left
start_time = time.time()
timeout = t + 2 # 给个超时保护
# 监控旋转进度但不执行减速改用stop_smooth
while distance_moved < arc_length * 0.95 and abs(angle_turned) < abs(angle_rad) * 0.95 and time.time() - start_time < timeout:
# 初始速度
current_v = v
current_w = w
# 旋转精度监控
target_angle = angle_rad if left else -angle_rad # 目标角度(弧度)
slowdown_threshold = 0.85 # 当达到目标角度的85%时开始减速
# 监控旋转进度并自行控制减速
while abs(angle_turned) < abs(angle_rad) * 0.98 and time.time() - start_time < timeout:
# 计算已移动距离
current_position = ctrl.odo_msg.xyz
dx = current_position[0] - start_position[0]
@ -415,16 +423,75 @@ def arc_turn_around_hori_line(ctrl, msg, target_distance=0.2, angle_deg=90, left
while angle_turned < -math.pi:
angle_turned += 2 * math.pi
if observe and time.time() % 0.5 < 0.02: # 每0.5秒左右打印一次
print(f"已移动: {distance_moved:.3f}米, 已旋转: {math.degrees(angle_turned):.2f}")
# 计算角度完成比例
completion_ratio = abs(angle_turned) / abs(angle_rad)
# 当完成一定比例时开始减速
if completion_ratio > slowdown_threshold:
# 剩余比例作为速度系数
speed_factor = 1.0 - (completion_ratio - slowdown_threshold) / (1.0 - slowdown_threshold)
# 确保速度系数不会太小
speed_factor = max(0.3, speed_factor)
# 应用减速
current_v = v * speed_factor
current_w = w * speed_factor
# 更新速度命令
msg.mode = 11
msg.gait_id = 26
msg.vel_des = [current_v, 0, current_w]
msg.duration = 200 # 短时间更新
msg.step_height = [0.06, 0.06]
msg.life_count += 1
ctrl.Send_cmd(msg)
if observe and time.time() % 0.5 < 0.02: # 每0.5秒左右打印一次
print(f"减速阶段 - 已旋转: {math.degrees(angle_turned):.2f}度, 速度因子: {speed_factor:.2f}, 当前角速度: {current_w:.3f}rad/s")
else:
if observe and time.time() % 0.5 < 0.02: # 每0.5秒左右打印一次
print(f"已移动: {distance_moved:.3f}米, 已旋转: {math.degrees(angle_turned):.2f}")
time.sleep(0.05)
# 使用平滑停止
ctrl.base_msg.stop_smooth(current_vel=[v, 0, w])
# 直接发送停止命令,不使用平滑停止
msg.mode = 11
msg.gait_id = 26
msg.vel_des = [0, 0, 0] # 零速度
msg.duration = 200
msg.step_height = [0.06, 0.06]
msg.life_count += 1
ctrl.Send_cmd(msg)
# 停下来后的最终角度
final_yaw = ctrl.odo_msg.rpy[2]
final_angle_turned = final_yaw - start_yaw
# 角度归一化处理
while final_angle_turned > math.pi:
final_angle_turned -= 2 * math.pi
while final_angle_turned < -math.pi:
final_angle_turned += 2 * math.pi
final_angle_deg = math.degrees(final_angle_turned)
target_angle_deg = angle_deg if left else -angle_deg
if observe:
print("圆弧运动完成,平稳停止")
print(f"旋转完成,目标角度: {target_angle_deg:.2f}度, 实际角度: {final_angle_deg:.2f}")
# 检查是否需要微调
angle_error = abs(final_angle_deg - target_angle_deg)
if angle_error > 3.0: # 如果误差超过3度
if observe:
print(f"角度误差: {angle_error:.2f}度,进行微调")
# 计算需要微调的角度
adjust_angle = target_angle_deg - final_angle_deg
# 使用turn_degree函数进行微调
turn_degree(ctrl, msg, adjust_angle, absolute=False)
if observe:
print("圆弧转弯完成")
return True