优化 arc_turn_around_hori_line 函数,改进旋转过程中的减速控制逻辑
- 增加旋转精度监控,达到目标角度的85%时开始减速 - 直接发送停止命令,替代平滑停止方法 - 添加观察输出信息,便于调试和分析旋转过程中的状态 - 处理旋转完成后的角度微调,确保最终角度准确
This commit is contained in:
parent
8c899fda7d
commit
24f98da1a3
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user