Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享

前言

编译版本终于来了!!!
之前出了这三个:
Apollo规划代码ros移植-Lattcie的二次规划.
Apollo规划代码ros移植-Lattice规划框架.
规划代码ros移植-POMDP预测规划(一).
本人研究生一枚,这里总结了我一年的学习成果,打包成一个可以移植编译的规划工程,工程量大伙看完这一篇就明白。这期间包括了阅读Apollo6.0代码,尝试上百次的核心规划程序移植,遇到上百个bug,加上实车测试很多遍,加上搭建这个Ros平台,然后在这个平台上面,实战自己很多的创新想法等等,经历了这么久,这份含金量十足的工程,我今天开始给大家分享。当然,大家如果需要下载工程代码文件,私信我。效果包括11种了,还不满足吗哈哈。有人想加功能,完全可以在这个平台上施法,什么混合A*啊,什么纯跟踪算法,什么超车,过红绿灯等等。
这份代码适合的人群:
1.想学习这个方向的在校同学
2.刚工作这方面的同事,不知道如何下手
3.公司创业者,外包项目者
4.要毕业要毕业设计,课程设计的同学
大家评论三连刷起来!!!
这份代码有详细的注释,比如:
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第1张图片
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第2张图片
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第3张图片
特别说明:此价格统一,价格合理不高,符合知识付费市场,甚至是亏了。如果下载人数过多,我会统一拉群答疑,大家相互学习,我不是大佬,需要时间去学习东西,所以还是希望你们自行先百度解决,特别是环境配置那里。或许网上有很多其他仿真平台,比如carsim,CARLA等,但是,要用于工程实际车辆的,还是Ros比较合适,而且Ros也比较轻量级

环境配置

前提:
首先要更新镜像源吧,比如ubuntu20.04的清华源。百度一堆:ubuntu20.04的清华源.
这里,我们要另外添加一个软件源,以安装gcc,g++。我这里讲的是ubuntu20的gcc,g++安装,18的好像没有9和10的版本,记得是7的,不过你们自己安装好这两个编译器就行,可以跳过这里的安装。

sudo gedit /etc/apt/sources.list

增加

deb http://cz.archive.ubuntu.com/ubuntu xenial main

注意这个源是ubuntu20的,18的可能不一样。
执行

sudo apt-get update

其次,要先安装gcc 与 g++:

sudo apt-get install gcc-9 g++-9
sudo apt-get install gcc-10 g++-10

所需的环境:
1.ros
网上教程太多啦,你们可以根据自己的系统安装对应的ros版本。我的是ubuntu20.04,安装的是ros-noetic。建议不要用ubuntu16,用18或者20,也就是melodicnoetic
2.osqp求解器
运行Automatic_driving/src/planning/installers里面的install_osqp.sh

sudo ./install_osqp.sh

3.依赖库:ADOL-C
运行Automatic_driving/src/planning/installers里面的install_adolc.sh

打开install_adolc.sh文件,先修改如下图所表标红色的路径为自己下载的ADOL-C-2.6.3文件的路径,注意是自己电脑的路径。Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第4张图片
然后执行:

sudo ./install_adolc.sh

4.依赖库:coinhsl,ipopt求解器
运行Automatic_driving/src/planning/installers里面的install_ipopt.sh

sudo ./install_ipopt.sh

特别说明:如果出现输入 sudo: ./xxx.sh:找不到命令,则执行

chmod o+x ./xxx.sh

再执行

sudo ./xxx.sh

5.基本依赖包
运行Automatic_driving/src/planning/installers里面的install_apt.sh

sudo ./install_apt.sh

6.安装其他ros包依赖
运行Automatic_driving/src/planning/installers里面的install_ros.sh

sudo ./install_ros.sh

注意,里面有ros-noetic,是针对ros-noetic版本的,melodic版本要改成ros-melodic。
7.xerces-c

sudo apt-get install libxerces-c-dev 

8.Qt5
参考:https://blog.csdn.net/Joker__123/article/details/122438138

环境配置可能有遗漏,漏了再补

地图更换说明

1.在src/planning/global_routing/launch/global_routing.launch中,里面的路径看你咯,你可以换成你自己的地图osm文件(小扩展,使用JOSM画的),找我画也行,不过要money。

    <arg name="lanelet2_map_path" value="src/planning/hdmap/lanelet2_map_1.osm"/>
    <!-- <arg name="lanelet2_map_path" value="src/planning/hdmap/lanelet2_map_2.osm"/> -->

2.接着,将src/planning/global_routing/launch/staticTFpub.launch里面的这两个MGRS坐标系下原点坐标值改成对应你的地图文件的MGRS坐标系下原点坐标值。所谓原点坐标值,就是地图文件osm最开头那个node节点里面的坐标值。
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第5张图片
注意,有些osm文件没有直接显示MGRS坐标值,那怎么办呢?比如我代码里面的lanelet2_map_1.osm和lanelet2_map_2.osm,里面的架构有点差别:
这是lanelet2_map_2,看不出MGRS坐标系下原点坐标值。
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第6张图片这是lanelet2_map_1,MGRS坐标系下原点坐标值为红圈。
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第7张图片
解决办法就是,找坐标转换呀,osm的原点经纬度坐标值肯定可以知道,那么可以通过这个网站,
https://www.earthpoint.us/Convert.aspx, 进行坐标系下的坐标值转换就行了。另外一个办法就是,利用代码,在src/planning/global_routing/src/base_function/hdmap_path_building.cpp里面的这个函数这里,可以打印出来。
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第8张图片

lanelet2_map_2.osm打印结果:
在这里插入图片描述

更改src/planning/global_routing/launch/staticTFpub.launch里面的这两个MGRS坐标系下原点坐标值,可以得到地图:
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第9张图片
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第10张图片照样进行规划算法,自己在车道位置的坐标加障碍物就行。
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第11张图片

编译

在工程文件~/Automatic_driving$ 下执行

catkin build

因为缺失依赖而没有成功编译的,可屏蔽相关的包catkin config --blacklist ,取消黑名单catkin config --no-blacklist
需要屏蔽某个模块的package,可以直接放一个名为CATKIN_IGNORE 的文件到所在目录,则该目录下的包就不会被编译

编译报错经验

1.报错信息

CMake Error at /opt/ros/noetic/share/catkin/cmake/empy.cmake:30 (message):
  Unable to find either executable 'empy' or Python module 'em'...  try
  installing the package 'python3-empy'

注意,因为我安装了conda环境,在base下编译的,所以才可能出现这个问题,解决方法:

pip install empy

2.报错信息

ImportError: "from catkin_pkg.package import parse_package" failed: No module named 'catkin_pkg'
Make sure that you have installed "catkin_pkg", it is up to date and on the PYTHONPATH.
CMake Error at /opt/ros/noetic/share/catkin/cmake/safe_execute_process.cmake:11 (message):
  execute_process(/usr/local/anaconda3/bin/python3
  "/opt/ros/noetic/share/catkin/cmake/parse_package_xml.py"
  "/opt/ros/noetic/share/catkin/cmake/../package.xml"
  "/home/cg/Automatic_driving/build/catkin_tools_prebuild/catkin/catkin_generated/version/package.cmake")
  returned error code 1

注意,因为我安装了conda环境,在base下编译的,所以才可能出现这个问题,解决方法:

pip install catkin_pkg

3.报错信息

Make Error at /opt/ros/noetic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
  Could not find a package configuration file provided by "sleipnir_msgs"
  with any of the following names:

    sleipnir_msgsConfig.cmake
    sleipnir_msgs-config.cmake

解决方法:先编译sleipnir_msgs

catkin build sleipnir_msgs

4.报错信息

CMake Error at /opt/ros/noetic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
  Could not find a package configuration file provided by
  "lanelet2_extension" with any of the following names:

    lanelet2_extensionConfig.cmake
    lanelet2_extension-config.cmake

解决方法:不慌,重新编译

catkin build lanelet2_extension

5.报错信息

/usr/bin/ld: /lib/x86_64-linux-gnu/libapr-1.so.0: undefined reference to `uuid_generate@UUID_1.0'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/ui_console.dir/build.make:150/home/cg/Automatic_driving/devel/.private/ui_console/lib/ui_console/ui_console] 错误 1
make[1]: *** [CMakeFiles/Makefile2:166:CMakeFiles/ui_console.dir/all] 错误 2
make: *** [Makefile:141:all] 错误 2

这个错误的原因,还是因为有了conda环境,QT引用的是anaconda里的qt,因为我在ui_console里面用了qt画图,当然,你可以把这个文件夹删除,也可以解决。解决方法:

到anaconda安装文件夹下的anaconda/lib下:

sudo mkdir libuuid_bk
mv libuuid* libuuid_bk/

6.报错信息

Traceback (most recent call last):
  File "/opt/ros/noetic/lib/joint_state_publisher/joint_state_publisher", line 35, in <module>
    import rospy
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/__init__.py", line 49, in <module>
    from .client import spin, myargv, init_node, \
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/client.py", line 52, in <module>
    import roslib
  File "/opt/ros/noetic/lib/python3/dist-packages/roslib/__init__.py", line 50, in <module>
    from roslib.launcher import load_manifest  # noqa: F401
  File "/opt/ros/noetic/lib/python3/dist-packages/roslib/launcher.py", line 42, in <module>
    import rospkg
ModuleNotFoundError: No module named 'rospkg'

这个错误的原因,还是因为有了conda环境,解决方法:

pip install rospkg

代码架构

├── Automatic_driving ----> 存放无人车架构模块  
        ├── src     ---> 源代码
		│    ├── common      ---->  公共包
		│    ├── messages     ----> 自定义消息类型  
		│    ├── planning      ---->  规划模块  
				  │    ├── dynamic_routing      ---->  局部规划
				  │    ├── global_routing     ---->  全局规划
				  │    ├── hdmap      ---->  地图文件
				  │    ├── installers     ---->  环境配置安装文件与说明文件
				  │    ├── planning_vehicle_simulator      ---->  ui界面(qt编写的)与车辆模型加载
				  │    ├── routing_msgs      ---->  局部规划的自定义消息类型

代码配置

我是使用vscode进行代码编辑的。

1.在.vscode/c_cpp_properties.json,把路径加载进去,目的是在vscode里面没有红波兰线,虽然编译不会报错。
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第12张图片

2.改地图文件
在src/planning/global_routing/launch/global_routing.launch中,里面的路径看你咯,你可以换成你自己的地图osm文件(小扩展,使用JOSM画的)。

    <arg name="lanelet2_map_path" value="src/planning/hdmap/lanelet2_map_1.osm"/>
    <!-- <arg name="lanelet2_map_path" value="src/planning/hdmap/lanelet2_map_2.osm"/> -->

3.改原点坐标偏移
如上面的章节地图更换说明所写。

代码运行

第一步:

source ./devel/setup.bash 

第二步:

roslaunch global_routing global_routing.launch 

说明:src/planning/global_routing/launch/global_routing.launch是最外层的launch,有关参数设置都有注释。

运行报错经验

运行时可能来不及加载模拟的障碍物(有延时,可能线程没优化好),重新roslaunch就可以了。
暂无其他,看看到时候购买的小伙伴们的群里大家有没有问题,有我会记录在这里。

运行效果

1.rviz加载的地图
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第13张图片
2.rviz加载的主题
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第14张图片
3.仿真车辆和模拟的障碍物显示
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第15张图片
4.全局路径切割,即利用Lanelet的特点,进行切割获取,蓝色带为起点到终点的全局路径
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第16张图片

5.跑Apollo-Lattice的采样规划,蓝色线为全局路径,也就是参考线啦。红色为局部轨迹,车可以完美绕开障碍物。
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第17张图片
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第18张图片

6.跑Apollo-Lattice的二次规划,蓝色线为全局路径,也就是参考线啦。红色为局部轨迹,车可以完美绕开障碍物。
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第19张图片

7.frenet坐标系的规划,就是分为s-t规划和d-t规划,然后合成进行筛选。代码直观注释。
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第20张图片
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第21张图片
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第22张图片

8.到达终点停止。
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第23张图片
9.Apollo参考线平滑算法,有两个平滑方案选择,CosThetaSmoother 和FemPosSmooth,原理自行百度啦,不懂再在交流群交流。效果我不显示地图给你们看会比较清楚
平滑前:表红的地方都是有明显皱折
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第24张图片

CosThetaSmoother平滑后:超级平滑
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第25张图片

FemPosSmooth平滑后:超级平滑
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第26张图片
10.还有一个很有趣的效果,就是可以倒车到达终点,如果终点在车后脑勺不远的地方,就可以倒车规划哈哈,心动的朋友们赶紧下单支持我啦。
Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第27张图片Apollo规划代码ros移植-路径规划可跑工程代码编译版本分享_第28张图片
11.stanly控制算法控制车的移动,这个上面图片都是它,当然可以换成纯跟踪算法。
12.Qt画图SL图和ST图

如何应用于实际车辆?

1.将所有坐标值,包括起点,终点,以及车的里程计等等,都换成订阅你们车上定位模块的坐标系下的坐标值。
2.将模拟测试的障碍物信息,换成订阅你们感知模块的信息,记得,我们规划的障碍物需要什么信息,就对接好感知模块那一边,要发布什么信息给你获取。
3.发布轨迹点数据给控制模块跟踪,这个已经写好,可以看代码,了解发布的话题等信息。

须知

1.如果终点定义很远,插值时间会很大,你们可以自行进行分段处理,这里我就不透露我的做法。
2.由于我的实际测试车辆不需要超车,所以ST图我还没用,但是框架代码也写好了。
3.二次规划的前探距离要比较长,轨迹也要长一些,但是我在测试的时候没有设置很长,你们可以自己调参。

结束语

各位在校想学习这个方向的同学,刚工作这方面的同事,公司创业者,要毕业要毕业设计,课程设计的同学等,都可以拿来用。由于我也是C++菜鸟,所以代码写得不好请大家见谅。大家评论三连刷起来!!!需要下载工程代码文件,可以先私信我,或者在我的咸鱼号上自行查看下载链接(账号名称:火腿鸡蛋饼里面有没有老婆)。感谢大家的支持,大家一起学习。
重要的事情说三遍!!!!希望你们看到最后:
人多的话会拉群交流!
人多的话会拉群交流!
人多的话会拉群交流!

qq群。

还有:
有些人要加这加那的功能,其实帮你们实现了整个核心框架了,那些超车或者控制换成纯跟踪算法等,你们完全可以自由发挥,需要我的话,可以私信或者进群交流,不过我没那么多时间,就交流交流。最好进入群交流啦,我后面有更新自动驾驶使用的知识也会跟伙伴们分享
还有:
因为是咸鱼交易,你们就放心,但是缺点就是,买完一个我要同时再次上架,所以如果发现没有可以下单,私信我就好。

心动的朋友们赶紧支持我啦!!!

你可能感兴趣的:(自动驾驶笔记和知识分享,自动驾驶,百度,动态规划,算法,人工智能)