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) edge_point, edge_info = detect_horizontal_track_edge_v2(image, observe=observe, save_log=True)
elif detect_func_version == 3: elif detect_func_version == 3:
edge_point, edge_info = detect_horizontal_track_edge_v3(image, observe=observe, save_log=True) 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: else:
error("未指定检测版本,请检查参数", "失败") 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: if edge_point is not None and edge_info is not None:
line_detected = True 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}", "距离") 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}", "完成") success(f"已达到目标距离,当前距离: {current_distance:.3f}", "完成")
break 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) edge_point, edge_info = detect_horizontal_track_edge_v2(image, observe=observe, save_log=True)
elif detect_func_version == 3: elif detect_func_version == 3:
edge_point, edge_info = detect_horizontal_track_edge_v3(image, observe=observe, save_log=True) 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: if edge_point is not None and edge_info is not None:
final_distance = calculate_distance_to_line(edge_info, camera_height, observe=observe) 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 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.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.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 file_send_lcmt import file_send_lcmt
from utils.yellow_area_analyzer import analyze_yellow_area_ratio from utils.yellow_area_analyzer import analyze_yellow_area_ratio
@ -41,7 +42,7 @@ robot_cmd = {
def pass_up_down(ctrl, msg): def pass_up_down(ctrl, msg):
usergait_msg = file_send_lcmt() 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: try:
steps = toml.load("./task_3/Gait_Params_up.toml") 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_def = open("./task_3/Gait_Def_up.toml",'r')
file_obj_gait_params = open("./task_3/Gait_Params_up_full.toml",'r') file_obj_gait_params = open("./task_3/Gait_Params_up_full.toml",'r')
usergait_msg.data = file_obj_gait_def.read() 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) time.sleep(0.5)
usergait_msg.data = file_obj_gait_params.read() 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) time.sleep(0.1)
file_obj_gait_def.close() file_obj_gait_def.close()
file_obj_gait_params.close() file_obj_gait_params.close()
@ -100,8 +101,8 @@ def pass_up_down(ctrl, msg):
stable_threshold = 8 # 连续15次检测z轴不再增加则认为已经停止 stable_threshold = 8 # 连续15次检测z轴不再增加则认为已经停止
z_speed_threshold = 0.01 # z轴速度阈值小于这个值认为已经停止爬升 z_speed_threshold = 0.01 # z轴速度阈值小于这个值认为已经停止爬升
climb_speed_threshold = 0.05 # 检测到开始爬坡的速度阈值 climb_speed_threshold = 0.05 # 检测到开始爬坡的速度阈值
max_iterations = 250 # 最大循环次数,作为安全保障 max_iterations = 320 # 最大循环次数,作为安全保障
min_iterations = 150 # 最小循环次数,作为安全保障 min_iterations = 250 # 最小循环次数,作为安全保障
# 姿态判断参数 # 姿态判断参数
pitch_threshold = 0.05 # 俯仰角阈值(弧度) pitch_threshold = 0.05 # 俯仰角阈值(弧度)
@ -139,7 +140,7 @@ def pass_up_down(ctrl, msg):
# 每10次迭代打印一次当前信息 # 每10次迭代打印一次当前信息
if i % 10 == 0: 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: 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.vel_des = [0, 0.2, 0] # [前进速度, 侧向速度, 角速度]
# msg.life_count += 1 # msg.life_count += 1
# ctrl.Send_cmd(msg) # 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) time.sleep(1)
# go_to_x_v2(ctrl, msg, 2, speed=0.5, precision=True, observe=True) # 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_def = open("./task_3/Gait_Def_up.toml",'r')
file_obj_gait_params = open("./task_3/Gait_Params_down_full.toml",'r') file_obj_gait_params = open("./task_3/Gait_Params_down_full.toml",'r')
usergait_msg.data = file_obj_gait_def.read() 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) time.sleep(0.5)
usergait_msg.data = file_obj_gait_params.read() 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) time.sleep(0.1)
file_obj_gait_def.close() file_obj_gait_def.close()
file_obj_gait_params.close() file_obj_gait_params.close()
@ -250,8 +253,8 @@ def pass_up_down(ctrl, msg):
stable_threshold = 10 # 连续10次检测z轴速度接近零则认为已经到达平地 stable_threshold = 10 # 连续10次检测z轴速度接近零则认为已经到达平地
z_speed_threshold = 0.005 # z轴速度阈值小于这个值认为已经停止下降 z_speed_threshold = 0.005 # z轴速度阈值小于这个值认为已经停止下降
descent_speed_threshold = -0.05 # 检测到开始下坡的速度阈值(负值表示下降) descent_speed_threshold = -0.05 # 检测到开始下坡的速度阈值(负值表示下降)
max_iterations = 250 # 最大循环次数,作为安全保障 max_iterations = 120 # 最大循环次数,作为安全保障
min_iterations = 150 # 最小循环次数,确保有足够的时间开始动作 min_iterations = 80 # 最小循环次数,确保有足够的时间开始动作
start_height = ctrl.odo_msg.xyz[2] # 记录起始高度 start_height = ctrl.odo_msg.xyz[2] # 记录起始高度
# 姿态判断参数 # 姿态判断参数
@ -289,7 +292,7 @@ def pass_up_down(ctrl, msg):
# 每10次迭代打印一次当前信息 # 每10次迭代打印一次当前信息
if observe and i % 10 == 0: 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: 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): def run_task_3(ctrl, msg):
section('任务3步态切换', "启动") section('任务3上下坡', "启动")
info('开始执行任务3...', "启动") info('开始执行任务3...', "启动")
turn_degree_v2(ctrl, msg, 90, absolute=True) turn_degree_v2(ctrl, msg, 90, absolute=True)
go_lateral(ctrl, msg, distance=0.2, speed=0.1, observe=True)
# section('任务3-1up', "开始") section('任务3-1up', "开始")
# pass_up_down(ctrl, msg) 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', "开始") section('任务3-2yellow stop', "开始")
go_until_yellow_area(ctrl, msg, yellow_ratio_threshold=0.15, speed=0.3) 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 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.log_helper import LogHelper, get_logger, section, info, debug, warning, error, success, timing
from utils.gray_sky_analyzer import analyze_gray_sky_ratio from utils.gray_sky_analyzer import analyze_gray_sky_ratio
from base_move.move_base_hori_line import go_straight_until_hori_line from utils.detect_track import detect_horizontal_track_edge
from base_move.follow_dual_tracks import go_straight_with_visual_track from base_move.move_base_hori_line import calculate_distance_to_line
from base_move.center_on_dual_tracks import center_on_dual_tracks
from task_4.pass_bar import pass_bar from task_4.pass_bar import pass_bar
# 创建本模块特定的日志记录器 # 创建本模块特定的日志记录器
@ -52,7 +50,7 @@ def run_task_4_back(ctrl, msg):
# 向右移动0.5秒 # 向右移动0.5秒
section('任务4-回程:向右移动', "移动") 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移动直到灰色天空比例低于阈值', "天空检测") section('任务4-1移动直到灰色天空比例低于阈值', "天空检测")
go_straight_until_sky_ratio_below(ctrl, msg, sky_ratio_threshold=0.35, speed=0.5) 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', "移动") section('任务4-3stone', "移动")
go_straight(ctrl, msg, distance=1, speed=2) 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]) go_straight(ctrl, msg, distance=4.5, speed=0.35, mode=11, gait_id=3, step_height=[0.21, 0.21])
section('任务4-3前进直到遇到黄线 - 石板路', "移动") section('任务4-3前进直到遇到黄线 - 石板路', "移动")
# 使用新创建的函数直走直到遇到黄线并停在距离黄线0.5米处 # 使用新创建的函数直走直到遇到黄线并停在距离黄线0.5米处
go_straight_until_hori_line( # 获取相机高度
ctrl, camera_height = 0.355 # 单位: 米 # INFO from TF-tree
msg, edge_point, edge_info = detect_horizontal_track_edge(ctrl.image_processor.get_current_image(), observe=True, save_log=True)
target_distance=1, # 目标与黄线的距离(米) current_distance = calculate_distance_to_line(edge_info, camera_height, observe=True)
max_distance=6.0, # 最大搜索距离(米) go_straight(ctrl, msg, distance=current_distance, speed=0.20, mode=11, gait_id=3, step_height=[0.21, 0.21])
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])
def go_straight_until_sky_ratio_below(ctrl, msg, 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, 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 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 # 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直线移动并扫描二维码', "移动") section('任务5-1直线移动并扫描二维码', "移动")
# 最大移动距离为8米 # 最大移动距离为8米
@ -228,6 +231,7 @@ def run_task_5(ctrl, msg, direction='left', observe=False):
error("未能成功到达横线前指定距离", "失败") error("未能成功到达横线前指定距离", "失败")
section('任务5-2移动到卸货点', "移动") 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': 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) move_to_hori_line(ctrl, msg, target_distance=1.4, observe=observe, detect_func_version=4)