Merge branch 'task-3-2' of ssh://120.27.199.238:222/Havoc420mac/mi-task into task-3-2
This commit is contained in:
		
						commit
						e0961fcdd9
					
				@ -9,7 +9,9 @@ from utils.detect_dual_track_lines import detect_dual_track_lines
 | 
			
		||||
 | 
			
		||||
def center_on_dual_tracks(ctrl, msg, max_time=15, max_deviation=8.0, observe=False,
 | 
			
		||||
                         mode=11, gait_id=26, step_height=[0.06, 0.06], 
 | 
			
		||||
                         estimated_track_distance=1.0):
 | 
			
		||||
                         estimated_track_distance=1.0,
 | 
			
		||||
                         detect_height=0.4,
 | 
			
		||||
                         detection_interval=0.2):
 | 
			
		||||
    """
 | 
			
		||||
    控制机器狗仅使用Y轴移动调整到双轨道线的中间位置
 | 
			
		||||
    
 | 
			
		||||
@ -23,6 +25,8 @@ def center_on_dual_tracks(ctrl, msg, max_time=15, max_deviation=8.0, observe=Fal
 | 
			
		||||
    gait_id: 步态ID,默认为26
 | 
			
		||||
    step_height: 抬腿高度,默认为[0.06, 0.06]
 | 
			
		||||
    estimated_track_distance: 估计的机器人到轨道的距离(米),用于计算实际偏差,默认为1.0米
 | 
			
		||||
    detect_height: 检测高度,默认为0.4
 | 
			
		||||
    detection_interval: 检测间隔时间(秒),默认为0.2秒
 | 
			
		||||
    
 | 
			
		||||
    返回:
 | 
			
		||||
    bool: 是否成功调整到中心位置
 | 
			
		||||
@ -37,6 +41,7 @@ def center_on_dual_tracks(ctrl, msg, max_time=15, max_deviation=8.0, observe=Fal
 | 
			
		||||
    
 | 
			
		||||
    # 记录起始时间
 | 
			
		||||
    start_time = time.time()
 | 
			
		||||
    last_detection_time = 0  # 记录上次检测时间
 | 
			
		||||
    
 | 
			
		||||
    # 记录起始位置
 | 
			
		||||
    start_position = list(ctrl.odo_msg.xyz)
 | 
			
		||||
@ -73,7 +78,7 @@ def center_on_dual_tracks(ctrl, msg, max_time=15, max_deviation=8.0, observe=Fal
 | 
			
		||||
        
 | 
			
		||||
        # 检测双轨道线
 | 
			
		||||
        detection_total_count += 1
 | 
			
		||||
        
 | 
			
		||||
            
 | 
			
		||||
        center_info, left_info, right_info = detect_dual_track_lines(image, observe=observe, save_log=True)
 | 
			
		||||
        
 | 
			
		||||
        if center_info is not None:
 | 
			
		||||
@ -104,7 +109,6 @@ def center_on_dual_tracks(ctrl, msg, max_time=15, max_deviation=8.0, observe=Fal
 | 
			
		||||
                if stable_count < required_stable_count:
 | 
			
		||||
                    # 直接根据实际偏差移动
 | 
			
		||||
                    msg.vel_des = [0, actual_deviation, 0]
 | 
			
		||||
                    msg.life_count += 1
 | 
			
		||||
                    ctrl.Send_cmd(msg)
 | 
			
		||||
                
 | 
			
		||||
                if stable_count >= required_stable_count:
 | 
			
		||||
@ -211,7 +215,8 @@ def center_on_dual_tracks(ctrl, msg, max_time=15, max_deviation=8.0, observe=Fal
 | 
			
		||||
    
 | 
			
		||||
    return success
 | 
			
		||||
def center_and_follow_dual_tracks(ctrl, msg, distance, speed=0.5, max_centering_time=15, observe=False,
 | 
			
		||||
                                mode=11, gait_id=26, step_height=[0.06, 0.06], estimated_track_distance=1.0):
 | 
			
		||||
                                mode=11, gait_id=26, step_height=[0.06, 0.06], estimated_track_distance=1.0,
 | 
			
		||||
                                detection_interval=0.2):
 | 
			
		||||
    """
 | 
			
		||||
    先居中到双轨道线中间,然后沿轨道线行走指定距离
 | 
			
		||||
    
 | 
			
		||||
@ -226,6 +231,7 @@ def center_and_follow_dual_tracks(ctrl, msg, distance, speed=0.5, max_centering_
 | 
			
		||||
    gait_id: 步态ID,默认为26
 | 
			
		||||
    step_height: 抬腿高度,默认为[0.06, 0.06]
 | 
			
		||||
    estimated_track_distance: 估计的机器人到轨道的距离(米),用于计算实际偏差,默认为1.0米
 | 
			
		||||
    detection_interval: 检测间隔时间(秒),默认为0.2秒
 | 
			
		||||
    
 | 
			
		||||
    返回:
 | 
			
		||||
    bool: 是否成功完成居中和轨道跟随
 | 
			
		||||
@ -243,7 +249,8 @@ def center_and_follow_dual_tracks(ctrl, msg, distance, speed=0.5, max_centering_
 | 
			
		||||
        mode=mode, 
 | 
			
		||||
        gait_id=gait_id, 
 | 
			
		||||
        step_height=step_height,
 | 
			
		||||
        estimated_track_distance=estimated_track_distance
 | 
			
		||||
        estimated_track_distance=estimated_track_distance,
 | 
			
		||||
        detection_interval=detection_interval
 | 
			
		||||
    )
 | 
			
		||||
    
 | 
			
		||||
    if not centering_success:
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										3
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								main.py
									
									
									
									
									
								
							@ -64,8 +64,6 @@ def main():
 | 
			
		||||
        else:
 | 
			
		||||
            run_task_3(Ctrl, msg)
 | 
			
		||||
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
        turn_degree_v2(Ctrl, msg, degree=90, absolute=True)
 | 
			
		||||
        run_task_5(Ctrl, msg, direction=arrow_direction)
 | 
			
		||||
 | 
			
		||||
@ -195,6 +193,7 @@ class Robot_Ctrl(object):
 | 
			
		||||
        self.send_lock.acquire()
 | 
			
		||||
        self.delay_cnt = 50
 | 
			
		||||
        self.cmd_msg = msg
 | 
			
		||||
        self.cmd_msg.life_count %= 127
 | 
			
		||||
        self.send_lock.release()
 | 
			
		||||
 | 
			
		||||
    def place_marker(self, x, y, z, color, observe=False):
 | 
			
		||||
 | 
			
		||||
@ -183,17 +183,10 @@ def pass_up_down(ctrl, msg):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    section('任务3-2:x = 2', "开始")
 | 
			
		||||
    # msg.mode = 11  # Locomotion模式 # DEBUG
 | 
			
		||||
    # msg.gait_id = 26  # 自变频步态
 | 
			
		||||
    # msg.duration = 0  # wait next cmd
 | 
			
		||||
    # msg.step_height = [0.06, 0.06]  # 抬腿高度
 | 
			
		||||
    # msg.vel_des = [0, 0.2, 0]  # [前进速度, 侧向速度, 角速度]
 | 
			
		||||
    # msg.life_count += 1
 | 
			
		||||
    # ctrl.Send_cmd(msg)
 | 
			
		||||
    turn_degree_v2(ctrl, msg, 90, absolute=True)
 | 
			
		||||
    center_on_dual_tracks(ctrl, msg, max_time=15, max_deviation=10.0, observe=False, detect_height=0.3)
 | 
			
		||||
    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)
 | 
			
		||||
 | 
			
		||||
    section('任务3-3:down', "完成")
 | 
			
		||||
    try:
 | 
			
		||||
@ -253,7 +246,7 @@ def pass_up_down(ctrl, msg):
 | 
			
		||||
        stable_threshold = 10  # 连续10次检测z轴速度接近零则认为已经到达平地
 | 
			
		||||
        z_speed_threshold = 0.005  # z轴速度阈值,小于这个值认为已经停止下降
 | 
			
		||||
        descent_speed_threshold = -0.05  # 检测到开始下坡的速度阈值(负值表示下降)
 | 
			
		||||
        max_iterations = 100  # 最大循环次数,作为安全保障
 | 
			
		||||
        max_iterations = 110  # 最大循环次数,作为安全保障
 | 
			
		||||
        min_iterations = 80  # 最小循环次数,确保有足够的时间开始动作
 | 
			
		||||
        start_height = ctrl.odo_msg.xyz[2]  # 记录起始高度
 | 
			
		||||
        
 | 
			
		||||
@ -501,17 +494,15 @@ def run_task_3(ctrl, msg):
 | 
			
		||||
    section('任务3:上下坡', "启动")
 | 
			
		||||
    info('开始执行任务3...', "启动")
 | 
			
		||||
 | 
			
		||||
    # turn_degree_v2(ctrl, msg, 90, absolute=True)
 | 
			
		||||
    # go_lateral(ctrl, msg, distance=0.2, speed=0.1, observe=True)
 | 
			
		||||
    turn_degree_v2(ctrl, msg, 90, absolute=True)
 | 
			
		||||
    go_lateral(ctrl, msg, distance=0.2, speed=0.1, observe=True)
 | 
			
		||||
 | 
			
		||||
    # section('任务3-1:up', "开始")
 | 
			
		||||
    # pass_up_down(ctrl, msg)
 | 
			
		||||
    section('任务3-1:up', "开始")
 | 
			
		||||
    pass_up_down(ctrl, msg)
 | 
			
		||||
 | 
			
		||||
    turn_degree_v2(ctrl, msg, 90, absolute=True)
 | 
			
		||||
    center_on_dual_tracks(ctrl, msg, max_time=15, max_deviation=10.0, observe=False)
 | 
			
		||||
 | 
			
		||||
    return
 | 
			
		||||
 | 
			
		||||
    section('任务3-2:yellow stop', "开始")
 | 
			
		||||
    go_until_yellow_area(ctrl, msg, yellow_ratio_threshold=0.15, speed=0.3)
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
@ -65,8 +65,9 @@ def run_task_4_back(ctrl, msg):
 | 
			
		||||
    go_straight(ctrl, msg, distance=1, speed=2)
 | 
			
		||||
 | 
			
		||||
    # Use enhanced calibration for better Y-axis correction on stone path
 | 
			
		||||
    go_straight_with_enhanced_calibration(ctrl, msg, distance=4.5, speed=0.35, 
 | 
			
		||||
                                         mode=11, gait_id=3, step_height=[0.21, 0.21], observe=True)
 | 
			
		||||
    go_straight(ctrl, msg, distance=4.5, speed=0.35, mode=11, gait_id=3, step_height=[0.21, 0.21], observe=True)
 | 
			
		||||
    # go_straight_with_enhanced_calibration(ctrl, msg, distance=4.5, speed=0.35, 
 | 
			
		||||
    #                                      mode=11, gait_id=3, step_height=[0.21, 0.21], observe=True)
 | 
			
		||||
 | 
			
		||||
    section('任务4-3:前进直到遇到黄线 - 石板路', "移动")
 | 
			
		||||
    # 使用新创建的函数,直走直到遇到黄线并停在距离黄线0.5米处
 | 
			
		||||
@ -366,7 +367,7 @@ def go_straight_with_enhanced_calibration(ctrl, msg, distance, speed=0.5, observ
 | 
			
		||||
                if frame is not None:
 | 
			
		||||
                    # 检测轨道线 - 使用特定的石板路模式
 | 
			
		||||
                    center_info, _, _ = detect_dual_track_lines(
 | 
			
		||||
                        frame, observe=False, save_log=False, stone_path_mode=True)
 | 
			
		||||
                        frame, observe=False, save_log=False)
 | 
			
		||||
                    
 | 
			
		||||
                    # 如果成功检测到轨道线,使用它进行修正
 | 
			
		||||
                    if center_info is not None:
 | 
			
		||||
 | 
			
		||||
@ -211,7 +211,7 @@ 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)
 | 
			
		||||
    center_on_dual_tracks(ctrl, msg, max_time=15, max_deviation=10.0, observe=False)
 | 
			
		||||
    section('任务5-1:直线移动并扫描二维码', "移动")
 | 
			
		||||
    
 | 
			
		||||
    # 最大移动距离为8米
 | 
			
		||||
@ -231,7 +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)
 | 
			
		||||
    center_on_dual_tracks(ctrl, msg, max_time=15, max_deviation=10.0, observe=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)
 | 
			
		||||
 | 
			
		||||
@ -9,7 +9,8 @@ from utils.log_helper import LogHelper, get_logger, section, info, debug, warnin
 | 
			
		||||
def detect_dual_track_lines(image, observe=False, delay=1000, save_log=True,
 | 
			
		||||
                            min_slope_threshold=0.4,
 | 
			
		||||
                            min_line_length=0.05,
 | 
			
		||||
                            max_line_gap=40):
 | 
			
		||||
                            max_line_gap=40,
 | 
			
		||||
                            detect_height=0.4):
 | 
			
		||||
    """
 | 
			
		||||
    检测左右两条平行的黄色轨道线,优化后能够更准确处理各种路况
 | 
			
		||||
    
 | 
			
		||||
@ -72,7 +73,7 @@ def detect_dual_track_lines(image, observe=False, delay=1000, save_log=True,
 | 
			
		||||
        cv2.waitKey(delay)
 | 
			
		||||
    
 | 
			
		||||
    # 裁剪底部区域重点关注近处的黄线
 | 
			
		||||
    bottom_roi_height = int(height * 0.4)  # 增加关注区域到图像底部60%
 | 
			
		||||
    bottom_roi_height = int(height * detect_height)  # 增加关注区域到图像底部60%
 | 
			
		||||
    bottom_roi = mask[height-bottom_roi_height:, :]
 | 
			
		||||
    
 | 
			
		||||
    if observe:
 | 
			
		||||
@ -544,11 +545,11 @@ def detect_dual_track_lines(image, observe=False, delay=1000, save_log=True,
 | 
			
		||||
                    
 | 
			
		||||
                    # 计算拟合误差
 | 
			
		||||
                    predicted_xs = poly_func(center_ys)
 | 
			
		||||
                    error = np.mean(np.abs(predicted_xs - center_xs))
 | 
			
		||||
                    err = np.mean(np.abs(predicted_xs - center_xs))
 | 
			
		||||
                    
 | 
			
		||||
                    # 如果误差更小,更新最佳拟合
 | 
			
		||||
                    if error < best_error:
 | 
			
		||||
                        best_error = error
 | 
			
		||||
                    if err < best_error:
 | 
			
		||||
                        best_error = err
 | 
			
		||||
                        best_poly_coeffs = poly_coeffs
 | 
			
		||||
                except:
 | 
			
		||||
                    continue
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user