版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章绪论一、授课对象车辆工程、智能车辆工程等相关专业本科生二、授课主题自动驾驶系统技术架构与开发环境准备——绪论三、核心目标1.知识目标:使学生理解自动驾驶系统的“感知-决策-执行”核心闭环原理;掌握Autoware模块化分层式设计架构(感知定位层、决策规划层、执行控制层)及各层核心功能;了解常见车载传感器(GNSS、IMU、激光雷达、摄像头、毫米波雷达等)的作用;理解纵向控制与横向控制的基本概念及其在路径/速度跟踪中的作用;掌握Autoware对操作系统(Ubuntu)及基础软件(ROS、Qt、CUDA)的环境要求。2.能力目标:培养学生绘制自动驾驶系统技术架构图的能力,并能解释各模块间数据流;提升学生根据Autoware版本选择匹配Ubuntu系统的环境配置能力;引导学生具备通过资料检索解决Ubuntu系统安装等工程问题的能力;增强学生分析自动驾驶车辆在复杂场景下“感知-决策-执行”协同工作的能力。3.素养目标:树立学生系统化工程思维,理解自动驾驶作为复杂软硬件集成体系的开发逻辑;培养其对自动驾驶技术变革的时代使命感与探索兴趣;引导其辩证思考技术落地中的安全、伦理与法规问题,建立负责任的技术发展观。四、授课重难点1.重点:自动驾驶系统“感知-决策-执行”核心闭环原理;Autoware三大层级(感知定位层、决策规划层、执行控制层)的功能划分与数据流;环境感知、行为决策、轨迹规划、纵向控制、横向控制等关键模块的职责;常见车载传感器(GNSS、IMU、激光雷达、摄像头、毫米波雷达等)在自动驾驶中的作用;Autoware开发环境对Ubuntu、ROS、Qt等软件的版本匹配要求。2.难点:Ubuntu系统的独立安装与配置(双系统或UbuntuToGo方案),涉及动手能力与问题排查;理解纵向控制与横向控制的耦合关系及其对行驶安全性与舒适性的影响;从“行为决策”到“轨迹规划”再到“控制执行”的逐层转化逻辑。五、教学方法讲授法、案例分析法、类比教学法、多媒体辅助教学法、问题驱动法、自学引导法六、教学准备1.教学素材:PPT课件(整合自动驾驶技术架构图、Autoware分层设计图、传感器示意图、环境要求表格等;多媒体素材(自动驾驶系统“感知-决策-执行”闭环动画);行业案例资料(Autoware开源社区介绍、主流车企自动驾驶方案)。2.互动准备:讨论议题(如果没有高精地图,自动驾驶还能正常工作吗?哪些模块会受影响?);自学任务(提前尝试搜索‘Ubuntu双系统安装教程’,记录至少一个可能遇到的问题);分组任务清单(调研主流自动驾驶开源框架Apollo和Autoware,对比其架构层级)。3.辅助工具:多媒体教学设备;车载传感器(激光雷达、摄像头等)实物或模型;课前预习问卷(了解学生对自动驾驶的认知程度)。七、教学内容与过程设计(一)导入环节:课程介绍与时代背景(讲授+多媒体展示)1.课程定位介绍:明确本课程为理实一体化课程,围绕自动驾驶系统的基础架构与关键技术,系统学习高精地图、定位、感知、决策规划、控制、仿真等模块的工程实践方法,最终建立初步的自动驾驶系统开发能力。2.时代背景引入:展示全球主要国家自动驾驶战略图,强调当前处于L3大规模应用与有限区域L4商业落地的关键节点,提出“时代的邀请”,激发学生参与技术变革的热情。3.引出本章主题:明确绪论核心内容——自动驾驶技术架构与开发环境准备,帮助学生建立全局认知框架。(二)基础铺垫:自动驾驶系统技术架构(讲授+类比+图示)1.“感知-决策-执行”闭环原理(重点)核心逻辑:通过激光雷达、GNSS等多源传感器获取环境与定位信息→高性能计算平台分析决策→底盘执行机构完成驾驶动作。生活化类比:传感器=眼睛耳朵,计算平台=大脑,执行机构=手脚。强调闭环特性:持续迭代,实时响应。2.Autoware模块化分层式设计(重点)三层级划分:感知定位层:回答“我在哪?周围有什么?”决策规划层:回答“接下来干什么?具体怎么走?”执行控制层:回答“跑多快?往哪拐?”标准化接口通信:各层通过标准数据接口协同工作。3.感知定位层详解多传感器融合:GNSS、IMU、超声波雷达、激光雷达、摄像头、毫米波雷达等。环境感知功能:识别行驶路径、周边物体、交通标志、驾驶状态、天气环境等,为决策规划提供依据。车辆定位功能:通过算法获取车辆位置、姿态(航向角、俯仰角、横摆角),为决策与执行提供定位信息。4.决策规划层详解行为决策:在交通法规与安全约束下选择行为(停车、超车、变道、跟驰等)。轨迹规划:规划时空维度的可行轨迹(全局与局部路径/速度规划)。二者关系:行为决策提供目标导向,轨迹规划转化为可执行期望车速/路径。5.执行控制层详解(难点)纵向控制:控制车速(“油门给多少”),通过期望车速与实际车速偏差控制驱动/制动系统。横向控制:控制方向(“方向盘转多少”),通过期望路径与实际路径横向偏差控制转向系统。耦合问题:需协调纵向与横向控制,保证行驶安全性与乘坐舒适性。数据融合与算法:实时采集轮速、转向角、IMU等数据,通过卡尔曼滤波等算法构建车辆状态估计,生成最优控制指令。6.互动提问如果感知定位层误将一辆停靠路边的公交车识别为可行驶区域,决策规划层和执行控制层会如何响应?可能导致什么后果?(三)核心精讲:自动驾驶系统开发环境(讲授+表格+自学引导)1.硬件与操作系统要求(重点)原则:先确定Autoware版本,再根据其要求安装对应Ubuntu系统,避免兼容性问题。UbuntuToGo方案:推荐使用外接移动固态硬盘安装Ubuntu,即插即用,不破坏原有系统。2.基础软件环境(重点)必须安装:ROS、Qt可选安装:CUDA(GPU加速)版本匹配表格:展示不同Ubuntu系统下ROS与Qt的对应版本要求。3.难点自学任务引导(难点)Ubuntu系统安装:列为难点,需学生自学。原因:考验动手能力与资料检索能力,解决硬件差异带来的问题是工程师思维的培养过程。建议方案:提供官方安装文档链接、常见问题排查清单、UbuntuToGo实操视频。(四)总结与升华:知识体系与学习启示(梳理+思考)1.核心知识梳理技术架构:“感知-决策-执行”闭环Autoware三层级:感知定位层→我在哪、周围有什么决策规划层→干什么、怎么走执行控制层→跑多快、往哪拐开发环境:Ubuntu+ROS+Qt(版本匹配原则)2.思维启发讨论L4级自动驾驶普及后,传统交通法规中‘驾驶员责任’条款应如何修改?感知定位层的失效冗余设计应达到什么级别?3.学习启示本章是后续高精地图、定位、感知、控制等模块的基础铺垫。鼓励学生主动动手搭建开发环境,培养工程化思维与问题解决能力。预告下一章内容:Autoware源码安装与常用功能组件介绍。八、课后任务1.基础作业:绘制自动驾驶系统技术架构图,标注各模块及数据流方向。2.实践作业:完成Ubuntu系统安装(双系统或UbuntuToGo),截图系统信息并撰写100字安装过程小结(包含遇到的问题与解决方法)。3.拓展作业:调研主流自动驾驶开源框架Apollo,对比其架构与Autoware的异同,撰写500字对比报告。九、考核要点1.基础认知:自动驾驶“感知-决策-执行”闭环原理;Autoware三大层级的功能划分与数据流;常见车载传感器及其作用;纵向控制与横向控制的定义;Autoware开发环境对Ubuntu、ROS的版本匹配要求。2.应用分析:结合具体驾驶场景(如高速变道、城市路口),分析感知-决策-执行各模块的协同工作逻辑;解释行为决策与轨迹规划之间的关系;分析纵向控制与横向控制的耦合问题对行驶舒适性的影响;评估不同Ubuntu安装方案(双系统vsUbuntuToGo)的适用场景。3.能力拓展:独立完成Ubuntu系统安装与基础环境配置的能力;通过资料检索解决工程环境问题的能力;绘制并解释自动驾驶技术架构图的表达能力;辩证思考技术落地中安全、法规与伦理问题的能力。十、教学反思(课后填写)1.学生对“感知-决策-执行”闭环及Autoware三层级架构的理解是否清晰?是否需要补充更多类比或动画演示?2.Ubuntu系统安装作为自学难点,学生的完成率与问题类型有哪些?是否需要提供更详细的常见问题排查文档或线下答疑?3.课堂讨论与互动环节的参与度如何?案例是否需要更贴近学生生活(如校园接驳车场景)?
第2章开源自动驾驶框架Autoware一、授课对象车辆工程、智能车辆工程等相关专业本科生二、授课主题开源自动驾驶框架Autoware的基本概况、源码安装方法及常用功能组件的使用三、核心目标1.知识目标:使学生掌握Autoware开源自动驾驶框架的基本概况、历史背景与分层架构(应用层、中间层、操作系统层);理解ROS作为Autoware中间件的核心作用及其提供的通信机制与工具链(Catkin、OpenCV、rosbag、RViz、tf、RQT等);掌握终端常用命令(cd、pwd、mkdir、ls、touch、mv、cp、sudo)的功能与用法;掌握ROSMelodic的完整安装步骤与环境配置方法;理解Autoware源码安装的完整流程(创建工作空间、下载配置、导入源码、安装依赖、编译源码);掌握启动文件(.launch)、坐标变换库(tf)、数据可视化工具(RViz)、数据记录与回放工具(rosbag)的核心功能与使用方法。2.能力目标:培养学生独立完成Autoware源码环境搭建与运行的工程实践能力;提升学生使用终端命令进行Linux系统操作的能力;引导学生具备通过rosbag与RViz进行数据回放与可视化分析的能力;增强学生解读与编写简单启动文件(.launch)的能力,理解多节点配置逻辑。3.素养目标:强化学生的开源技术思维,理解开源生态对自动驾驶技术发展的推动作用;培养其面对环境配置等工程问题时的耐心与系统化排查能力;引导其树立规范化的软件开发习惯(如工作空间管理、版本匹配、依赖管理)。四、授课重难点1.重点:Autoware的分层架构(应用层、中间层、操作系统层);ROS的通信机制(发布/订阅、客户端/服务端)及常用工具(Catkin、OpenCV、rosbag、RViz、tf);终端常用命令的功能与使用场景(目录操作、文件操作、权限操作);Autoware源码安装的完整五步流程(工作空间、配置下载、源码导入、依赖安装、编译);启动文件(.launch)的结构与核心属性(pkg、type、name、args);坐标变换库(tf)的基本原理及view_frames、tf_echo工具的使用;RViz的界面组成与常用显示插件(PointCloud2、Pose、TF等);rosbag的数据记录(record)与回放(play)命令。2.难点:ROS的安装与环境配置(涉及软件源、密钥、rosdep初始化、环境变量设置等多个环节,细节多、易出错);理解tf坐标变换树形数据结构及多坐标系(世界、车辆、传感器、地图等)之间的变换逻辑;启动文件中<node>、<rosparam>等元素的配置逻辑及参数服务器的使用;Autoware编译过程中CUDA可选配置的理解与分情况处理;使用rosbag与RViz联合进行离线数据调试的完整流程。五、教学方法讲授法、案例分析法、实操演示法、任务驱动法、对比教学法、多媒体辅助教学法六、教学准备1.教学素材:PPT课件(整合Autoware历史背景图、分层架构图、终端命令表格、ROS安装步骤截图、Autoware编译流程图、启动文件代码片段、tf树示意图、RViz界面分区图、常用显示插件表格等);多媒体素材(Autoware官方示例运行全程录屏、终端命令操作演示视频、rosbag回放与RViz可视化联合演示视频、view_frames生成tf树动画);行业案例资料(Autoware开源社区介绍、Autoware与Apollo架构对比、国内外基于Autoware的自动驾驶落地案例)。2.互动准备:讨论议题(如果没有ROS作为中间层,Autoware各模块之间的通信会面临哪些困难?);实操任务(在虚拟机或Ubuntu系统中依次执行cd、pwd、mkdir、ls等命令,记录输出结果);分组任务清单(分组尝试运行Autoware官方示例,记录遇到的问题及解决方案,课堂分享)。3.辅助工具:多媒体教学设备、预装Ubuntu18.04的演示机或虚拟机环境、Autoware1.12.0源码与官方示例数据包、课前预习问卷(了解学生对Linux终端命令、ROS的认知程度)。七、教学内容与过程设计(一)导入环节:课程衔接+历史背景引入(讲授+多媒体展示)1、复习衔接:简要回顾第1章“感知-决策-执行”闭环与Autoware三层架构,提出问题:“第一章我们了解了Autoware的分层设计,那么这套框架是如何一步步安装并运行起来的?它依赖哪些核心工具?”2、历史背景引入:介绍Autoware于2015年由名古屋大学ShinpeiKato教授团队推出,是全球首个基于ROS的全栈开源自动驾驶解决方案,打破了当时谷歌Waymo、特斯拉等闭门研发的局面,开创了开源自动驾驶软件的先河。3、引出本章主题:明确本章核心——系统学习Autoware的基本概况、源码安装方法及常用功能组件,帮助学生搭建“认识-安装-使用”的完整实践框架。(二)基础铺垫一:Autoware基本介绍(讲授+对比分析+互动)1.Autoware的历史地位与价值时间背景:2015年自动驾驶技术主要掌握在少数科技公司手中,外界难以接触真实代码。开创性意义:全球首个基于ROS的全栈开源自动驾驶解决方案,第一个真正意义上的开源自动驾驶软件。课程选择原因:开源属性、完整生态、广泛的社区支持。2.Autoware的分层架构(重点)应用层:开发者最常接触,包含车辆定位、环境感知、决策规划、运动控制等核心功能模块,对应“感知-决策-执行”闭环。另有节点管理器负责协调模块间通信与调度。中间层(ROS):让各模块互相通信、协同工作(如感知→规划→控制的数据流转)。操作系统层(Linux/Ubuntu):ROS与Autoware的运行基础,稳定性和兼容性直接影响系统效果。呼应第1章强调Ubuntu版本选择的重要性。3.ROS作为中间件的核心能力(重点)通信机制:基于TCP/UDP封装的发布/订阅、客户端/服务端模型。常用库与工具:Catkin:原始构建系统OpenCV:图像处理库rosbag:数据记录与回放RViz:数据可视化tf:坐标变换库RQT:GUI开发工具强调:这些工具共同构成Autoware的底层支撑,保证其高度灵活性与可扩展性。4.互动提问如果感知模块发布了‘前方障碍物’话题,规划模块和控制模块如何通过ROS获取这一信息?请画出数据流示意图。(三)基础铺垫二:终端常用命令(讲授+实操演示)1.终端打开方式快捷键Ctrl+Alt+T2.常用命令分类讲解(重点)分类命令功能常用选项目录操作cd切换工作目录pwd显示当前绝对路径mkdir创建目录-p(递归创建父目录)ls列出目录内容-l(详细列表)、-a(显示隐藏文件)文件操作touch创建空文件/更新时间戳mv移动文件/重命名cp拷贝文件/目录-r(递归)、-i(覆盖提示)权限操作sudo以超级用户权限执行命令3.实操引导现场演示在终端中依次执行各命令,让学生观察输出。强调:sudo输入密码时屏幕无显示是正常现象。(四)核心精讲一:ROS安装与环境配置(难点+重点)1.课程环境说明Ubuntu18.04/ROSMelodic/Autoware1.12.02.ROSMelodic安装六步法(重点)步骤操作核心作用第一步添加ROS软件源告诉系统从哪里下载ROS第二步添加密钥验证软件包合法性第三步安装ROS(desktop-full)安装核心+工具库+功能包第四步初始化rosdep(init+update)依赖管理工具,自动检查安装系统依赖第五步设置环境变量(~/.bashrc)每次打开终端自动加载ROS环境第六步安装rosinstall下载管理ROS功能包源码3.系统依赖安装更新软件源:sudoaptupdate安装ROS编译相关Python包安装Python3相关依赖升级setuptools(避免编译错误)4.难点提示rosdepinit/update必须成功,否则后续编译会遇到问题。环境变量配置后需执行source~/.bashrc立即生效。(五)核心精讲二:Autoware源码安装与运行(讲授+实操演示)1.源码安装五步流程(重点)步骤命令/操作说明第一步:
创建工作空间mkdir-pautoware.ai/src创建autoware.ai文件夹及src子目录第二步:
下载配置文件wget-Oautoware.ai.repos<URL>下载记录代码仓库地址的配置文件第三步:
导入源码vcsimportsrc<autoware.ai.repos根据配置文件下载所有源码到src第四步:
安装依赖rosdepinstall--from-pathssrc--ignore-src-r-y自动安装缺少的系统依赖第五步:
编译工作区catkin_make或AUTOWARE_COMPILE_WITH_CUDA=1catkin_make分有无CUDA两种情况2.运行官方示例(重点)下载数据:点云地图+矢量地图、rosbag传感器数据启动流程(多终端标签页):启动地图:roslaunchmy_map.launch启动定位:roslaunchmy_localization.launch打开RViz并加载配置回放数据:rosbagplay<文件名>.bag快捷键:Shift+Ctrl+T新建终端标签页,Ctrl+C中断程序,Space暂停/继续回放3.实操演示与思考播放Autoware示例运行全程录屏,引导学生关注各终端标签页的启动顺序。提问:如果地图启动后RViz中看不到点云数据,可能的原因有哪些?(六)核心精讲三:常用功能组件说明(讲授+案例+实操)1.启动文件(.launch)(重点)定义:通过XML文件实现多节点配置和启动的途径,可同时启动一组节点、自动启动节点管理器。示例解析(my_map.launch):<launch>:根元素<node>:启动节点,核心属性包括pkg(功能包)、type(可执行文件)、name(节点名称)、args(输入参数)<rosparam>:参数设置,可将YAML文件加载到参数服务器价值:将点云地图加载、矢量地图加载、TF坐标变换等多个节点整合在一起,方便管理。2.坐标变换库(tf)(重点+难点)核心问题:世界坐标系、车辆坐标系、传感器坐标系、地图坐标系之间存在变换关系。tf功能:允许用户随时跟踪多个坐标系,使用树形数据结构实现任意坐标系间点、向量的变换。车辆坐标系定义:原点O位于车辆后轴中心,x轴向前,z轴向上,y轴向左。常用工具:view_frames:生成tf树信息(.pdf文件),可视化各坐标系间父子关系。tf_echo:查看指定两坐标系间的变换关系。难点讲解:结合tf树示意图,讲解世界→地图→车辆→激光雷达的逐层变换逻辑。3.数据可视化工具(RViz)(重点)界面五区域:3D视图显示区域:图形化显示数据工具栏区域:视角控制、目标设置等显示项目区域:添加/配置插件观测视角设置区域时间显示区域常用显示插件(表格形式):插件名称可视化内容自动驾驶应用场景PointCloud/PointCloud2激光雷达三维点云障碍物检测、道路边界识别PointStamped圆形单点标记标注特定位置Polygon二维线框多边形障碍物轮廓表示Pose箭头表示三维位姿车辆位姿、目标位置PoseArray多个位姿集合路径规划候选点Range圆锥形表示传感器范围超声波雷达探测TFXYZ轴箭头坐标系关系可视化4.数据记录与回放工具(rosbag)(重点)作用:实现数据复用、离线调试。查看话题:rostopiclist记录数据:rosbagrecord-a-Obagfiles/<名称>(-a表示所有话题)回放数据:rosbagplay<文件名>.bag实操关联:回放官方示例数据时使用的就是rosbagplay命令。5.互动实操任务:在终端中执行rostopiclist查看当前话题,选择一个话题用rosbagrecord单独记录,然后用rosbagplay回放并在RViz中观察。(七)总结与升华:知识体系与思维启发(梳理+思考)1.核心知识梳理Autoware概况:分层架构(应用层/中间层/操作系统层)、ROS工具链环境搭建:终端命令→ROS安装→系统依赖→源码五步安装→示例运行常用组件:启动文件(.launch):多节点配置与启动tf:多坐标系变换管理RViz:数据可视化rosbag:数据记录与回放2.思维启发讨论在实际自动驾驶研发中,为什么需要rosbag离线回放功能?如果实车测试中遇到一个偶发性障碍物误检问题,如何利用rosbag+RViz进行复现与分析?3.学习启示本章是Autoware工程实践的入门核心,后续所有模块(定位、感知、规划、控制)的开发与调试都依赖本章所学的工具(ROS、RViz、rosbag、tf)。鼓励学生在自己的电脑上完整走一遍源码安装流程,遇到问题主动检索解决,这是工程师成长的必经之路。预告下一章内容:C++与ROS编程基础知识梳理。八、课后任务1.基础作业:在终端中依次执行cd、pwd、mkdir、ls、touch、mv、cp命令,截图并标注每个命令的作用。2.实践作业:下载Autoware官方示例数据,完成地图加载、定位启动、RViz可视化、rosbag回放的完整流程,记录关键步骤截图。3.拓展作业:调研ROS2与ROS1在通信机制、实时性、多机器人支持等方面的差异,分析Autoware向ROS2迁移可能带来的优势,撰写500字分析报告。九、考核要点1.基础认知:Autoware的分层架构(应用层/中间层/操作系统层);ROS的核心作用及常用工具(Catkin、rosbag、RViz、tf);终端常用命令(cd、pwd、mkdir、ls、touch、mv、cp、sudo)的功能;ROSMelodic安装六步法的关键命令与作用;启动文件的核心属性(pkg、type、name、args);tf的作用及view_frames、tf_echo的用途;RViz界面五区域及常用显示插件;rosbag的record与play命令。2.应用分析:结合Autoware官方示例运行流程,解释地图启动、定位启动、RViz配置、数据回放各步骤的作用;分析tf树中世界坐标系、地图坐标系、车辆坐标系、激光雷达坐标系之间的变换逻辑;解读给定.launch文件中的节点配置与参数加载逻辑;分析rosbag离线回放在自动驾驶算法调试中的价值。3.能力拓展:独立完成ROS环境安装与Autoware源码编译的能力;使用终端命令进行Linux系统操作的能力;使用rosbag与RViz联合进行数据可视化分析的能力;编写简单启动文件进行多节点启动的能力;面对环境配置问题时的资料检索与排查能力。十、教学反思(课后填写)1.学生对ROS安装与rosdep初始化环节的完成情况如何?是否需要提供更详细的常见问题排查文档?2.学生对tf坐标变换树形结构的理解是否达标?是否需要增加更多坐标系变换的动画演示或交互式练习?3.课堂实操任务(终端命令、rosbag+RViz联合)的参与度如何?是否需要增加更多小组协作环节?
第3章Autoware编程基础一、授课对象车辆工程、智能车辆工程等相关专业本科生二、授课主题基于C++的ROS编程基础:从C++核心语法到ROS话题与服务通信的完整实践三、核心目标1.知识目标:使学生掌握C++编程中IO库、复合类型变量(引用、指针)、迭代语句(while/for)、条件语句(if/switch)、类与模板的核心语法与使用场景;理解ROS文件系统(工作空间、功能包、元功能包)的层次化组织结构;掌握ROS话题通信(发布/订阅模型)与服务通信(客户端/服务端模型)的核心原理与差异;掌握ROS常用命令行工具(roscore、rosrun、rostopic、rosservice、rosbag、rosnode、rqt_graph)的功能与用法;掌握ROS工作空间的创建、编译与环境变量配置方法;理解话题消息(msg)与服务数据(srv)的定义方法及代码生成机制。2.能力目标:培养学生独立编写ROS发布者节点与订阅者节点的能力,实现话题消息的发布与订阅;培养学生独立编写ROS客户端节点与服务端节点的能力,实现服务请求与应答;提升学生自定义话题消息(.msg)与服务数据(.srv)并完成编译配置的能力;引导学生具备使用rosbag记录与回放话题数据、使用rqt_graph可视化节点关系的能力;增强学生阅读与理解Autoware源码中C++与ROS代码的基础能力。3.素养目标:强化学生的模块化编程思维,理解ROS节点化架构对复杂系统开发的价值;培养其从“使用者”向“开发者”转变的工程实践意识;引导其树立规范的代码编写与编译配置习惯(如CMakeLists.txt、package.xml的正确配置)。四、授课重难点1.重点:C++核心语法(引用与指针的区别、while/for循环结构、if/switch条件分支、类的封装与继承、函数模板与类模板的定义);ROS文件系统(工作空间、功能包、标准目录);ROS话题通信(发布者/订阅者模型、节点管理器作用、消息队列机制);ROS服务通信(客户端/服务端模型、请求-应答同步交互);ROS常用命令(roscore、rosrun、rostopic、rosservice、rosbag、rosnode、rqt_graph);发布者/订阅者节点代码的完整流程(初始化、句柄、发布者/订阅者对象、主循环/回调、spin);客户端/服务端节点代码的完整流程(初始化、句柄、等待服务、客户端对象、请求/应答、回调);.msg与.srv文件的自定义与编译配置。2.难点:模块化设计思想(如何将自动驾驶功能拆解为多个独立节点并通过ROS通信协同工作);发布/订阅模式的理解(发布者与订阅者解耦、异步通信、消息队列缓冲机制);回调函数的执行机制(spin()与spinOnce()的区别、回调函数何时被触发);自定义消息与服务时的编译配置;指针与引用的本质差异(独立对象vs别名、可重新绑定vs永久绑定);模板的实例化机制。五、教学方法讲授法、案例分析法、对比教学法、实操演示法、任务驱动法、类比教学法六、教学准备1.教学素材:PPT课件(整合C++语法示例代码、ROS文件系统层级图、话题通信流程图、服务通信流程图、命令对比表格、节点代码完整片段);多媒体素材(海龟仿真器话题通信实操录屏、rqt_graph节点关系动态演示、rosbag记录与回放操作视频);行业案例资料(Autoware源码中功能包结构解析、ROS官方教程文档节选)。2.互动准备:讨论议题(在自动驾驶系统中,哪些功能适合用话题通信?哪些适合用服务通信?为什么?);实操任务(在海龟仿真器中完成发布者节点编写,控制海龟画一个正方形);分组任务清单(分组实现一个自定义消息的发布-订阅通信,并在课堂上演示)。3.辅助工具:多媒体教学设备;预装ROSMelodic的Ubuntu18.04环境;海龟仿真器(turtlesim)演示环境;课前预习问卷(了解学生对C++和ROS的认知程度)。七、教学内容与过程设计(一)导入环节:课程衔接+动机激发(讲授+问题驱动)1.复习衔接:回顾第2章中Autoware的源码安装与示例运行,提出问题:“我们已经成功运行了Autoware示例,但如果想修改某个模块的功能(比如改变路径规划算法),我们需要具备哪些编程能力?”2.动机激发:强调本章是从“使用者”转向“开发者”的关键一步。Autoware基于ROS搭建,源码用C++编写——看懂源码需懂C++,二次开发需懂ROS编程。3.引出本章主题:明确本章核心——系统学习C++核心语法与ROS编程基础,帮助学生搭建“语言基础-框架理解-通信实现”的完整能力链。(二)核心精讲一:C++编程基础(讲授+示例代码+对比分析)设计说明:本节内容较多,按知识点逐一讲解,每个知识点配合代码示例。由于包含大量代码示例,教案层面做要点提炼与逻辑串联,授课时配合PPT展示完整代码。1.C++简介与学习动机C++历史:1983年由BjarneStroustrup在贝尔实验室设计开发,是C语言的超集。核心特性:面向对象编程(类、继承、多态)+泛型编程(模板)。在Autoware中的价值:高性能、底层控制、与ROS深度集成。2.IO库(重点)iostream库:istream(输入流)、ostream(输出流)。四个IO对象:cin(标准输入)、cout(标准输出)、cerr(错误信息)、clog(日志信息)。输入/输出运算符:<<(输出)、>>(输入)。关键概念:命名空间(std::)、操纵符(endl)、头文件包含(#include)。示例解析:计算两数之和的完整程序,逐行讲解。3.复合类型变量:引用与指针(重点+难点)引用(Reference):已存在对象的别名,必须初始化,永久绑定。语法:int&refVal=ival;指针(Pointer):独立对象,存放地址,可重新指向,可延迟初始化。语法:int*pt=&str;关键区别(对比表格):引用是别名,指针是独立对象。引用必须初始化,指针可不初始化。引用不可重新绑定,指针可改变指向。取地址符(&)在引用中为声明的一部分,在指针中为表达式操作符。箭头操作符:pt->size()
等价于
(*pt).size()4.迭代语句:while与for循环(重点)while循环:条件持续为真时重复执行,适合不确定迭代次数的场景(如读取输入直到终止条件)。for循环:初始化-条件判断-迭代更新三部分,适合已知迭代次数的场景(如遍历数组)。示例:while:累加输入数字直到输入0。for:计算1到5的整数平方并存入vector。5.条件语句:if与switch(重点)if语句:根据布尔条件决定执行路径,支持嵌套。switch语句:根据整型表达式选择多路分支,配合case标签与break。示例:if:等级制成绩添加加减号(grade<60
→不及格,grade%10
决定+/-)。switch:统计文本中元音字母出现次数。6.类(Class)(重点)定义:用户自定义数据类型,封装数据(成员变量)与操作(成员函数)。核心特性:封装(public/private)、继承。访问说明符:public:接口,整个程序可访问。private:实现细节,仅类成员可访问。示例:Student类,通过public接口(setName、setAge、display)操作private成员(name、age)。7.模板(Template)(重点+难点)定义:泛型编程工具,编写与数据类型无关的通用代码。函数模板:处理多种数据类型的通用函数。类模板:处理多种数据类型的通用类。实例化:编译器根据具体类型生成实际代码。示例:函数模板:swapValues交换两个变量的值(int/double通用)。类模板:GenericArray通用数组类(int/string通用)。难点提示:模板参数列表不能为空,class与typename关键字可互换。8.互动提问在自动驾驶中,传感器数据(如激光雷达点云)适合用哪种C++容器存储?为什么?(三)核心精讲二:ROS编程基础(讲授+流程图+实操演示)1.ROS概述定义:专为机器人系统开发设计的分布式计算框架和开源中间件平台。历史:2007年斯坦福大学AI实验室与WillowGarage联合研发,现为全球机器人领域事实标准。核心优势:点对点通信、多语言支持(C++/Python/Java)、模块化开源生态系统、全周期开发套件(Rviz/Gazebo/rosbag)。2.ROS文件系统(重点)工作空间(Workspace):src(源码)、build(编译中间文件)、devel(生成的可执行文件与库)。功能包(Package):ROS软件基本单元。核心文件:CMakeLists.txt(编译规则)、package.xml(包信息与依赖)。标准目录:include(头文件)、launch(启动文件)、src(源码)、config(配置)、msg(消息定义)、srv(服务定义)。元功能包(Metapackage):一组相关功能包的集合。Autoware案例:autoware.ai/src下core_perception/lidar_localizer等目录结构解析。3.ROS通信机制:话题vs服务(重点+难点)维度话题(Topic)服务(Service)通信模型发布/订阅(松耦合)客户端/服务端(紧耦合)通信方式单向异步双向同步缓冲机制有消息队列无缓冲节点关系多对多一对多(一个服务端,多个客户端)定义文件.msg.srv适用场景高频数据传输(点云、图像、状态)低频任务调用(保存地图、重置定位)话题通信流程图(类比“114查号台”):发布者注册→订阅者注册→节点管理器匹配→建立TCP连接→数据传输。服务通信流程图:服务端注册→客户端注册→节点管理器匹配→建立连接→请求-应答。4.ROS常用命令行工具(重点)命令功能示例roscore启动节点管理器roscorerosrun运行功能包中的节点rosrunturtlesimturtlesim_noderostopiclist列出当前所有话题rostopiclistrostopicpub发布话题消息rostopicpub/turtle1/cmd_vel...rosservicelist列出当前所有服务rosservicelistrosservicecall调用服务rosservicecall/spawn"x:5.0y:5.0"rosbagrecord记录话题数据rosbagrecord-a-Ocmd_recordrosbagplay回放话题数据rosbagplaycmd_record.bagrosnodelist查看运行中的节点rosnodelistrqt_graph可视化节点关系图rqt_graph实操演示:在海龟仿真器中依次执行上述命令,展示节点关系图的变化。5.工作空间创建与编译(重点)创建:mkdir-p~/catkin_ws/src编译:cd~/catkin_ws&&catkin_make环境变量:source~/catkin_ws/devel/setup.bash(可写入~/.bashrc)检查:echo$ROS_PACKAGE_PATH6.话题通信:发布者编程(重点)完整五步流程:节点初始化:ros::init(argc,argv,"节点名")创建节点句柄:ros::NodeHandlen创建发布者对象:n.advertise<消息类型>("话题名",队列长度)设置发布频率:ros::Raterate(频率Hz)主循环逻辑:while(ros::ok())
中填充消息并调用
publish(),然后
rate.sleep()示例:velocity_publisher.cpp
发布
/turtle1/cmd_vel
控制海龟运动。编译配置:修改CMakeLists.txt中的add_executable与target_link_libraries。7.话题通信:订阅者编程(重点)完整五步流程:节点初始化:ros::init创建节点句柄:ros::NodeHandle创建订阅者对象:n.subscribe("话题名",队列长度,回调函数)定义回调函数:处理接收到的消息进入事件循环:ros::spin()
或
ros::spinOnce()示例:pose_subscriber.cpp
订阅
/turtle1/pose
打印海龟位姿。难点讲解:回调函数自动触发机制,spin()阻塞等待vs
spinOnce()单次处理。8.自定义话题消息(.msg)(重点+难点)第一步:创建msg文件夹及.msg文件(如Person.msg)第二步:定义消息内容(stringname,
uint8sex,
uint8age,可定义常量)第三步:修改package.xml添加message_generation(编译依赖)和message_runtime(执行依赖)第四步:修改CMakeLists.txt四个关键部分:find_package添加message_generationadd_message_files添加Person.msggenerate_messages添加依赖std_msgsCATKIN_DEPENDS添加message_runtime示例:person_publisher与person_subscriber通过/person_info话题通信。9.服务通信:客户端编程(重点)完整六步流程:节点初始化:ros::init创建节点句柄:ros::NodeHandle等待服务可用:ros::service::waitForService("服务名")创建客户端对象:n.serviceClient<服务类型>("服务名")设置请求数据:填充.request成员发出服务请求:client.call(srv),处理.response示例:turtle_spawn.cpp
调用
/spawn
服务创建新海龟。10.服务通信:服务端编程(重点)完整五步流程:节点初始化:ros::init创建节点句柄:ros::NodeHandle创建服务端对象:n.advertiseService("服务名",回调函数)定义回调函数:处理请求,填充.response,返回true发出服务应答:ros::spin()
等待请求示例:turtle_command_server.cpp
提供
/turtle_command
服务控制海龟运动。11.自定义服务数据(.srv)(重点+难点)第一步:创建srv文件夹及.srv文件(如Person.srv)第二步:定义请求与应答域(用分隔)第三步:修改package.xml(同消息)第四步:修改CMakeLists.txt(同消息,注意add_service_files或共用add_message_files)示例:person_server与person_client通过/show_person服务通信。12.互动实操与思考任务1:在海龟仿真器中编写发布者节点,控制海龟画一个正方形(使用rostopicpub或编写C++节点)。任务2:使用rosbagrecord记录键盘控制海龟的运动数据,然后用rosbagplay回放,观察海龟是否复现相同轨迹。(四)总结与升华:知识体系与思维启发(梳理+思考)1.核心知识梳理C++基础:IO库:cin/cout、输入/输出运算符复合类型:引用(别名、永久绑定)vs指针(独立对象、可重绑)迭代语句:while(不确定次数)、for(确定次数)条件语句:if(布尔条件)、switch(多路分支)类:封装(public/private)、继承模板:函数模板、类模板、泛型编程ROS编程基础:文件系统:工作空间→功能包→核心文件与标准目录通信机制:话题(发布/订阅、异步、队列)vs服务(客户端/服务端、同步、无缓冲)常用命令:roscore、rosrun、rostopic、rosservice、rosbag、rosnode、rqt_graph发布者:init→NodeHandle→advertise→Rate→while(ok){publish;sleep}订阅者:init→NodeHandle→subscribe→回调函数→spin客户端:init→NodeHandle→waitForService→serviceClient→填充request→call服务端:init→NodeHandle→advertiseService→回调函数(填充response)→spin自定义消息/服务:.msg/.srv文件→package.xml→CMakeLists.txt(四修改)2.思维启发讨论在自动驾驶系统中,感知模块(每秒发布数十帧点云数据)与规划模块(每100ms发布一次轨迹)之间应该采用话题通信还是服务通信?为什么?如果采用话题通信,队列长度应该如何设置?”3.学习启示本章是从“使用者”到“开发者”的关键转折点,ROS编程基础是后续阅读和修改Autoware源码的前提。鼓励学生动手完成所有示例代码的编写、编译与运行,遇到编译错误时主动查阅CMakeLists.txt配置。理解话题与服务的选择逻辑:高频、持续数据用话题;低频、离散任务用服务。预告下一章内容:高精地图的创建与加载,以及核心算法原理与源码解析。八、课后任务1.基础作业:完成海龟仿真器中的发布者节点编写,控制海龟画一个正方形,提交源代码及运行截图。2.实践作业:自定义消息任务VehicleStatus.msg(包含float32speed、float32steering_angle、float64latitude、float64longitude),编写发布者节点(模拟数据)与订阅者节点(打印数据),提交.msg文件、两个节点的源代码及运行截图。3.拓展作业:使用rosbag记录一段键盘控制海龟的运动数据,然后编写一个C++节点读取bag文件中的/turtle1/cmd_vel话题数据,统计分析线速度和角速度的分布,提交代码与分析报告。九、考核要点1.基础认知:C++中引用与指针的本质区别;while与for循环的适用场景;类的封装特性(public/private);函数模板与类模板的定义与实例化;ROS文件系统的三层结构(工作空间/功能包/核心文件);话题通信与服务通信的核心差异(通信模型、同步/异步、缓冲、适用场景);ROS常用命令(roscore、rosrun、rostopic、rosservice、rosbag、rosnode、rqt_graph)的功能。2.应用分析:分析在自动驾驶系统中,感知点云传输、路径规划请求、地图保存等场景应分别选择话题还是服务,并说明理由;解读给定的发布者/订阅者/客户端/服务端代码,指出各步骤对应的函数与作用;解读自定义.msg/.srv文件的编译配置(package.xml与CMakeLists.txt的修改要点)。3.能力拓展:独立编写ROS发布者与订阅者节点实现话题通信的能力;独立编写ROS客户端与服务端节点实现服务通信的能力;自定义.msg/.srv文件并完成编译配置的能力;使用rosbag记录与回放话题数据的能力;使用rqt_graph可视化节点关系图并分析通信链路的能力。十、教学反思(课后填写)1.学生对C++中引用与指针的区分、模板实例化机制等难点的理解是否达标?是否需要补充更多对比表格或生活化比喻?2.话题与服务通信流程的讲解是否清晰?学生能否独立画出通信流程图并解释各环节?3.课堂实操任务(海龟仿真器发布者/订阅者)的完成率如何?常见的编译错误有哪些(如CMakeLists.txt配置遗漏)?4.学生对自定义消息/服务的编译配置(CMakeLists.txt四修改)掌握程度如何?是否需要专项练习?
第4章高精地图创建与加载一、授课对象车辆工程、智能车辆工程等相关专业本科生二、授课主题高精地图创建与加载:从SLAM建图原理到Autoware地图加载功能的完整实践三、核心目标1.知识目标:使学生掌握高精地图的定义、特征(高精度、高维度、高丰富度、高新鲜度)及其与普通导航地图的核心区别;理解高精地图的三维信息结构(空间信息、语义信息、时间信息)及常见格式(vectormap、lanelet2、opendrive、nds);掌握SLAM技术的概念、分类(激光SLAMvs视觉SLAM)及典型算法(scan-to-scanvsscan-to-map);理解NDT点云匹配算法的数学原理与实施流程(网格化、概率密度函数、坐标变换、牛顿迭代);掌握Autoware中点云地图构建(ndt_mapping节点)与语义地图标注(MapToolbox)的完整流程;掌握points_map_loader与vector_map_loader节点的源码实现原理。2.能力目标:培养学生独立使用Autoware完成点云地图构建(数据回放→NDT配准→地图保存)的工程实践能力;提升学生使用UnityMapToolbox进行语义地图标注(车道、车道线、人行横道)的能力;引导学生具备阅读与解析ndt_mapping、points_map_loader、vector_map_loader等核心节点源码的能力;增强学生理解NDT算法中关键参数(ndt_res、step_size、trans_eps、max_iter等)对建图效果影响的分析能力。3.素养目标:强化学生的高精地图作为自动驾驶“先验信息基础设施”的系统认知;培养其面对复杂算法(NDT、SLAM)时的数学建模与工程实现思维;引导其了解高精地图生产中的测绘法规与数据安全要求(如我国测绘行业标准、地图审查备案)。四、授课重难点1.重点:高精地图与普通导航地图的核心区别(精度、维度、丰富度、更新频率);SLAM技术的基本原理及激光SLAMvs视觉SLAM的优劣对比;NDT点云匹配算法的实施流程(网格化→概率密度计算→坐标变换→似然函数优化→牛顿迭代求解);Autoware中点云地图构建的完整命令流程(my_mapping.launch→RViz可视化→rosbag回放→地图保存);MapToolbox语义地图标注方法(车道、车道线、人行横道)及地图导出;points_map_loader与vector_map_loader节点的启动配置与源码逻辑。2.难点:NDT算法中均值向量、协方差矩阵、似然函数、黑塞矩阵等数学公式的理解;ndt_mapping.cpp源码中主函数流程(初始化→参数获取→坐标变换→发布/订阅)及关键回调函数(points_callback、output_callback)的代码逻辑;点云配准过程中体素滤波(VoxelGrid)的原理与参数调优(voxel_leaf_size);世界坐标系、地图坐标系、车体坐标系、传感器坐标系之间的坐标变换关系与tf库实现;NDT配准中初始位姿估计方法(guess_pose、imu_calc、odom_calc)的工程实现差异。五、教学方法讲授法、案例分析法、数学推导法、源码解析法、实操演示法、对比教学法六、教学准备1.教学素材:PPT课件(整合高精地图特征对比表、SLAM分类图、NDT算法流程图、NDT数学公式、ndt_mapping节点流程图、坐标系变换示意图、MapToolbox操作界面截图);多媒体素材(NDT点云配准动画、Autoware点云地图构建全程录屏、UnityMapToolbox语义标注操作录屏);行业案例资料(我国测绘行业标准《道路高精度电子导航地图质量规范》节选、高精地图生产流程图、Autoware官方示例数据说明)。2.互动准备:讨论议题(如果GNSS信号丢失,NDT算法还能正常工作吗?初始位姿如何获取?);实操任务(使用官方示例数据完成点云地图构建,并调整ndt_res参数观察地图质量变化);分组任务清单(分组解析ndt_mapping.cpp中points_callback函数的不同代码段,课堂分享理解)。3.辅助工具:多媒体教学设备;预装Autoware1.12.0+Ubuntu18.04的演示环境;官方示例数据(sample_moriyama_150324.bag);Unity2021.3.45f1c1+MapToolbox插件(Windows环境);课前预习问卷(了解学生对SLAM、点云匹配的认知程度)。七、教学内容与过程设计(一)导入环节:问题驱动+概念辨析(讲授+对比分析)1.问题引入:“我们日常使用的手机导航地图(如高德、百度)能否直接用于自动驾驶?为什么?”2.高精地图定义:服务于自动驾驶系统、用于实现高精度定位的专题地图,是自动驾驶的重要基础设施。3.核心对比(普通导航地图vs高精地图):维度普通导航地图高精地图精度米级分米级/厘米级维度道路级车道级丰富度基础道路信息车道线、交通标志、护栏、人行横道等更新频率低频(季度/年)高频(天/小时)服务对象人类驾驶员自动驾驶系统4.引出本章主题:明确本章核心——系统学习高精地图的创建(点云地图+语义地图)与加载方法,帮助学生搭建“理论-算法-工程实现”的完整知识框架。(二)基础铺垫:高精地图基础与SLAM技术(讲授+对比+互动)1.高精地图的三维信息空间信息:基于移动测量车采集的点云数据提取的车道模型。语义信息:道路部件信息(转向路标、速度标识、交通标志标线)。时间信息:道路属性信息(潮汐车道、红绿灯配时)。核心价值:不受天气、障碍物、探测距离限制,弥补车载传感器性能边界,为规划决策提供先验信息。2.常见高精地图格式vectormap、lanelet2、opendrive、nds(本章主要介绍vectormap)3.SLAM技术概述(重点)定义:同步定位与建图(SimultaneousLocalizationandMapping),在无先验信息情况下增量构建地图并实现自主定位。分类对比:维度激光SLAM视觉SLAM传感器激光雷达摄像头精度高,累计误差小相对较低成本高低优势建图精度高语义信息丰富劣势成本高受光照影响大,无法识别无纹理区域4.激光SLAM细分(scan-to-scanvsscan-to-map)scan-to-scan:求解连续两帧或多帧点云的坐标变换关系。典型代表:LOAM、LEGO-LOAM、LIO-SAM。scan-to-map:激光雷达扫描数据直接与地图匹配。典型代表:Cartographer、NDT。5.点云配准的核心问题为什么需要点云匹配?GNSS/IMU无法直接获取准确位姿,需通过点云匹配算法找到两帧点云之间的最优变换关系,修正传感器误差。6.高精地图生产流程(重点)数据采集(激光雷达+GNSS+摄像头+IMU)→数据整理与清洗→点云拼接配准→语义信息标注→安全处理→地图审查→地图发布法规提示:需符合我国测绘行业标准《道路高精度电子导航地图质量规范》,通过备案审核方可商用。7.互动提问在隧道或地下停车场等GNSS信号完全丢失的场景下,SLAM技术如何维持定位与建图能力?(三)核心精讲一:点云地图构建(讲授+实操演示)1.点云地图构建完整流程(重点)步骤操作命令/说明1创建启动文件my_mapping.launch,导入ndt_mapping.launch2编译工作区catkin_make3启动建图节点roslaunchmy_mapping.launch4打开RViz添加ndt_map:PointCloud2,设置Size=0.15回放点云数据rosbagplaysample_moriyama_150324.bag6记录地图话题rosbagrecord-Odemo_map.bag/ndt_map7转换为.pcd文件解析.bag文件,生成点云地图2.实操演示与思考播放点云地图构建全程录屏,引导学生关注RViz中点云逐步拼接的过程。提问:“如果ndt_res设置过大或过小,对最终地图质量会产生什么影响?”(四)核心精讲二:语义地图标注(讲授+实操演示)1.MapToolbox环境搭建(重点)操作系统:Windows10软件:UnityHub+Unity2021.3.45f1c1+MapToolbox插件(需提前安装Git)许可证:获取FreePersonalLicense2.Unity操作界面六部分层级面板(场景对象)、场景面板(3D编辑)、游戏面板(摄像机渲染)、属性面板(对象属性)、项目面板(资源库)、控制面板(日志消息)3.语义标注方法(重点)要素工具选项标注方法车道AddLane拖动坐标系xoz面形成车道线,注意箭头方向与行驶方向一致曲线车道AddLane→Subdivision分别拖动起终点坐标系,选择Normalway切割车道线AddWhiteLine类似车道标注人行横道AddCrossWalk调整四条边位置形成四边形车道分割:将车道切割成小线段(目的地只能选择车道起终点,无法选中间点)4.语义地图保存点击层级面板中AutowareADASMap
→属性面板中SaveAutowareADASMapfromfolder选择保存路径5.实操演示与思考播放MapToolbox语义标注操作录屏,引导学生关注车道方向、车道线位置、人行横道四边调整。提问:“为什么全局路径规划的目的地只能选择车道起终点,而不能选择车道中间点?”(五)核心精讲三:NDT点云匹配算法原理(讲授+数学推导+图示)1.NDT算法背景(重点)提出者:2009年瑞典厄勒布鲁大学MartinM.核心优势:不涉及对应点的特征计算和匹配,计算速度快2.NDT算法五步实施流程(难点)步骤操作说明第一步网格化目标点云将目标点云所在空间均匀划分为小立方体网格第二步计算概率密度函数每个网格内基于点的分布计算均值向量和协方差矩阵第三步获取初始坐标变换参数利用GNSS/IMU/里程计提供初始位姿,转换源点云第四步计算源点云在网格中的概率根据正态分布概率密度函数计算每个点的概率第五步构建目标函数并迭代求解最大化似然函数(或最小化负对数),用牛顿法迭代3.关键数学公式(难点)均值向量:μ=协方差矩阵:Σ旋转矩阵R与平移向量t似然函数:最大化→取负对数→牛顿法迭代(黑塞矩阵H+梯度向量g)4.互动提问NDT算法中,为什么使用正态分布来描述网格内点云的分布?如果网格内点云分布不是正态分布,会有什么问题?(六)核心精讲四:ndt_mapping节点源码解析(讲授+代码走读)1.节点定位与启动启动文件:ndt_mapping.launch(被my_mapping.launch调用)节点功能:激光点云配准,通过NDT算法拼接建图源文件位置:lidar_localizer/nodes/ndt_mapping/ndt_mapping.cpp2.主函数流程(重点)步骤功能说明1初始化节点初始化、位姿变量声明(previous_pose、ndt_pose、current_pose等)2参数获取从参数服务器获取method_type、imu_topic、incremental_voxel_update等3坐标变换计算车体坐标系与激光雷达坐标系的变换矩阵4发布与订阅订阅points_raw、/vehicle/odom、_imu_topic,发布/ndt_map3.关键回调函数解析(难点)(1)param_callback函数:NDT配准参数设置参数含义设置建议ndt_res网格边长过大影响精度,过小影响内存step_size牛顿法最大步长trans_eps连续变换最大差值(收敛阈值)max_iter最大迭代次数防止程序在错误方向长时间运行voxel_leaf_size体素滤波网格大小min_scan_range/max_scan_range激光有效扫描范围过滤过近/过远的点(2)output_callback函数:地图点云滤波与输出体素滤波(VoxelGrid):用网格重心替代所有点,减少点云数量判断是否滤波→转换为ROSPointCloud2格式→发布/ndt_map
→保存.pcd文件(3)points_callback函数(最复杂):激光点云滤波与NDT配准点云预处理:计算欧式距离,滤除过近/过远的点体素滤波:进一步降采样第一帧初始化:将第一帧点云作为目标点云载入初始位姿估计:guess_pose(前一帧位置+变化量)或imu_calc/odom_calcNDT配准:align()迭代优化→
getFitnessScore()评价配准效果(≤1为佳)坐标变换计算:t_localizer(激光雷达→地图)、t_base_link(车体→地图)地图更新判断:根据位移shift是否≥min_add_scan_shift决定是否拼接新点云发布地图:通过ndt_map_pub发布更新后的点云地图4.坐标系变换关系(重点)世界坐标系↔地图坐标系(固定,tf调用)车体坐标系↔传感器坐标系(固定,预先设置变换矩阵)代码实现:通过平移向量+旋转向量计算变换矩阵5.源码走读互动分组任务:每组负责解析points_callback函数的一个代码段(如预处理、体素滤波、NDT配准、坐标变换、地图更新),课堂分享。(七)核心精讲五:地图加载功能包源码解析(讲授+代码走读)1.地图加载启动配置启动文件:my_map.launch中调用points_map_loader和vector_map_loader节点参数传递:args传入文件路径等参数2.points_map_loader节点(重点)源文件:map_file/nodes/points_map_loader/points_map_loader.cpp主函数流程:初始化→点云访问→点云地图发布关键子函数:create_pcd:合并多个.pcd文件,使用loadPCDFile逐帧读取publish_pcd:设置frame_id="map",发布到points_map话题参数处理:argc<3报错;margin<0时逐一添加pcd文件路径3.vector_map_loader节点(重点)源文件:map_file/nodes/vector_map_loader/vector_map_loader.cpp主函数流程:初始化→语义访问→语义地图发布关键函数模板:createObjectArray:设置frame_id="map",调用parse解析.csvparse(vector_map.h):读取.csv文件,跳过首行表头,逐行解析数据字段发布话题示例:vector_map_info/cross_walk(人行横道)4.互动提问:如果多个.pcd文件需要合并成一个完整的点云地图,points_map_loader是如何实现拼接的?合并顺序是否影响最终地图?(八)总结与升华:知识体系与思维启发(梳理+思考)1.核心知识梳理高精地图基础:定义、四高特征、三维信息、常见格式、生产流程SLAM技术:激光SLAMvs视觉SLAM、scan-to-scanvsscan-to-mapNDT算法:五步流程(网格化→概率密度→坐标变换→似然函数→牛顿迭代)点云地图构建:my_mapping.launch→ndt_mapping节点→RViz可视化→rosbag回放→地图保存语义地图标注:MapToolbox(车道、车道线、人行横道)→导出.csv地图加载:points_map_loader(点云.pcd)+vector_map_loader(语义.csv)源码解析:ndt_mapping主函数+三个回调函数;两个loader节点的加载逻辑2.思维启发讨论在实际自动驾驶系统中,高精地图的‘高新鲜度’要求意味着地图需要频繁更新。如果自动驾驶车辆在行驶过程中发现实际道路标线与高精地图不一致(如临时施工改道),系统应如何响应?是信任地图还是信任实时感知?NDT算法中,网格分辨率ndt_res的选择直接影响建图精度和内存占用。如果要在嵌入式车载平台上运行NDT建图,你会如何权衡ndt_res与计算资源?3.学习启示本章是高精地图从创建到加载的完整闭环,NDT算法是点云配准的核心,理解其数学原理对后续定位模块的学习至关重要。鼓励学生动手完成点云地图构建全流程,尝试调整NDT参数观察地图质量变化,培养参数调优的工程直觉。源码解析部分难度较高,建议学生结合PPT中的代码片段与完整源文件对照阅读,逐步建立从算法到代码的映射能力。预告下一章内容:基于激光点云定位与卫星辅助定位技术获取车辆位姿信息。八、课后任务1.基础作业:写出NDT算法的五步实施流程,并解释每一步的作用。2.实践作业:分别设置ndt_res=0.5、1.0、2.0,重新构建点云地图,对比三张地图的质量差异,撰写200字分析报告。3.拓展作业:阅读ndt_mapping.cpp中points_callback函数的完整代码,画出该函数的流程图(包含预处理、体素滤波、NDT配准、坐标变换、地图更新等分支),提交流程图及关键代码行号对应说明。九、考核要点1.基础认知:高精地图的定义、四高特征及与普通导航地图的核心区别;高精地图的三维信息(空间/语义/时间)及常见格式;SLAM技术的定义及激光SLAMvs视觉SLAM的优劣对比;NDT算法的五步实施流程;Autoware点云地图构建的完整命令流程;MapToolbox中车道、车道线、人行横道的标注方法;points_map_loader与vector_map_loader节点的功能。2.应用分析:结合具体场景(隧道、地下车库),分析NDT算法在GNSS信号丢失时的定位建图能力;分析ndt_res、step_size、max_iter等参数对NDT配准精度与计算效率的影响;解读ndt_mapping.cpp主函数中坐标变换矩阵的计算逻辑;分析points_callback函数中点云预处理(欧式距离过滤)与体素滤波的作用。3.能力拓展:独立使用Autoware完成点云地图构建与保存的能力;使用UnityMapToolbox进行语义地图标注的能力;阅读与解析ndt_mapping、points_map_loader、vector_map_loader源码的能力;调整NDT参数优化建图效果的工程实践能力;理解坐标系变换(世界/地图/车体/传感器)并在源码中定位对应实现的能力。十、教学反思(课后填写)1.NDT算法中数学公式(均值向量、协方差矩阵、似然函数、牛顿迭代)的讲解是否过于抽象?是否需要增加可视化动画辅助理解?2.点云地图构建实操任务的完成率如何?学生在rosbag回放、RViz配置、地图保存等环节遇到的常见问题有哪些?3.源码解析部分(特别是points_callback函数)学生理解程度如何?是否需要增加更多代码注释或简化版本示例?4.MapToolbox语义标注任务受限于Windows环境+Unity安装,学生完成率如何?是否需要提供标注完成的示例地图供后续章节使用?
第5章车辆定位一、授课对象车辆工程、智能车辆工程等相关专业本科生二、授课主题车辆定位技术:从GNSS/INS组合导航到NDT激光点云定位的完整实践三、核心目标1.知识目标:使学生掌握车辆定位的定义(位置+姿态)及其在自动驾驶中的核心作用;理解三大类定位技术(信号定位、航迹推算、地图匹配)的原理、优势与局限;掌握我国北斗卫星导航系统的发展历程、组成架构及核心特点(高轨卫星、多频信号、短报文通信);理解RTK、CORS、星基增强系统、低轨导航增强等技术对GNSS定位精度的提升原理;掌握GNSS-INS组合导航的互补优势及融合定位框架;理解NDT点云匹配算法在车辆定位中的应用(与建图的差异:实时性要求更高);掌握Autoware中激光点云定位(ndt_matching节点)与卫星辅助定位(nmea2tfpose节点)的完整流程与源码实现。2.能力目标:培养学生独立使用Autoware完成车辆定位(点云地图加载→NDT匹配→GNSS融合)的工程实践能力;提升学生解析NMEA协议(GGA、RMC等格式)并提取经纬高、定位质量、卫星数量等关键信息的能力;引导学生具备阅读与解析ndt_matching、nmea2tfpose等核心节点源码的能力;增强学生理解多传感器融合定位(GNSS+IMU+LiDAR+ODOM)中数据同步与坐标变换的能力。3.素养目标:强化学生对我国北斗卫星导航系统自主可控战略意义的认识,增强民族自豪感与科技自信;培养其面对多传感器融合定位问题
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新生儿脐带护理消毒操作标准
- 西瓜立体吊蔓栽培技术实施方案
- 越冬菠菜防寒防冻应急方案
- 茶树病虫害绿色防控管理规范
- 理疗后客户随访关怀执行指南
- 新入职员工岗前安全教育规程
- 肉牛短期强度育肥饲养技术指南
- 门店差评处理与危机公关预案
- 沉睡客户唤醒营销策略执行手册
- 会员退费处理应急预案
- 2024年高考湖南卷物理真题(解析版)
- 旅游业安全生产管理措施
- DL∕T 1392-2014 直流电源系统绝缘监测装置技术条件
- 农村院子菜园设计
- 2024外研版初中英语单词表汇总(七-九年级)中考复习必背
- 电加热供暖工程验收表
- 中医养生保健职业生涯发展规划
- 2022-2023学年雅安市六年级数学第二学期期末统考试题含解析
- 驾考三力测试模拟题含答案
- 技术创新成熟度评价标准及评价细则
- D500-D505 2016年合订本防雷与接地图集
评论
0/150
提交评论