ROS2自动驾驶
yolo5自动驾驶
1、重要!更换U盘的操作指引
2、关闭开机自启动大程序
3、Linux基础
4、YoloV5训练集
5、自动驾驶基础调试(代码解析)
6、自动驾驶特调
7、自动驾驶原理
8、PID算法理论
9、阿克曼运动学分析理论
10、建立运动学模型
常用命令
!重要!首次使用
一、原理分析
麦克纳姆轮运动学分析
二、AI大模型
3、AI大模型类型和原理
4、RAG检索增强和模型训练样本
5、具身智能机器人系统架构
6、具身智能玩法核心源码解读
7、配置AI大模型
8、配置API-KEY
三、深度相机
2、颜色标定
10、深度相机的基础使用
11、深度相机伪彩色图像
12、深度相机测距
13、深度相机色块体积测算
14、深度相机颜色跟随
15、深度相机人脸跟随
16、深度相机KCF物体跟随
17、深度相机Mediapipe手势跟随
18、深度相机视觉循迹自动驾驶
19、深度相机边缘检测
四、多模态视觉理解
20、多模态语义理解、指令遵循
21、多模态视觉理解
22、多模态视觉理解+自动追踪
23、多模态视觉理解+视觉跟随
24、多模态视觉理解+视觉巡线
25、多模态视觉理解+深度相机距离问答
26、多模态视觉理解+SLAM导航
27、多模态视觉理解+SLAM导航+视觉巡线
28、意图揣测+多模态视觉理解+SLAM导航+视觉功能
五、雷达
8、雷达基础使用
思岚系列雷达
六、建立地图
9、Gmapping建图
cartographer快速重定位导航
RTAB-Map导航
RTAB-Map建图
slam-toolbox建图
cartographer建图
Navigation2多点导航避障
Navigation2单点导航避障
手机APP建图与导航
七、新机器人自动驾驶与调整
多模态视觉理解+SLAM导航
新机器人自动驾驶
场地摆放及注意事项
启动测试
识别调试
无人驾驶的车道保持
无人驾驶路标检测
无人驾驶红绿灯识别
无人驾驶之定点停车
无人驾驶转向决策
无人驾驶之喇叭鸣笛
无人驾驶减速慢行
无人驾驶限速行驶
无人驾驶自主泊车
无人驾驶综合应用
无人驾驶融合AI大模型应用
八、路网规划
路网规划导航简介
构建位姿地图
路网标注
路网规划结合沙盘地图案例
路径重规划
九、模型训练
1、数据采集
2、数据集标注
3、YOLOv11模型训练
4、模型格式转换
十、YOLOV11开发
多机通讯配置
汝城县职业中等专业学校知识库-信息中心朱老师编辑
-
+
首页
七、新机器人自动驾驶与调整
无人驾驶综合应用
无人驾驶综合应用
# 自动驾驶综合应用 ## 1.课程内容 **注意:这个程序是在沙盘地图上运行的,个人地图需要自行调整程序** 该教程使用的是出厂的路标模型和车道线识别模型,在沙盘地图上进行居中运动,同时识别到路标会做对应的路标函数动作。 ## 2. 程序路径 自动驾驶源码路径: 车道线保 `/home/jetson/yahboomcar_ros2_ws/yahboomcar_ws/src/auto_drive/auto_drive/auto_drive.py` 路标识别:`/home/jetson/yahboomcar_ros2_ws/yahboomcar_ws/src/auto_drive/auto_drive/yolo_detect.py` ## 3.运行案例程序 ### 3.1 运行程序 * 启动相机+底盘+路标车道线 ``` ros2 launch auto_drive auto_drive_bringup.launch.py ```  程序运行之后会显示yolo识别画面,小车会车道线居中运行,同时会根据行驶过程中识别到的路标做对应的动作。(如果开启程序之后终端没有报错,小车不动,可以运行下面程序来检查参数)  * 启动动态参数配置节点 ``` ros2 run rqt_reconfigure rqt_reconfigure ```  **如果小车不动检查两个参数,START_AutoDrive 是否勾上了,conbine_nav是否为flase** ☑️ 修改完参数,点击GUI空白处写入参数值。注意只会生效当次启动,永久生效需要将参数修改到源码当中。 🛠 参数解析: 【turn_radius】:转弯半径。正常不需要更改这个参数 【drive_speed】:线速度大小。小车的行驶速度,出厂默认是0.15,如果修改这个参数需要自行同步调试其他的参数 【angular_speed】:转弯角速度大小 【duration】:识别右转标志的右转时间, 【cooldown_time】:路标识别冷却时间 【DEBUG_MODE】:可视化debug参数,打开可能会影响居中效果 【START_AutoDrive】:控制小车运动参数,true为小车可运动 【kp、ki、kd】:小车居中pid参数 【turn_radius】:转弯半径。正常不需要更改这个参数 【conbine_nav】:路网导航+开启yolo才需要打开,打开之后小车会停止不动 ### 3.2 识别到路标之后小车的运动 * 直行 * 按照设定的速度进行行驶,也可以在被停车标识之后停止后恢复行驶 * 右转 * 触发右转的固定动作 * 鸣笛 * 触发汽车鸣笛音效 * 人行道 * 触发汽车鸣笛音效、减速1秒 * 限速 * 汽车减速行驶3秒,然后恢复正常速度 * 学校 * 触发汽车鸣笛音效、减速行驶1秒 * 停车场A、B * 触发预设的固定泊车动作 * 红绿灯 * 红灯 * 不结合路网规划时,触发解除车道保持自动驾驶状态 * 结合路网规划时,取消正在执行的导航任务 * 绿灯 * 不结合路网规划时,触发激活车道保持自动驾驶状态 * 结合路网规划时,恢复到上一个导航任务 下图是右转和停车位置固定位置,因为程序采用了固定动作所以要效果好建议是放到这个位置,如果需要放到其他的位置需要重新去调试固定动作时间 。  ### 3.3 调试参数 这里分为两种调试参数的方案,一种是临时实时调试,一种是永久修改参数调试 * 临时实时调试 运行程序之后运行动态调参指令去调试: ``` ros2 run rqt_reconfigure rqt_reconfigure ```  **调试经验:** 1. 如果车道居中保持不稳定可以去看《4.无人驾驶之车道保持》章节 2. 识别右转,转弯不够或者转弯过头可以调节duration这个参数来控制右转弯时间 3. 防止频繁识别路标,修改cooldown_time路标冷却,表示识别路标之间的冷却时长 4. 车道居中调整过慢,调大kp。 * 永久修改参数调试 通过修改参数文件来达到永久修改参数,参数路径 ``` /home/jetson/yahboomcar_ros2_ws/yahboomcar_ws/src/auto_drive/config/auto_drive_node.yaml ``` ``` /home/jetson/yahboomcar_ros2_ws/yahboomcar_ws/src/auto_drive/config/yolo_param.yaml ``` ``` /home/jetson/yahboomcar_ros2_ws/yahboomcar_ws/src/auto_drive/config/midline_points.yaml ``` 三个参数分别表示:自动驾驶参数、路标识别参数、车道线居中参数 **自动驾驶参数:** ``` auto_drive: ros__parameters: turn_radius: 0.4 drive_speed: 0.15 angular_speed: -0.72 duration: 1.3 response_distance_1: 2900 response_distance_2: 132 cooldown_time: 3.0 DEBUG_MODE: False START_AutoDrive: True conbine_nav: False Kp: -0.62 Ki: 0.0 Kd: -0.1 max_integral: 1000.0 image_size: [640, 480] ``` 上面参数和动态调节参数的意义是一样,这里修改之后下次运行默认调用这里的程序,启动需要注意的是START_AutoDrive: True和conbine_nav: False,这两个参数决定小车能不能运行。conbine_nav: False参数之后使用路网导航+自动驾驶的前提才需要打开。 **路标识别参数:** ``` #路标检测推理参数 sign_detection: model_path: '/home/jetson/yahboomcar_ros2_ws/yahboomcar_ws/src/auto_drive/tools/sign_model.engine' conf: 0.92 #设置检测的最小置信度阈值。 将忽略置信度低于此阈值的检测到的对象。 调整此值有助于减少误报。 iou: 0.7 #用于非极大值抑制 (NMS) 的重叠阈值。较低的值会通过消除重叠的框来减少检测结果 rect: True #如果启用,则对图像较短的一边进行最小填充,直到可以被步长整除,以提高推理速度。 half: True #如果启用,则使用半精度推理,可以加快在支持的 GPU 上的模型推理速度,同时对准确性的影响极小。 device: "cuda:0" #推理设备 batch : 50 #批处理大小,更大的批处理大小可以提供更高的吞吐量,从而缩短推理所需的总时间。 max_det : 4 #最多检测的物体数 augment : False #启用测试时增强 (TTA) 进行预测,可能会提高检测的鲁棒性,但会降低推理速度。 verbose : False #是否在终端输出推理的详细信息。 classes : [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13] line_detection: #车道线检测推理参数 model_path: '/home/jetson/yahboomcar_ros2_ws/yahboomcar_ws/src/auto_drive/tools/lane_V6.engine' conf: 0.5 #设置检测的最小置信度阈值。 将忽略置信度低于此阈值的检测到的对象。 调整此值有助于减少误报。 iou: 0.6 #用于非极大值抑制 (NMS) 的重叠阈值。较低的值会通过消除重叠的框来减少检测结果 rect: True #如果启用,则对图像较短的一边进行最小填充,直到可以被步长整除,以提高推理速度。 half: True #如果启用,则使用半精度推理,可以加快在支持的 GPU 上的模型推理速度,同时对准确性的影响极小。 device: "cuda:0" #推理设备 batch : 50 #批处理大小,更大的批处理大小可以提供更高的吞吐量,从而缩短推理所需的总时间。 max_det : 4 #最多检测的物体数 augment : False #启用测试时增强 (TTA) 进行预测,可能会提高检测的鲁棒性,但会降低推理速度。 verbose : False #是否在终端输出推理的详细信息。 ``` 上面参数使用默认即可,一般不需要修改 **车道线居中参数** ``` midline_points: start_point: x: 360 y: 477 end_point: x: 355 y: 424 midline_length: 120 mid_distance: [200,40] ``` 启动start_point和end_point标定小车的中心点,具体可以看中轴线标定的课程。midline_length参数用来调整小车在沙盘地图上的转弯时机,越小转弯的越慢,反之则早转弯 ## 4.源码解析 ### 4.1、auto_drive.py 程序源码路径: `/home/jetson/yahboomcar_ros2_ws/yahboomcar_ws/src/auto_drive/auto_drive/auto_drive.py` 控制流程 (Control Flow)分为 接收并处理图像数据 检测车道线和交通标志 根据检测结果决定控制策略 发布控制指令(速度、方向) 循环执行以上步骤 处理车道检测结果 ``` def __handle_lane_detect_result(self,left_box,right_box,frame): '''处理车道检测结果''' self.error_mode = 99 error_angular = [0.0, 0.0] # 默认角度偏差Default angle deviation if left_box is not None and right_box is not None and left_box[0]<right_box[0] : #如果左右车道线都存在,则绘制左右车道线和交点 self.error_mode=0 #标记误差模式,居中模式:0,左偏模式:1,右偏模式:2 frame=self.lane_detect.draw_left_line(frame, left_box)#绘制左车道线 frame=self.lane_detect.draw_right_line(frame, right_box)#绘制右车道线 frame,x_center,y_center=self.lane_detect.draw_center_point(frame,left_box,right_box)# 绘制车道估计中心点 left_lane_offset,right_lane_offset=self.lane_detect.cal_lane_lateral_offset(left_box,right_box) # self.get_logger().info(f"left_lane_offset: {left_lane_offset:.2f} , right_lane_offset: {right_lane_offset:.2f} ") error_angular=self.lane_detect.cal_error_angular(x_center,y_center)#计算车身与中心点的角度误差 elif left_box is not None and right_box is None and left_box[0]<320: self.error_mode=1 self.lane_detect.prev_center=None frame=self.lane_detect.draw_left_line(frame, left_box) elif right_box is not None and left_box is None : self.error_mode=2 self.lane_detect.prev_center=None frame=self.lane_detect.draw_right_line(frame, right_box) else: self.lane_detect.prev_center=None # 转向动作激活时,暂停车道线速度控制 if self.turn_action_active: return frame if self.error_mode==0 : #居中 if error_angular[1]>=0.03 or error_angular[1]<=-0.03: if abs(error_angular[1])<0.3: angular_z=self.pid_controller.pid_control(error_angular[1]) angular_z=min(angular_z,0.3) angular_z=max(angular_z,-0.3) self.__set_current_speed(linear_x=self.drive_speed,angular_z=angular_z) elif self.error_mode==1: #只有左边车道线 if_infer=self.lane_detect.IF_lane_intersection(left_box) if if_infer is not None: self.__set_current_speed(linear_x=self.drive_speed,angular_z=self.angular_speed) else: self.__set_current_speed(linear_x=self.drive_speed,angular_z=0.0) else: self.__set_current_speed(linear_x=self.drive_speed,angular_z=0.0) # 在图像上显示角度偏差 cv2.putText(frame, f"Angle Dev: {error_angular[1]:.2f} rad", (10, 90), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 0, 255), 2) frame=self.lane_detect.draw_midline(frame) return frame ``` auto_drive节点中sign_callback回调函数会订阅/sign_detect话题,然后在handle_events线程中执行和交通标识对应的动作 ``` def handle_events(self): '''处理目标识别事件Handle target recognition events''' while True: try: object:Object=self.event_queue.get(timeout=0.2) except queue.Empty: continue if self.__check_cooldown(object.class_name): continue # self.get_logger().info(f'{object.class_name} handle') if object.class_name=="straight" and self.sign_enable_list[10]: self.go_straight() elif object.class_name=="turnright" and self.sign_enable_list[11]: self.turn('right') elif object.class_name=="turnright_ground": pass elif object.class_name=="honking" and self.sign_enable_list[1]: self.car_horn() elif object.class_name== "sidewalk" and self.sign_enable_list[6]: self.sidewalk() elif object.class_name=="sidewalk_ground" and self.sign_enable_list[7]: pass elif object.class_name=="speedlimit" and self.sign_enable_list[8]: self.speedlimit() elif object.class_name=="stop" and self.sign_enable_list[9]: self.stop() elif object.class_name=="school" and self.sign_enable_list[5]: self.school() elif object.class_name=="parkA" and self.sign_enable_list[2]: self.parking_A() elif object.class_name=="parkB" and self.sign_enable_list[3]: self.parking_A() elif object.class_name=="greenlight" and self.sign_enable_list[0]: self.greenlight() elif object.class_name =="redlight" and self.sign_enable_list[4]: self.redlight() elif object.class_name=="yellowlight" and self.sign_enable_list[13]: pass elif object.class_name=="out_park" : self.out_parking() ``` ### 4.2、yolo_detect.py 程序源码位于 ``` /home/jetson/yahboomcar_ros2_ws/yahboomcar_ws/src/auto_drive/auto_drive/yolo_detect.py ``` 控制流程 (Control Flow) 图像回调 (image_callback): 将ROS图像消息转换为OpenCV格式 将图像放入处理队列 标志检测处理 (handle_sign): 从队列中获取图像帧 使用YOLO模型进行目标检测 处理检测结果: 过滤忽略的标志(如"turnright_ground", "sidewalk_ground") 发布检测到的标志信息 在调试模式下显示FPS和推理时间 实时显示检测结果 ``` def handle_sign(self): '''处理图像中的道路标识检测结果''' while True: try: frame = self.sign_detect.image_queue.get(timeout=0.01) except queue.Empty: continue infer_start = time.time() results=self.sign_detect.get_infer_result(frame,True) for res in results: if res.boxes is not None: annotated_frame = res.plot() boxes = res.boxes for i in range(len(boxes)): box_coords = boxes.xyxy[i].tolist()# 获取边界框坐标 (xyxy格式: xmin, ymin, xmax, ymax) class_name = res.names[int(boxes.cls[i].item())]# 获取物体名称 confidence = boxes.conf[i].item()# 获取置信度 # 检查是否为需要忽略的标志 if class_name in self.ignored_signs: # rospy.loginfo(f"Ignoring sign: {class_name}") continue # 跳过忽略的标志 # 发布检测结果 if self.sign_pub_counter % 5 == 0: self.sign_publisher.publish(DetectionObject( class_name=class_name, confidence=confidence, xmin=float(box_coords[0]), ymin=float(box_coords[1]), xmax=float(box_coords[2]), ymax=float(box_coords[3]) )) self.sign_pub_counter += 1 if self.DEBUG_MODE: infer_end = time.time() # 更新FPS self.frame_count += 1 curr_time = time.time() time_diff = curr_time - self.prev_time if time_diff >= 1.0: self.fps = self.frame_count / time_diff self.frame_count = 0 self.prev_time = curr_time # 在图像上显示FPS cv2.putText(annotated_frame,f"FPS: {self.fps:.2f}",(10, 25),cv2.FONT_HERSHEY_SIMPLEX,0.6,(0, 255, 0),1,) # 显示推理时间 infer_time = (infer_end - infer_start) * 1000 cv2.putText(annotated_frame, f"Infer: {infer_time:.1f} ms", (10, 45),cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 255), 1) cv2.imshow("Sign-Detect Panel", annotated_frame) cv2.waitKey(1) ``` 主线程负责接收图像,工作线程负责处理图像和检测任务,通过队列进行线程间通信。 ### .2、yolov11_infer.py 程序源码位于`/home/jetson/yahboomcar_ros2_ws/yahboomcar_ws/src/auto_drive/auto_drive/utils/yolov11_infer.py` **控制流程** **Sign_Detect类**: * 创建 Sign_Detect 实例时,加载并解析配置文件 * 调用 init_yolo_engine() 方法: * 初始化图像队列(最大容量为10) * 设置模型推理参数(置信度、IOU 阈值等) * 加载 YOLO 模型 * 通过 put\_image 方法将图像放入处理队列 * 通过 get\_infer\_result 方法获取推理结果 * 使用 YOLO 模型进行目标检测 **Lane_Detect类:** * **车道线检测**:使用 YOLO 模型检测图像中的车道线 * **车道中心点计算**:计算左右车道线的中心点 * **车道偏离检测**:计算车辆相对于车道的偏移角度和距离 * **可视化**:提供多种绘图方法,用于显示检测结果 ``` class Sign_Detect(YOLO_MODEL): """道路标志检测""" def __init__(self,config_file_path): with open(config_file_path, "r") as file: full_config = yaml.safe_load(file) self.config_param = full_config.get("sign_detection", {}) ... class Lane_Detect(YOLO_MODEL): """车道线检测模型""" def __init__(self,config_file_path:str, midline_file_path:str): with open(config_file_path, "r") as file: full_config = yaml.safe_load(file) self.config_param = full_config.get("line_detection", {}) with open(midline_file_path, "r") as file: self.point_config = yaml.safe_load(file) ... ```
admin
2025年12月7日 11:40
27
转发
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
Word文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码
有效期
AI