Remove Gait_Params_up_full.toml file and update task_3.py and task_4.py to enhance navigation and control. Integrate go_lateral function for lateral movement, improve task execution with center_on_dual_tracks, and streamline file publishing for gait parameters. Update detection logic for horizontal lines and adjust iteration thresholds for better performance.

This commit is contained in:
havoc420ubuntu 2025-05-30 16:12:10 +00:00
parent ba0994a82b
commit b65b3e5b2e
5 changed files with 43 additions and 5022 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1179,9 +1179,10 @@ def go_straight_until_hori_line(ctrl, msg, target_distance=0.5, max_distance=5.0
edge_point, edge_info = detect_horizontal_track_edge_v2(image, observe=observe, save_log=True)
elif detect_func_version == 3:
edge_point, edge_info = detect_horizontal_track_edge_v3(image, observe=observe, save_log=True)
elif detect_func_version == 4:
edge_point, edge_info = detect_furthest_horizontal_intersection(image, observe=observe, save_log=True)
else:
error("未指定检测版本,请检查参数", "失败")
edge_point, edge_info = detect_horizontal_track_edge(image, observe=observe, save_log=True)
if edge_point is not None and edge_info is not None:
line_detected = True
@ -1197,7 +1198,7 @@ def go_straight_until_hori_line(ctrl, msg, target_distance=0.5, max_distance=5.0
info(f"检测到横向线,当前距离: {current_distance:.3f}米, 目标距离: {target_distance:.3f}", "距离")
# 判断是否达到目标距离
if current_distance <= target_distance + 0.1: # 允许0.1米的误差
if current_distance <= target_distance + 0.1: # additional_distance 额外距离
success(f"已达到目标距离,当前距离: {current_distance:.3f}", "完成")
break
@ -1270,6 +1271,10 @@ def go_straight_until_hori_line(ctrl, msg, target_distance=0.5, max_distance=5.0
edge_point, edge_info = detect_horizontal_track_edge_v2(image, observe=observe, save_log=True)
elif detect_func_version == 3:
edge_point, edge_info = detect_horizontal_track_edge_v3(image, observe=observe, save_log=True)
elif detect_func_version == 4:
edge_point, edge_info = detect_furthest_horizontal_intersection(image, observe=observe, save_log=True)
else:
error("未指定检测版本,请检查参数", "失败")
if edge_point is not None and edge_info is not None:
final_distance = calculate_distance_to_line(edge_info, camera_height, observe=observe)

View File

@ -16,8 +16,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from utils.log_helper import LogHelper, get_logger, section, info, debug, warning, error, success, timing
from base_move.turn_degree import turn_degree, turn_degree_v2
from base_move.go_straight import go_straight
from base_move.go_straight import go_straight, go_lateral
from base_move.go_to_xy import go_to_x_v2
from base_move.center_on_dual_tracks import center_on_dual_tracks
from file_send_lcmt import file_send_lcmt
from utils.yellow_area_analyzer import analyze_yellow_area_ratio
@ -41,7 +42,7 @@ robot_cmd = {
def pass_up_down(ctrl, msg):
usergait_msg = file_send_lcmt()
lcm_usergait = lcm.LCM("udpm://239.255.76.67:7671?ttl=255")
# lcm_usergait = lcm.LCM("udpm://239.255.76.67:7671?ttl=255")
try:
steps = toml.load("./task_3/Gait_Params_up.toml")
@ -80,10 +81,10 @@ def pass_up_down(ctrl, msg):
file_obj_gait_def = open("./task_3/Gait_Def_up.toml",'r')
file_obj_gait_params = open("./task_3/Gait_Params_up_full.toml",'r')
usergait_msg.data = file_obj_gait_def.read()
lcm_usergait.publish("user_gait_file",usergait_msg.encode())
ctrl.lc_s.publish("user_gait_file", usergait_msg.encode())
time.sleep(0.5)
usergait_msg.data = file_obj_gait_params.read()
lcm_usergait.publish("user_gait_file",usergait_msg.encode())
ctrl.lc_s.publish("user_gait_file", usergait_msg.encode())
time.sleep(0.1)
file_obj_gait_def.close()
file_obj_gait_params.close()
@ -100,8 +101,8 @@ def pass_up_down(ctrl, msg):
stable_threshold = 8 # 连续15次检测z轴不再增加则认为已经停止
z_speed_threshold = 0.01 # z轴速度阈值小于这个值认为已经停止爬升
climb_speed_threshold = 0.05 # 检测到开始爬坡的速度阈值
max_iterations = 250 # 最大循环次数,作为安全保障
min_iterations = 150 # 最小循环次数,作为安全保障
max_iterations = 320 # 最大循环次数,作为安全保障
min_iterations = 250 # 最小循环次数,作为安全保障
# 姿态判断参数
pitch_threshold = 0.05 # 俯仰角阈值(弧度)
@ -139,7 +140,7 @@ def pass_up_down(ctrl, msg):
# 每10次迭代打印一次当前信息
if i % 10 == 0:
info(f"当前Z轴速度={vz:.3f}, 当前高度={current_height:.3f}, 俯仰角={current_pitch:.3f}, 角速度={pitch_rate:.3f}", "监测")
info(f"Step:{i} 当前Z轴速度={vz:.3f}, 当前高度={current_height:.3f}, 俯仰角={current_pitch:.3f}, 角速度={pitch_rate:.3f}", "监测")
# 检测是否开始爬坡阶段
if not climbing_detected and vz > climb_speed_threshold:
@ -189,6 +190,8 @@ def pass_up_down(ctrl, msg):
# msg.vel_des = [0, 0.2, 0] # [前进速度, 侧向速度, 角速度]
# msg.life_count += 1
# ctrl.Send_cmd(msg)
turn_degree_v2(ctrl, msg, 90, absolute=True)
go_straight(ctrl, msg, distance=0.5, speed=0.5, observe=True)
time.sleep(1)
# go_to_x_v2(ctrl, msg, 2, speed=0.5, precision=True, observe=True)
@ -230,10 +233,10 @@ def pass_up_down(ctrl, msg):
file_obj_gait_def = open("./task_3/Gait_Def_up.toml",'r')
file_obj_gait_params = open("./task_3/Gait_Params_down_full.toml",'r')
usergait_msg.data = file_obj_gait_def.read()
lcm_usergait.publish("user_gait_file",usergait_msg.encode())
ctrl.lc_s.publish("user_gait_file", usergait_msg.encode())
time.sleep(0.5)
usergait_msg.data = file_obj_gait_params.read()
lcm_usergait.publish("user_gait_file",usergait_msg.encode())
ctrl.lc_s.publish("user_gait_file", usergait_msg.encode())
time.sleep(0.1)
file_obj_gait_def.close()
file_obj_gait_params.close()
@ -250,8 +253,8 @@ def pass_up_down(ctrl, msg):
stable_threshold = 10 # 连续10次检测z轴速度接近零则认为已经到达平地
z_speed_threshold = 0.005 # z轴速度阈值小于这个值认为已经停止下降
descent_speed_threshold = -0.05 # 检测到开始下坡的速度阈值(负值表示下降)
max_iterations = 250 # 最大循环次数,作为安全保障
min_iterations = 150 # 最小循环次数,确保有足够的时间开始动作
max_iterations = 120 # 最大循环次数,作为安全保障
min_iterations = 80 # 最小循环次数,确保有足够的时间开始动作
start_height = ctrl.odo_msg.xyz[2] # 记录起始高度
# 姿态判断参数
@ -289,7 +292,7 @@ def pass_up_down(ctrl, msg):
# 每10次迭代打印一次当前信息
if observe and i % 10 == 0:
info(f"当前Z轴速度={vz:.3f}, 当前高度={current_height:.3f}, 俯仰角={current_pitch:.3f}, 角速度={pitch_rate:.3f}", "监测")
info(f"Step:{i} 当前Z轴速度={vz:.3f}, 当前高度={current_height:.3f}, 俯仰角={current_pitch:.3f}, 角速度={pitch_rate:.3f}", "监测")
# 检测是否开始下坡阶段
if not descending_detected and vz < descent_speed_threshold:
@ -495,13 +498,18 @@ def go_until_yellow_area(ctrl, msg, yellow_ratio_threshold=0.15, speed=0.3, max_
def run_task_3(ctrl, msg):
section('任务3步态切换', "启动")
section('任务3上下坡', "启动")
info('开始执行任务3...', "启动")
turn_degree_v2(ctrl, msg, 90, absolute=True)
go_lateral(ctrl, msg, distance=0.2, speed=0.1, observe=True)
# section('任务3-1up', "开始")
# pass_up_down(ctrl, msg)
section('任务3-1up', "开始")
pass_up_down(ctrl, msg)
section('任务3-2center on dual tracks', "开始")
turn_degree_v2(ctrl, msg, 90, absolute=True)
center_on_dual_tracks(ctrl, msg, max_time=15, max_deviation=10.0, observe=False, stone_path_mode=False)
section('任务3-2yellow stop', "开始")
go_until_yellow_area(ctrl, msg, yellow_ratio_threshold=0.15, speed=0.3)

View File

@ -11,10 +11,8 @@ from base_move.turn_degree import turn_degree, turn_degree_v2
from base_move.go_straight import go_straight, go_lateral
from utils.log_helper import LogHelper, get_logger, section, info, debug, warning, error, success, timing
from utils.gray_sky_analyzer import analyze_gray_sky_ratio
from base_move.move_base_hori_line import go_straight_until_hori_line
from base_move.follow_dual_tracks import go_straight_with_visual_track
from base_move.center_on_dual_tracks import center_on_dual_tracks
from utils.detect_track import detect_horizontal_track_edge
from base_move.move_base_hori_line import calculate_distance_to_line
from task_4.pass_bar import pass_bar
# 创建本模块特定的日志记录器
@ -52,7 +50,7 @@ def run_task_4_back(ctrl, msg):
# 向右移动0.5秒
section('任务4-回程:向右移动', "移动")
go_lateral(ctrl, msg, distance=-0.3, speed=0.1, observe=True)
go_lateral(ctrl, msg, distance=-0.3, speed=0.1, observe=True) # DEBUG
section('任务4-1移动直到灰色天空比例低于阈值', "天空检测")
go_straight_until_sky_ratio_below(ctrl, msg, sky_ratio_threshold=0.35, speed=0.5)
@ -62,29 +60,16 @@ def run_task_4_back(ctrl, msg):
section('任务4-3stone', "移动")
go_straight(ctrl, msg, distance=1, speed=2)
# go_straight_with_visual_track(ctrl, msg, distance=4.5, observe=False,
# mode=11,
# speed=0.35,
# gait_id=3,
# step_height=[0.21, 0.21],
# )
go_straight(ctrl, msg, distance=4.5, speed=0.35, mode=11, gait_id=3, step_height=[0.21, 0.21])
section('任务4-3前进直到遇到黄线 - 石板路', "移动")
# 使用新创建的函数直走直到遇到黄线并停在距离黄线0.5米处
go_straight_until_hori_line(
ctrl,
msg,
target_distance=1, # 目标与黄线的距离(米)
max_distance=6.0, # 最大搜索距离(米)
speed=0.2, # 移动速度(米/秒)
mode=11, # 运动模式
gait_id=3, # 步态ID快步跑
step_height=[0.21, 0.21], # 摆动腿离地高度
observe=True # 显示调试信息
)
go_straight(ctrl, msg, distance=0.8, speed=0.2, observe=True, mode=11, gait_id=3, step_height=[0.21, 0.21])
# 获取相机高度
camera_height = 0.355 # 单位: 米 # INFO from TF-tree
edge_point, edge_info = detect_horizontal_track_edge(ctrl.image_processor.get_current_image(), observe=True, save_log=True)
current_distance = calculate_distance_to_line(edge_info, camera_height, observe=True)
go_straight(ctrl, msg, distance=current_distance, speed=0.20, mode=11, gait_id=3, step_height=[0.21, 0.21])
def go_straight_until_sky_ratio_below(ctrl, msg,

View File

@ -16,6 +16,7 @@ from base_move.move_base_hori_line import (
detect_horizontal_track_edge, detect_horizontal_track_edge_v2, detect_horizontal_track_edge_v3,
calculate_distance_to_line, move_to_hori_line, arc_turn_around_hori_line
)
from base_move.center_on_dual_tracks import center_on_dual_tracks
# from base_move.follow_dual_tracks import follow_dual_tracks
@ -209,6 +210,8 @@ def run_task_5(ctrl, msg, direction='left', observe=False):
"""
走向卸货
"""
center_on_dual_tracks(ctrl, msg, max_time=15, max_deviation=10.0, observe=False, stone_path_mode=False)
section('任务5-1直线移动并扫描二维码', "移动")
# 最大移动距离为8米
@ -228,6 +231,7 @@ def run_task_5(ctrl, msg, direction='left', observe=False):
error("未能成功到达横线前指定距离", "失败")
section('任务5-2移动到卸货点', "移动")
center_on_dual_tracks(ctrl, msg, max_time=15, max_deviation=10.0, observe=False, stone_path_mode=False)
if direction == 'right' and res['qr_result'] == 'B-2' or direction == 'left' and res['qr_result'] == 'B-1':
# 直走
move_to_hori_line(ctrl, msg, target_distance=1.4, observe=observe, detect_func_version=4)