mi-task/single_test/test_arc_movements.py

266 lines
9.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
弧形运动测试脚本
测试弧形转弯、绕行等复杂运动函数
"""
import time
import sys
import os
# 添加父目录到路径以便能够导入utils
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from base_move.move_base_hori_line import arc_turn_around_hori_line
from base_move.turn_degree import turn_degree_v2
from base_move.go_straight import go_straight
from utils.log_helper import LogHelper, get_logger, section, info, debug, warning, error, success, timing
# 创建日志记录器
logger = get_logger("弧形运动测试")
def test_arc_turn_90_degrees(ctrl, msg, observe=True):
"""测试90度弧形转弯"""
section('测试90度弧形转弯', "弧形转弯")
info('开始测试90度弧形转弯...', "测试")
# 记录初始位置和角度
initial_pos = ctrl.odo_msg.xyz
initial_angle = ctrl.odo_msg.rpy[2]
info(f"初始位置: x={initial_pos[0]:.3f}, y={initial_pos[1]:.3f}", "位置")
info(f"初始角度: {initial_angle:.2f}", "角度")
# 执行90度弧形转弯
turn_success, res = arc_turn_around_hori_line(
ctrl=ctrl,
msg=msg,
angle_deg=90, # 90度左转
radius=0.5, # 0.5米转弯半径
observe=observe,
pass_align=True,
no_end_reset=True,
)
# 记录最终位置和角度
final_pos = ctrl.odo_msg.xyz
final_angle = ctrl.odo_msg.rpy[2]
distance_moved = ((final_pos[0] - initial_pos[0])**2 + (final_pos[1] - initial_pos[1])**2)**0.5
angle_diff = final_angle - initial_angle
info(f"最终位置: x={final_pos[0]:.3f}, y={final_pos[1]:.3f}", "位置")
info(f"最终角度: {final_angle:.2f}", "角度")
info(f"移动距离: {distance_moved:.3f}", "距离")
info(f"角度变化: {angle_diff:.2f}", "角度")
if turn_success:
success("90度弧形转弯测试成功", "成功")
if res:
info(f"转弯半径: {res.get('radius', 'N/A')}", "参数")
else:
error("90度弧形转弯测试失败", "失败")
def test_arc_turn_180_degrees(ctrl, msg, observe=True):
"""测试180度弧形转弯"""
section('测试180度弧形转弯', "弧形转弯")
info('开始测试180度弧形转弯...', "测试")
# 记录初始位置和角度
initial_pos = ctrl.odo_msg.xyz
initial_angle = ctrl.odo_msg.rpy[2]
info(f"初始位置: x={initial_pos[0]:.3f}, y={initial_pos[1]:.3f}", "位置")
info(f"初始角度: {initial_angle:.2f}", "角度")
# 执行180度弧形转弯
turn_success, res = arc_turn_around_hori_line(
ctrl=ctrl,
msg=msg,
angle_deg=180, # 180度转弯
radius=0.6, # 0.6米转弯半径
observe=observe,
pass_align=True,
no_end_reset=True,
)
# 记录最终位置和角度
final_pos = ctrl.odo_msg.xyz
final_angle = ctrl.odo_msg.rpy[2]
distance_moved = ((final_pos[0] - initial_pos[0])**2 + (final_pos[1] - initial_pos[1])**2)**0.5
angle_diff = final_angle - initial_angle
info(f"最终位置: x={final_pos[0]:.3f}, y={final_pos[1]:.3f}", "位置")
info(f"最终角度: {final_angle:.2f}", "角度")
info(f"移动距离: {distance_moved:.3f}", "距离")
info(f"角度变化: {angle_diff:.2f}", "角度")
if turn_success:
success("180度弧形转弯测试成功", "成功")
if res:
info(f"转弯半径: {res.get('radius', 'N/A')}", "参数")
else:
error("180度弧形转弯测试失败", "失败")
def test_arc_turn_right_90_degrees(ctrl, msg, observe=True):
"""测试右转90度弧形转弯"""
section('测试右转90度弧形转弯', "弧形转弯")
info('开始测试右转90度弧形转弯...', "测试")
# 记录初始位置和角度
initial_pos = ctrl.odo_msg.xyz
initial_angle = ctrl.odo_msg.rpy[2]
info(f"初始位置: x={initial_pos[0]:.3f}, y={initial_pos[1]:.3f}", "位置")
info(f"初始角度: {initial_angle:.2f}", "角度")
# 执行右转90度弧形转弯
turn_success, res = arc_turn_around_hori_line(
ctrl=ctrl,
msg=msg,
angle_deg=-90, # 负值表示右转
radius=0.5, # 0.5米转弯半径
observe=observe,
pass_align=True,
no_end_reset=True,
)
# 记录最终位置和角度
final_pos = ctrl.odo_msg.xyz
final_angle = ctrl.odo_msg.rpy[2]
distance_moved = ((final_pos[0] - initial_pos[0])**2 + (final_pos[1] - initial_pos[1])**2)**0.5
angle_diff = final_angle - initial_angle
info(f"最终位置: x={final_pos[0]:.3f}, y={final_pos[1]:.3f}", "位置")
info(f"最终角度: {final_angle:.2f}", "角度")
info(f"移动距离: {distance_moved:.3f}", "距离")
info(f"角度变化: {angle_diff:.2f}", "角度")
if turn_success:
success("右转90度弧形转弯测试成功", "成功")
if res:
info(f"转弯半径: {res.get('radius', 'N/A')}", "参数")
else:
error("右转90度弧形转弯测试失败", "失败")
def test_s_curve_movement(ctrl, msg, observe=True):
"""测试S形弯道运动"""
section('测试S形弯道运动', "复杂运动")
info('开始测试S形弯道运动...', "测试")
# 记录起始位置
start_pos = ctrl.odo_msg.xyz
info(f"起始位置: x={start_pos[0]:.3f}, y={start_pos[1]:.3f}", "位置")
# 第一个弧形转弯(左转)
info("执行第一个弧形转弯左转90度", "运动")
turn_success1, res1 = arc_turn_around_hori_line(
ctrl=ctrl,
msg=msg,
angle_deg=90,
radius=0.5,
observe=observe,
pass_align=True,
no_end_reset=True,
)
time.sleep(1)
# 直线段
info("执行直线段", "运动")
go_straight(ctrl, msg, distance=1.0, speed=0.5, observe=observe)
time.sleep(1)
# 第二个弧形转弯(右转)
info("执行第二个弧形转弯右转90度", "运动")
turn_success2, res2 = arc_turn_around_hori_line(
ctrl=ctrl,
msg=msg,
angle_deg=-90,
radius=0.5,
observe=observe,
pass_align=True,
no_end_reset=True,
)
# 记录结束位置
end_pos = ctrl.odo_msg.xyz
total_distance = ((end_pos[0] - start_pos[0])**2 + (end_pos[1] - start_pos[1])**2)**0.5
info(f"结束位置: x={end_pos[0]:.3f}, y={end_pos[1]:.3f}", "位置")
info(f"总移动距离: {total_distance:.3f}", "距离")
if turn_success1 and turn_success2:
success("S形弯道运动测试成功", "成功")
else:
error("S形弯道运动测试失败", "失败")
def test_different_radius_turns(ctrl, msg, observe=True):
"""测试不同半径的弧形转弯"""
section('测试:不同半径的弧形转弯', "弧形转弯")
radii = [0.3, 0.5, 0.8, 1.0] # 不同的转弯半径
for radius in radii:
info(f'开始测试半径为{radius}米的弧形转弯...', "测试")
# 记录初始位置
initial_pos = ctrl.odo_msg.xyz
# 执行弧形转弯
turn_success, res = arc_turn_around_hori_line(
ctrl=ctrl,
msg=msg,
angle_deg=90,
radius=radius,
observe=observe,
pass_align=True,
no_end_reset=True,
)
# 记录最终位置
final_pos = ctrl.odo_msg.xyz
distance_moved = ((final_pos[0] - initial_pos[0])**2 + (final_pos[1] - initial_pos[1])**2)**0.5
info(f"半径{radius}米转弯完成,移动距离: {distance_moved:.3f}", "结果")
if turn_success:
success(f"半径{radius}米弧形转弯测试成功", "成功")
else:
error(f"半径{radius}米弧形转弯测试失败", "失败")
# 每次测试之间暂停
time.sleep(2)
# 回到原始方向
turn_degree_v2(ctrl, msg, degree=0, absolute=True, precision=True)
time.sleep(1)
def run_arc_movement_tests(ctrl, msg):
"""运行所有弧形运动测试"""
section('弧形运动测试套件', "开始")
tests = [
("90度弧形转弯", test_arc_turn_90_degrees),
("180度弧形转弯", test_arc_turn_180_degrees),
("右转90度弧形转弯", test_arc_turn_right_90_degrees),
("S形弯道运动", test_s_curve_movement),
("不同半径弧形转弯", test_different_radius_turns),
]
for test_name, test_func in tests:
try:
info(f"开始执行测试: {test_name}", "测试")
test_func(ctrl, msg)
success(f"测试 {test_name} 成功完成", "成功")
except Exception as e:
error(f"测试 {test_name} 失败: {str(e)}", "失败")
# 每个测试之间暂停
time.sleep(3)
success("所有弧形运动测试完成", "完成")
if __name__ == "__main__":
# 这里可以添加独立运行的代码
print("弧形运动测试脚本")
print("使用方法:")
print("from single_test.test_arc_movements import run_arc_movement_tests")
print("run_arc_movement_tests(ctrl, msg)")