拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Autoware入门实战:Ubuntu 18.04安装、数据回放与相机雷达联合标定全流程解析

Autoware入门实战:Ubuntu 18.04安装、数据回放与相机雷达联合标定全流程解析

这篇文章我想认真聊聊Autoware的入门。这几年自动驾驶相关的开源软件越来越多,但真正能做到“整包全家桶”的,Autoware还是绕不开的一个。很多人第一次接触它,是在Ubuntu 18.04上装Autoware.AI,再配上相机和雷达的联合标定工具,跑通感知和定位的Demo。但说实话,这玩意生态复杂,安装编译一路下来,顺利点也要一整天,中间踩坑踩到想砸键盘的也不在少数。这篇内容把官方入门的路径重新梳理一遍,从版本选型、环境搭建、数据回放,到相机雷达联合标定的完整流程,全部基于实际踩坑后的经验来写,希望能帮想入坑的同学少绕几圈。

1. 上手前先搞懂:Autoware是什么,又该怎么选版本

很多人在装Autoware之前,其实并没有完全搞清楚它到底是什么。它不是某个单一功能包,而是一套集定位、感知、规划、控制于一体的自动驾驶软件框架。我第一次看它的源码结构时,眼前一亮但也头皮发麻——官方文档、代码库、wiki、示例数据分散在好几个地方,光是搞明白各模块之间的关系,就需要一点耐心。

1.1 一个开源平台,把自动驾驶的“脑回路”全给你

Autoware最早是名古屋大学的开源项目,后来由Autoware Foundation维护。它把自动驾驶车辆的传感器数据处理、环境感知、路径规划、车辆控制这些环节,全部用ROS节点的方式串联起来。说白了,你在真车上装的激光雷达、摄像头、GPS/IMU,都能通过Autoware提供的节点去读取、融合和决策。它的定位模块用NDT匹配点云地图,感知模块能检测动态物体和车道线,规划模块可以生成局部路径,控制模块再输出转向和油门指令。

它对新手最大的意义,在于提供了一个可运行的“整包”参考。你不用从零开始写建图、定位、障碍物检测的算法,先跑通Autoware,再逐步替换成自己的算法,这个路径非常适合研究学习。我见过不少团队,第一次接触它就是为了在仿真环境里跑通感知到控制的闭环,再迁移到实车。

1.2 版本选型:Ubuntu 18.04该用哪个

Autoware的版本演进比较复杂,这也是入门时最常见的一个坑。Autoware.AI是早期的ROS 1版本,支持Ubuntu 18.04和ROS Melodic;后来又有Autoware.Auto,偏向ROS 2,支持Ubuntu 20.04以上;再往后还有Autoware Universe,属于重构后的新架构。如果你手里的环境是Ubuntu 18.04,那最稳妥的选择就是Autoware.AI。网上那些Ubuntu 18.04安装Autoware的教程,基本也都是针对Autoware.AI来写的。

这里我给个明确建议:如果你是刚接触,或者课程、项目基于Ubuntu 18.04,直接装Autoware.AI的Release版本,不要一上来就挑战源码编译最新分支。原因有三:一是18.04和ROS Melodic的搭配非常成熟,网上能查到的报错和解决方案最多;二是我后面要讲的相机雷达联合标定工具autoware_camera_lidar_calibrator,在这个版本里有现成的集成,省去不少适配工作;三是官方Quick Start的示例数据包,本来就是按这个版本做的。等这套流程跑通了,你自然会对ROS节点、TF坐标变换、消息通信有更深的理解,那时候再去看Autoware.Auto或Universe,会轻松很多。

2. 环境准备与Autoware.AI安装实操

在动手安装之前,先把系统环境理干净,能省下后面一整天的时间。我遇到过太多因为环境混乱导致的编译失败和运行时崩溃,很多问题其实都出在ROS版本、依赖库版本和CUDA版本不匹配上。

2.1 系统和依赖准备

推荐环境是Ubuntu 18.04.5或者18.04.6,然后安装ROS Melodic的Desktop-Full版本。这里有一个非常实用的技巧:先确认系统里没有装过其他版本的ROS,如果之前装过ROS Noetic或者其他ROS 2,建议直接清理干净,再装Melodic。混装两个ROS版本,rosdep和catkin经常会把依赖解析到错误的路径上。

装完ROS之后,还需要安装一些基本的系统和开发依赖。我记得当时踩过一个坑:缺少python-catkin-tools、ros-melodic-desktop-full之外的很多包,比如ros-melodic-grid-map、ros-melodic-nmea-msgs,编译到一半直接报找不到头文件。官方wiki上有一串依赖清单,建议照着装一遍。另外,CUDA和cuDNN我建议按需安装。如果后面要跑GPU加速的检测模型,那就装;如果只是想跑通Demo,先不装CUDA反而能减少很多麻烦。因为Autoware.AI的某些源码分支对CUDA版本有隐性要求,版本不匹配时会出现“能编译一半、却在运行时崩溃”这种让人抓狂的问题。

2.2 源码编译与安装步骤

Autoware.AI的源码编译大体分四步:创建工作空间、拉取源码、安装依赖、编译。我用的是catkin_make方式,虽然官方也支持docker方式,但在18.04上直接源码编译,后续修改和调试会更直接。

# 创建工作空间 mkdir -p ~/autoware.ai/src cd ~/autoware.ai catkin_make # 先空编译一次,确保工作空间环境可用

接着把源码clone到src目录。这里有个需要注意的点:官方仓库比较大,国内网络拉取时容易中断。建议用官方提供的Release分支,而不是master。用git clone --branch 1.14.0 https://github.com/Autoware-AI/autoware.ai.git,如果网络不稳定,可以分多次clone,或者用代理(前提是网络环境允许)。拉完源码之后,进入src执行git submodule update --init --recursive,这个步骤很多人会漏掉,导致一些子模块缺失。

依赖安装可以用rosdep:

cd ~/autoware.ai rosdep update rosdep install -y --from-paths src --ignore-src --rosdistro melodic

等依赖装完,就可以编译了:

cd ~/autoware.ai source /opt/ros/melodic/setup.bash catkin_make

整个编译过程非常耗时,如果机器配置不是很高,可能要跑45分钟到一个小时。第一次编译时不要急着干别的,就盯着终端看报错,及时处理。我当时就遇到一个很典型的问题:系统默认的gcc/g++版本太高,某些老代码段编译不过去,后来把g++换回低版本才解决。

2.3 安装过程中容易被忽略的配置项

编译完成之后,不要急着跑,先确认一下环境变量。在~/.bashrc文件里加上:

source /opt/ros/melodic/setup.bash source ~/autoware.ai/devel/setup.bash

然后执行source ~/.bashrc,再用echo $ROS_PACKAGE_PATH检查一下路径是否包含autoware.ai的包路径。如果这里没配对,后面启动autoware时会出现“package not found”的报错。

还有一点值得提:Autoware.AI的启动界面依赖Qt,系统如果缺少相关的图形库,runtime_manager起不来。建议提前安装ros-melodic-rqt-gui、ros-melodic-rqt-gui-py和ros-melodic-topic-tools。这个坑在刚装完系统、图形环境比较干净的机器上特别常见。

3. 入门实操:从数据回放到感知规划全流程

Autoware装好之后,最让人兴奋的一步就是用官方数据包把整个感知定位流程跑起来。这里我不建议一上来就接真车传感器,先用官方提供的Demo数据包把界面和节点逻辑熟悉了,效率高得多。

3.1 数据集下载与启动方式

官方Quick Start用到的数据包是sample_moriyama_data,大概几个GB,里面包含激光雷达的点云数据、摄像头图像、GPS/IMU数据。下载完成之后解压,你会看到里面有.bag后缀的rosbag文件,这就是录制好的传感器数据。回放数据的操作很直观:

cd <你的数据目录> rosbag play -l sample_moriyama_150324.bag

-l参数表示循环播放,这样在调试初始参数时,不需要反复重启bag包。接下来打开Autoware的主界面:

cd ~/autoware.ai source install/setup.bash ./run

这时候会弹出一个集成界面,左边是模块列表,右边是地图和点云显示。我第一次打开时,界面还是比较复杂的,但别慌,把它理解成一个“联调控制台”就行。

3.2 Runtime Manager界面逐项拆解

Runtime Manager是Autoware操作的核心。它的顶部有几个Tab,通常你会在Map、Sensing、Localization、Perception、Planning、Control这几个模块之间切换。整体思路是“先给地图,再给传感器数据,然后定位,再感知,最后规划控制”。我建议你的操作顺序也严格按这个来,因为下游模块往往会依赖上游模块输出的Topic。

在Map选项卡中,需要加载点云地图文件,可以用Point Cloud里的Load按钮加载.pcd文件,加载完成后,Rviz中会显示完整的点云地图。在Sensing选项卡里,要选择传感器模型。如果回放bag数据,一般直接选择“Points Raw”投递方式即可。注意:不同的bag数据集,传感器的Topic名称可能不一样,如果发现Rviz里没有点云,先用rostopic list确认你bag中的Topic名是否和Autoware默认的一致,不一致时要在Setup里修改Topic名。这个检查习惯能帮你避免大量“为什么我什么都没有”的困扰。

3.3 从NDT定位到感知模块联动

定位模块是Autoware里最有代表性的一个环节。在Localization选项卡里选择ndt_matching,设置好参考点云话题和初始位姿,然后在前端界面上用Initial Pose按钮在点云地图里大致点一个初始位置。NDT算法会在后续帧点云和地图匹配的过程中,不断修正车辆的位姿。这一步如果初始位姿给得离谱,定位就会发散,点云会“飘”起来。

定位跑通之后,Perception选项卡里的检测模块就有意义了。通常我会依次开启voxel_grid_filter做降采样,再用ray_ground_filter过滤地面点,然后用lidar_euclidean_cluster_detect做聚类检测。跑起来之后,Rviz里会看到被框出来的障碍物。这里有一个实际经验:如果聚类框碎裂或者车辆目标被切碎,多半是voxel_grid_filter的leaf size设得太大,把点云压得太稀疏,适当缩小leaf size会好很多。

规划和控制模块在纯回放模式下,其实更多是展示逻辑。Autoware的Planning里包含waypoint_planner、velocity_set等节点,控制模块包含mpc_controller等。没有实车反馈时,这些节点可能不会产生很直观的效果,所以初次入门,我建议重点把时间和精力放在定位和感知这两个模块上,理解了它们的Topic流转,再往后深入,整个系统就在你脑子里能串起来了。

4. 相机雷达联合标定:传感器对齐的核心工具

如果说跑通Autoware的定位感知是学会“开车”,那相机雷达联合标定就是让车“看清世界”的关键一步。摄像头的图像和激光雷达的点云是两种完全不同的数据模态,要让它们的时间戳、坐标空间统一起来,就必须做联合标定。这也是热搜里“ubuntu18.04 安装autoware相机雷达联合标定工具”这个需求最核心的内容。

4.1 为什么要做联合标定

激光雷达返回的是三维点云坐标,相机返回的是二维像素颜色。要让点云中的每个点都能在图像上找到对应的像素,或者反过来用图像信息增强点云语义,就需要知道相机和雷达之间的相对位姿关系(旋转矩阵和平移向量)。联合标定算的就是这两个传感器坐标系之间的变换矩阵。没有这组参数,自动驾驶的目标级融合、传感器前融合都是空谈。

很多人在相机内参标定完成之后,以为所有工作就结束了,但实际上激光雷达和相机之间的外参才是融合的关键。内参描述的是相机本身的焦距、畸变等属性,外参描述的是相机在雷达坐标系中的位置姿态。Autoware里正好集成了autoware_camera_lidar_calibrator这个工具,就是用来求解外参的。

4.2 标定工具安装与数据采集

在Autoware.AI的源码包中,这个标定工具在autoware.ai/utilities/autoware_camera_lidar_calibrator路径下。如果你安装的是完整版Autoware.AI,一般已经包含这个包。启动方式是在Runtime Manager的Sensing选项卡里找到Camera-Lidar Calibrator按钮,点击后会自动启动标定界面。

标定需要一块棋盘格标定板。我建议打印一张A1尺寸的黑白棋盘格,角点可以选择8x6或者9x7,具体尺寸要写进配置文件里。数据采集过程中,把标定板放在雷达和相机都能看到的位置,变换多个角度、距离和朝向,尤其要覆盖近距离、中距离、左右侧,每个位置保持静止几秒。整个过程持续两三分钟即可,不用录很久。

采集时有一个容易被忽略的细节:标定板背面不要有其他高反光物体,也不要让阳光直射标定板,否则相机会过度曝光,雷达点云在板上也不稳定。我第一次做的时候没注意,办公室里开着强灯,采集出来的棋盘格点云和图像上的角点对应关系非常差,后来换了位置才正常。

4.3 标定界面操作与参数计算

打开标定界面后,左边是相机图像,右边是雷达点云。你需要在图像中用鼠标点击棋盘格的四个角,然后输入棋盘格的真实尺寸。接着界面会用Camera-Lidar Calibrator提供的算法,在点云里识别棋盘格平面,并自动计算外参。如果自动检测失败,可以手动在点云中框选大致矩形区域,辅助算法寻找。

实际操作中,初值很重要。标定工具可以在你给出的初始外参基础上进行优化,所以先在界面上大致调整旋转和平移,让点云投影到图像上的位置大致对齐,再点击“Calc”按钮,算法会自动精化。这一招特别实用——直接让算法从零开始算,经常陷入局部最优,给一个差不多的初值,最后的结果往往很准。

计算完成后,在界面上可以直接看到点云按外参投影到图像上的效果。如果颜色叠加显示已经贴合,说明外参不错;如果明显错位,尤其是近处的物体边缘错位,那就需要重新调整初值再算。多算几次,记录精度最好的那组。

4.4 参数保存与使用

标定完成后,把参数保存成yaml文件。Autoware的相机雷达标定工具生成的参数文档,一般包含相机内参矩阵、畸变系数、以及相机相对于雷达的外参。保存后,你在Autoware的Sensing选项卡里加载这个文件,图像和点云的融合就具备了坐标对齐的基础。

这里要额外提醒一点:标定结果会贴在标定时的安装位置上。如果雷达或相机的位置有丝毫移动,哪怕只是松了一颗螺丝,标定参数就失效了。所以实车上线前,最好重新做一遍联合标定,或者在结构上做稳固的定位销孔设计,尽量减少重复标定次数。

5. 踩坑记录与问题排查实录

这部分内容其实是我最想写的。Autoware入门过程中,90%的时间其实都是在跟各种奇奇怪怪的报错和异常现象搏斗。我把自己经历过的、以及在社群里帮别人处理过的高频问题整理成一个速查表,虽然不能覆盖所有情况,但至少能帮你少走点弯路。

5.1 编译阶段的经典报错

编译是最容易出现问题的环节,而且很多报错都是环境问题。我整理了下常见的几种:

现象可能原因处理方式
编译时提示找不到xxx包的头文件缺少依赖,rosdep没有完整安装用rosdep check检查缺失项,再rosdep install
CMake Error: CUDA not foundCUDA路径或版本不匹配检查/usr/local/cuda软链接是否正确,必要时在~/.bashrc中设置CUDA_HOME
编译速度极慢甚至卡死内存不足,或者编译线程过多用catkin_make -j2降低并行度;关闭不用的桌面程序,预留内存
某些包只有头文件但编译报语法错误gcc/g++版本过高使用旧版本编译器,例如g++-7
qt_core相关报错Qt版本冲突确认安装的是ROS Melodic对应的Qt版本,不要混用系统自带Qt5的新版本

编译时还有个容易被忽略的习惯:先编译src/autoware/common等基础包,等基础包编译通过后,再全量编译。这样定位问题时更清晰。

5.2 运行时最常见的异常现象

运行时的问题,现象往往很迷惑。很多次我以为是自己代码写错了,最后发现是Topic名、TF树或者时间戳的问题。这里挑几个印象最深的:

rostopic list能看得到点云,但Rviz里不显示——这个大概率是Frame ID不一致。雷达数据默认frame id是velodyne,但Autoware某些仿真或回放场景里要求是map或base_link,可以在Rviz中手动修改Fixed Frame,或者用static_transform_publisher发布一个坐标变换。

定位结果飘逸发散,这个前面提过,多半是初始位姿给得太离谱。记住一个经验:先把Rviz视角切到地图俯视图,放大到目标起点位置,再点击Initial Pose,尽量让箭头方向和车辆实际朝向一致,误差控制在车宽范围内。

启动回调时卡住或者点击按钮没反应,多半是动态链接库加载失败。可以在终端里用rosrun runtime_manager runtime_manager_dialog.py在前台模式启动,这样能看到完整的Python报错,而不是在后台窗口里默默失败。

5.3 联合标定中容易翻车的细节

联合标定的问题,更多是数据质量问题。标定板太小、棋盘格打印后贴在不平的硬纸板上、相机曝光过高导致棋盘格反光、雷达点云在近距离对黑色区域缺少反射,这些都会导致标定失败。我建议标定板做成硬质背板,表面尽量哑光。

还有一个细节:标定过程中,标定板在雷达点云中的“薄度”很重要。如果雷达点云中棋盘格的点数太少,平面拟合就不准,外参计算会变得很不稳定。所以雷达尽量选16线以上,并且让标定板在近距离(2-5米)多停留,确保有足够多的点落在标定板平面上。

另外,标定结果保存的时候,不同版本的Autoware对yaml格式的要求可能有细微差异。如果加载后没有生效,先打开yaml文件对照一下官方模板的字段名,特别是camera_extrinsic_matrix还是transform这种命名差异,改过来再加载。

6. 一点个人体会

文章写到这里,主体内容基本上算告一段落了。如果非要总结一点个人体会,我最想说的一点是:Autoware入门,真正难的不是某个算法的原理,而是整个工具链的衔接和对ROS生态的理解。你会在安装过程中学会处理依赖冲突,在跑通Demo的过程中理解Topic和TF,在联合标定过程中体会到传感器硬件特性的差异。这些经验不是看文档能获得的,必须自己动手踩一遍。

我也建议刚入门的同学,不要一口气追求把Unity模拟器、实车控制、深度学习检测模型全部接上。先老老实实在Ubuntu 18.04上装好Autoware.AI,跑完官方数据包,再完成一次相机雷达联合标定,把最基本的链路打通。这一套流程走下来,你对自动驾驶软件架构的理解,会比单纯看论文扎实得多。

最后再分享一个小技巧:在日常调试中,养成保存“日常清单”的习惯。比如把成功运行时的各个模块参数、ROS启动顺序、Topic名称变化,甚至Rviz的视角配置,都用截图和文本记录下来。因为Autoware的配置项太多,这些记录某天会帮你省下大量重复劳动,也方便你写博客或者做课程实验报告时直接取用。

返回列表