Enhance arrow detection in task 2 by adding left and right direction counters, updating detection logic, and refining output messages. Adjust movement parameters in task 2.5 for improved execution. Update task 3 to increase maximum iterations for better stability during operations.
This commit is contained in:
		
							parent
							
								
									beb0c1b9f1
								
							
						
					
					
						commit
						f088f626e1
					
				
							
								
								
									
										2
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								main.py
									
									
									
									
									
								
							@ -51,7 +51,7 @@ def main():
 | 
			
		||||
        Ctrl.base_msg.stop()  # BUG 垃圾指令 for eat
 | 
			
		||||
 | 
			
		||||
        # time.sleep(100) # TEST,
 | 
			
		||||
        run_task_1(Ctrl, msg, time_sleep=TIME_SLEEP)
 | 
			
		||||
        # run_task_1(Ctrl, msg, time_sleep=TIME_SLEEP)
 | 
			
		||||
 | 
			
		||||
        arrow_direction = run_task_2(Ctrl, msg, xy_flag=False)
 | 
			
		||||
        # arrow_direction = 'right' # TEST
 | 
			
		||||
 | 
			
		||||
@ -46,6 +46,10 @@ class AsyncArrowDetector:
 | 
			
		||||
        self.save_dir = "logs/image"
 | 
			
		||||
        os.makedirs(self.save_dir, exist_ok=True)
 | 
			
		||||
        
 | 
			
		||||
        # 添加左右方向计数器
 | 
			
		||||
        self.left_count = 0
 | 
			
		||||
        self.right_count = 0
 | 
			
		||||
        
 | 
			
		||||
        info("异步箭头检测器已初始化", "初始化")
 | 
			
		||||
    
 | 
			
		||||
    def start_detection(self, interval=0.5):
 | 
			
		||||
@ -94,8 +98,14 @@ class AsyncArrowDetector:
 | 
			
		||||
                            self.arrow_result = direction
 | 
			
		||||
                            self.result_time = current_time
 | 
			
		||||
                            
 | 
			
		||||
                            # 更新方向计数
 | 
			
		||||
                            if direction == "left":
 | 
			
		||||
                                self.left_count += 1
 | 
			
		||||
                            elif direction == "right":
 | 
			
		||||
                                self.right_count += 1
 | 
			
		||||
                            
 | 
			
		||||
                        if direction != "unknown":
 | 
			
		||||
                            info(f"异步检测到{direction}箭头", "箭头检测")
 | 
			
		||||
                            info(f"异步检测到{direction}箭头 (left: {self.left_count}, right: {self.right_count})", "箭头检测")
 | 
			
		||||
                            
 | 
			
		||||
                            # 保存检测结果的可视化图像
 | 
			
		||||
                            timestamp = time.strftime("%Y%m%d_%H%M%S")
 | 
			
		||||
@ -111,9 +121,21 @@ class AsyncArrowDetector:
 | 
			
		||||
            time.sleep(0.05)
 | 
			
		||||
    
 | 
			
		||||
    def get_last_result(self):
 | 
			
		||||
        """获取最后一次成功的箭头检测结果"""
 | 
			
		||||
        """获取最后一次成功的箭头检测结果和计数情况"""
 | 
			
		||||
        with self.lock:
 | 
			
		||||
            return self.arrow_result, self.result_time, self.last_processed_image
 | 
			
		||||
            # 根据计数确定最终方向
 | 
			
		||||
            final_direction = self.arrow_result
 | 
			
		||||
            if self.left_count > self.right_count:
 | 
			
		||||
                final_direction = "left"
 | 
			
		||||
            elif self.right_count > self.left_count:
 | 
			
		||||
                final_direction = "right"
 | 
			
		||||
            
 | 
			
		||||
            return final_direction, self.result_time, self.last_processed_image
 | 
			
		||||
    
 | 
			
		||||
    def get_counts(self):
 | 
			
		||||
        """获取当前的左右方向计数"""
 | 
			
		||||
        with self.lock:
 | 
			
		||||
            return self.left_count, self.right_count
 | 
			
		||||
 | 
			
		||||
def run_task_2(ctrl, msg, xy_flag=False):
 | 
			
		||||
    # 微调 xy 和角度
 | 
			
		||||
@ -209,7 +231,8 @@ def run_task_2(ctrl, msg, xy_flag=False):
 | 
			
		||||
                
 | 
			
		||||
                if result is not None and result != "unknown":
 | 
			
		||||
                    arrow_direction = result
 | 
			
		||||
                    info(f"成功检测到箭头方向: {arrow_direction}", "箭头检测")
 | 
			
		||||
                    left_count, right_count = arrow_detector.get_counts()
 | 
			
		||||
                    info(f"成功检测到箭头方向: {arrow_direction} (left: {left_count}, right: {right_count})", "箭头检测")
 | 
			
		||||
                    break
 | 
			
		||||
                
 | 
			
		||||
                time.sleep(0.1)
 | 
			
		||||
@ -224,7 +247,21 @@ def run_task_2(ctrl, msg, xy_flag=False):
 | 
			
		||||
                if image is not None:
 | 
			
		||||
                    # 直接在当前图像上检测
 | 
			
		||||
                    arrow_direction = detect_arrow_direction(image, observe=False)
 | 
			
		||||
                    info(f"直接检测到箭头方向: {arrow_direction}", "箭头检测")
 | 
			
		||||
                    
 | 
			
		||||
                    # 更新计数
 | 
			
		||||
                    if arrow_direction == "left":
 | 
			
		||||
                        arrow_detector.left_count += 1
 | 
			
		||||
                    elif arrow_direction == "right":
 | 
			
		||||
                        arrow_detector.right_count += 1
 | 
			
		||||
                    
 | 
			
		||||
                    # 根据总计数确定最终方向
 | 
			
		||||
                    left_count, right_count = arrow_detector.get_counts()
 | 
			
		||||
                    if left_count > right_count:
 | 
			
		||||
                        arrow_direction = "left"
 | 
			
		||||
                    elif right_count > left_count:
 | 
			
		||||
                        arrow_direction = "right"
 | 
			
		||||
                    
 | 
			
		||||
                    info(f"直接检测到箭头方向: {arrow_direction} (left: {left_count}, right: {right_count})", "箭头检测")
 | 
			
		||||
                    
 | 
			
		||||
                    # 保存检测结果的可视化图像
 | 
			
		||||
                    timestamp = time.strftime("%Y%m%d_%H%M%S")
 | 
			
		||||
@ -245,6 +282,10 @@ def run_task_2(ctrl, msg, xy_flag=False):
 | 
			
		||||
    print('y为',ctrl.odo_msg.xyz[1])
 | 
			
		||||
    print('z为',ctrl.odo_msg.xyz[2])
 | 
			
		||||
    
 | 
			
		||||
    # 输出最终计数结果
 | 
			
		||||
    left_count, right_count = arrow_detector.get_counts()
 | 
			
		||||
    info(f"箭头检测最终结果: left={left_count}, right={right_count}, 选择={arrow_direction}", "箭头检测结果")
 | 
			
		||||
    
 | 
			
		||||
    # 返回检测到的箭头方向
 | 
			
		||||
    return arrow_direction
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@ observe = True
 | 
			
		||||
 | 
			
		||||
def run_task_2_5(Ctrl, msg, direction='left'):
 | 
			
		||||
    section('任务2.5:预备进入任务3', "启动")
 | 
			
		||||
    go_straight(Ctrl, msg, distance=-0.1, speed=0.5, observe=observe)
 | 
			
		||||
    go_straight(Ctrl, msg, distance=-0.2, speed=0.5, observe=observe)
 | 
			
		||||
 | 
			
		||||
    # TEST
 | 
			
		||||
    turn_degree_v2(Ctrl, msg, 90, absolute=observe)
 | 
			
		||||
@ -24,14 +24,16 @@ def run_task_2_5(Ctrl, msg, direction='left'):
 | 
			
		||||
    turn_success, res = arc_turn_around_hori_line(
 | 
			
		||||
        Ctrl,
 | 
			
		||||
        msg,
 | 
			
		||||
        angle_deg=90 if direction == 'left' else -90,
 | 
			
		||||
        angle_deg=85 if direction == 'left' else -85,
 | 
			
		||||
        target_distance=0.2,
 | 
			
		||||
        detect_func_version=3,
 | 
			
		||||
        pass_align=True,
 | 
			
		||||
        radius=0.55,
 | 
			
		||||
        observe=observe,
 | 
			
		||||
        no_end_reset=True,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    go_straight(Ctrl, msg, distance=0.2, speed=0.5, observe=observe)
 | 
			
		||||
    go_straight(Ctrl, msg, distance=0.4, speed=0.5, observe=observe)
 | 
			
		||||
    section('任务2.5-2:第二次旋转', "移动")
 | 
			
		||||
 | 
			
		||||
def run_task_2_5_back(Ctrl, msg, direction='left'):
 | 
			
		||||
 | 
			
		||||
@ -101,7 +101,7 @@ def pass_up_down(ctrl, msg):
 | 
			
		||||
        stable_threshold = 8  # 连续15次检测z轴不再增加则认为已经停止
 | 
			
		||||
        z_speed_threshold = 0.01  # z轴速度阈值,小于这个值认为已经停止爬升
 | 
			
		||||
        climb_speed_threshold = 0.05  # 检测到开始爬坡的速度阈值
 | 
			
		||||
        max_iterations = 180  # 最大循环次数,作为安全保障
 | 
			
		||||
        max_iterations = 200  # 最大循环次数,作为安全保障
 | 
			
		||||
        min_iterations = 170  # 最小循环次数,作为安全保障
 | 
			
		||||
 | 
			
		||||
        # 姿态判断参数
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user