赞
踩
Carla提供了C++和Python接口,为了理解和运用Carla,我将对Carla源码进行细致的学习,理解其架构和功能实现方法。
说明:因为对于自动驾驶我是纯纯纯小白,所以会记录所有我不知道的东西,非常冗杂且不专业,望海涵。
安装Carla
https://carla.readthedocs.io
有空我会写安装过程中遇到的错误。
避免错误的重点在于:一定要按照官网说明操作,看清版本要求!
carla0.9.14
Ubuntu20.04
UnrealEngine4.26.2
Carla是C/S架构
Server端在UnrealEngine的基础上创建,负责仿真,使用C++实现,Client控制actor的逻辑,一部分使用C++实现,一部分使用Python实现(在C++的基础上实现)
我的carla主目录下有这些文件,我将一一搞懂它们的作用。如果有小伙伴的目录不一样也没什么,安装方式不一样配置不一样自然目录也不一样,但核心应该是一致的。
使用VScode打开carla/Build(只是为了清晰地看目录结构和内容,用什么不重要),可以看到文件夹下是一些依赖项。
(1)boost:一个C++源代码库,carla的客户端实现Python和C++的混合编程就是用到了Boost.Python。Boost.Python是一个C++编写的提供Python调用C++代码的接口。
https://www.boost.org/
(2)eigen:一个有关线性代数运算的高级C++库
https://eigen.tuxfamily.org/index.php?title=Main_Page
(3)osm2xodr:用于将OpenStreetMaps(.osm)转换为OpenDrive(.xodr)格式的转换器
(4)libpng:处理png图片的库
(5)llvm:是 Low Level Virtual Machine (低级虚拟机)的简称,这个库提供了与编译器相关的支持,可以作为多种语言编译器的后台来使用。(此处埋下一个坑,llvm和clang、gcc的关系)
(6)patchelf:一个命令行工具
https://github.com/NixOS/patchelf
(7)proj:
https://proj.org/en/9.2/
(8)recast:一个JavaScript相关的工具?
https://github.com/benjamn/recast
(9)rpclib:
client和server通过RPC 框架进行通信,以下是通信有关知识
进程间通信(IPC)是在多任务操作系统或联网的计算机之间运行的程序和进程所用的通信技术。有两种类型的进程间通信(IPC)。
本地过程调用(LPC)LPC用在多任务操作系统中,使得同时运行的任务能互相会话。这些任务共享内存空间使任务同步和互相发送信息。远程过程调用(RPC)RPC类似于LPC,只是在网上工作。RPC开始是出现在Sun微系统公司和HP公司的运行UNⅨ操作系统的计算机中。
carla使用的是rpclib
(10)sqilte:一个数据库
(11)xerces:一个xml解析器
在make PythonAPI
时会安装这些库。
下图摘自论文:Customized Co-Simulation Environment for Autonomous Driving AlgorithmDevelopment and Evaluation.Mustafa Ridvan Cantas and Levent GuvencAutomated Driving Lab, Ohio State University
此图展示了Carla联合的其它软件。使用这部分内容需要安装相关环境,相关内容请查看carla文档
https://carla.readthedocs.io
文件夹carla/Co-Simulation下的内容如图:
(1)Carsim:
https://www.carsim.com/products/carsim/index.php
carsim是针对车辆动力学的仿真软件。
此文件夹下展示了一辆林肯车
/carla/Co-Simulation/Carsim/Lincoln2020/Sprung_Mass.png
Sprung Mass:
带有悬架的车辆(汽车、摩托车或坦克等)中,sprung mass/sprung
weight是由悬架支撑的车辆总质量的一部分,其质量有大约一半是悬架本身,通常包括车声、车架、内部部件、乘客和货物,不包括车轮、车轮轴承、制动盘、卡钳和履带(它们是unspung
mass的一部分) sprung mass与unsprung mass的比值越大,车身和乘客受到颠簸路面的影响就越小,但
比值并不是越大越好,过大的sprung mass/unsprung mass可能对车辆控制有害
以上摘自sprung mass维基百科
/carla/Co-Simulation/Carsim/Lincoln2020/Vehicle_Thumb.png
(不会翻译Vehicle Thumb,看起来是车身的一些数据)
(2)PTV-Vissim
VISSIM是一款用于道路规划的交通模拟软件
https://www.myptv.com/en/mobility-software/ptv-vissim
https://carla.readthedocs.io/en/0.9.14/adv_ptv/
PTV-Vissim/data/vtypes.json
存放了一些车辆
PTV-Vissim/examples
下是Town01和Town03的路网文件,后缀名为.inpx
PTV-Vissim/vissim_integration/bridge_helper.py
这个模块可能是对carla的数据进行处理变成VISSIM的输入吧
import carla # pylint: disable=import-error
Pylint是Python的静态代码分析器,“Pylint并不比你聪明”,执行脚本时,自定义模块会正确导入,但pylint 没有得到它,并显示了无用的导入错误,添加# pylint: disable=import-error使其不再显示这种无意义的东西。
PTV-Vissim/vissim_integration/constants.py
定义了vissim和carla协同仿真用到的常数
PTV-Vissim/vissim_integration/carla_simulation.py
这个模块负责管理carla模拟器的行为,得到、生成、销毁actor,同步车辆状态(位置、车灯状态等),更新数据结构
def tick(self):
"""
Tick to carla simulation.
"""
self.world.tick()
# Update data structures for the current frame.
current_actors = set(
[vehicle.id for vehicle in self.world.get_actors().filter('vehicle.*')])
self.spawned_actors = current_actors.difference(self._active_actors)
self.destroyed_actors = self._active_actors.difference(current_actors)
self._active_actors = current_actors
PTV-Vissim/vissim_integration/vissim_simulation.py
负责vissim的行为
PTV-Vissim/run_synchronization.py
carla和vissim协同模拟,carla文档中有如何使用和对参数的介绍。
(3)SUMO(Simulation of Urban MObility)
城市交通模拟器
应该是用于交通管理
https://sumo.dlr.de/docs/index.html
https://carla.readthedocs.io/en/0.9.14/adv_sumo/
此部分与前面结构大致相同,如果要使用建议查看官方文档,我可能很难给你帮助。
Sumo/util/create_sumo_vtypes.py
基于carla蓝图库创建SUMO vtype(vehicle type)
Sumo/util/netconvert_carla.py
创建路网信息
有关SUMO net信息请查看https://sumo.dlr.de/docs/Tools/Net.html
存放的carla是 documents
这个文件夹是在查看C++资源的时候创建出来的,里面是一些网页文件。此部分内容在carla文档里的C++ Reference
部分
https://carla.readthedocs.io/en/0.9.14/ref_cpp/#create-doxygen-documentation
Doxygen是一个从源代码生成文档的工具,主要用于C++,也支持其他语言。
Doxygen可以通过三种方式为您提供帮助:
1、它可以从一组记录的源文件生成在线文档浏览器(HTML格式)和/或离线参考手册(在中)。还支持在RTF(MS-Word),PostScript,超链接PDF,压缩HTML和Unix手册页中生成输出。文档直接从源代码中提取,这使得保持文档与源代码一致变得更加容易。
2、您可以配置 doxygen以从未记录的源文件中提取代码结构。这对于在大型源代码发行版中快速找到自己的方式非常有用。Doxygen还可以通过包含依赖图,继承图和协作图来可视化各种元素之间的关系,这些图都是自动生成的。
3、您也可以使用 doxygen 创建普通文档(就像我为 doxygen 用户手册和网站所做的那样)。
创建完后可以通过网页http://carla.org/Doxygen/html/index.html来查看C++资料。前面说过carla其实是用C++构建的。
阅读此处的说明文件,知道此部分是一个使用C++接口的例子。大多数人包括我一开始使用carla都是用PythonAPI完成一些简单操作,carla也能使用C++接口,此处就给出了一个例程:Examples/CppClient/main.cpp
随机加载一个地图生成一个小车控制小车运动、设置视角、添加传感器、最后销毁物体。(我没有运行过此例子,后续有问题再修改)。
这个文件夹下当前只有一个.md文件,阅读可知此处存放导入的资产。
在构建carla 时官方文档有提及要导入额外的资产应该怎么做。
LibCarla文件夹下是用C++实现的carla核心代码。有cmake和source两个子目录。
(1)LibCarla/cmake
首先复习一些linux系统编程知识:
使用gcc
编译一个文件,使用make
命令编译一个项目,make是一个实时工具,运行make时,它读取makefile
执行makefile中的操作。
makefile是一个文本文件,其中包含一组指导make
如何构建程序的规则,规则由目标、依赖项和命令组成。
CMake
是一个编译工具,编写CMakeList.txt
文件,来配置项目相关的CMake参数。 通过运行cmake命令,自动生成对应平台的make工具自动构建脚本makefile
文件
如果你跟我一样看完make
makefile
cmake
cmakelist.txt
有一大堆疑问,可以参看此链接https://stackoverflow.com/questions/25789644/what-is-the-difference-between-using-a-makefile-and-cmake-to-compile-the-code
cmake目录下存放了一些CMakeList.txt用来构建项目。
(2)LibCarla/source
此目录下包括carla、carla使用的解析器和第三方库
1)LibCarla/source/carla
这是carla Client端的实现代码。
包含世界、蓝图、地图、车灯、信号灯、传感器、车辆、行人、碰撞体积、图像处理、导航、opendrive、点云、pytorch(用于图形、点云、manifolds等不规则输入数据进行深度学习的库)、道路、RPC、RSS、传感器、交通管理、日志、debug、内存…非常多的模块。
2)LibCarla/source/compiler
clang相关
3)LibCarla/source/third-party
• moodycamel:一个用于C++开发的无锁队列
https://github.com/cameron314/concurrentqueue
• odrSpiral:用于绘制螺线?
https://github.com/DLR-TS/odrSpiral
• Pugixml:一个轻量级的C++XML处理库
https://pugixml.org/
4)LibCarla/source/test
可能是在测试中的功能
这是我们最熟悉的一个文件夹了:)
(1)carla
carla/source/libcarla
下是Client端的代码
通过Boost.Python这个库来实现C++到Python的绑定。
carla/agents
在有关行为规划的时候会用到。
(2)examples
提供了一些例程供大家使用。
以下是我运行了一些代码的结果。
•automatic_control.py
出现一辆车在地图上跑,跑完后销毁小车。
•dynamic_weather.py
实现天气动态改变(白天、黑夜、雨天、晴天)
•generate_traffic.py
自动生成一些运动的行人和车辆
•manual_control.py
弹出Pygame窗口,手动控制车辆运动。
•no_rendering_mode.py
无渲染模式,只有车道俯视图和小绿点代表车,可控制小绿点运动
•vehicle_gallery.py
一辆接一辆地旋转展示小车
以上是我测试的可以直接运行的代码。传感器、行为规划等其他功能可以在自己的代码里设置。这里先不叙述。Libcarla和PythonAPI两个文件夹我还会继续了解,逐行理解代码,并动手尝试运用更多功能,会再开一篇文章记录。
在make launch启动carlaUE4时终端会出现以下内容:
... BuildCarlaUE4.sh: Build CarlaUE4 project. make[1]: 进入目录“/home/XXX/carla/Unreal/CarlaUE4” bash "/home/XXX/UnrealEngine_4.26/Engine/Build/BatchFiles/Linux/RunMono.sh" "/homeXXX/UnrealEngine_4.26/Engine/Binaries/DotNET/UnrealBuildTool.exe" CarlaUE4Editor Linux Development -project="/home/XXX/carla/Unreal/CarlaUE4/CarlaUE4.uproject" Running Mono... Fixing inconsistent case in filenames. Setting up Mono ~/UnrealEngine_4.26/Engine ~/carla/Unreal/CarlaUE4 Using 'git status' to determine working set for adaptive non-unity build (/home/ww/UnrealEngine_4.26). Waiting for 'git status' command to complete Terminating git child process due to timeout Target is up to date Total execution time: 28.83 seconds make[1]: 离开目录“/home/XXX/carla/Unreal/CarlaUE4” BuildCarlaUE4.sh: Launching UE4Editor... ...
说明此目录下是carla Server端的代码。
此目录在安装carla配置环境时见过很多次,打开看是一些依赖项的安装文件。
以上10个文件夹就是carla目录下的全部子目录了,还有一些配置文件相信大家很容易就知道是什么。
顺便一提,Update.sh
是在构建Carla时会用到的文件,我最初为了省时准备通过下载github提供的tar
文件来安装carla,解压后却找不到这个文件,最后又通过git clone
安装才成功。
接触carla快一个月了,只是浅显的用一下PythonAPI,准备更深入学习,搞懂具体功能如何实现,carla的基础教程不多,纯小白很苦恼,故自己摸索,希望记录下自己的一些学习和踩坑记录。
文章里有非常多的链接,因为我始终觉得官方的资料比别人总结的好很多,如果我的叙述让你感觉随意且浅显,请查阅官方文档。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。