测试环境:CARLA0.9.7.4,Autoware1.12.0,ubuntu16.04LTS,ROS kinetic。
参考资料:
- Autoware入门教程:https://www.ncnynl.com/archives/201910/3401.html
- Autoware和LGSVL联调:https://www.jianshu.com/p/c4fa774892a9
- Autoware培训笔记:https://www.cnblogs.com/hgl0417/p/11147109.html
- YouTube视频:https://www.youtube.com/watch?v=Z7PLkcY9Mtk
- bilibili视频1:https://www.bilibili.com/video/BV1LJ411E7hK?from=search&seid=12197307514393209183
- bilibili视频2:https://www.bilibili.com/video/BV1GE411n7wp
官方文档:https://gitlab.com/autowarefoundation/autoware.ai/autoware/-/wikis/Source-Build
#依赖
$ sudo apt-get update
$ sudo apt-get install -y python-catkin-pkg python-rosdep ros-$ROS_DISTRO-catkin gksu
$ sudo apt-get install -y python3-pip python3-colcon-common-extensions python3-setuptools python3-vcstool
$ pip3 install -U setuptools
#创建工作空间
$ mkdir -p autoware.ai/src
$ cd autoware.ai
#下载库和依赖
$ wget -O autoware.ai.repos "https://gitlab.com/autowarefoundation/autoware.ai/autoware/raw/1.12.0/autoware.ai.repos?inline=false"
$ vcs import src < autoware.ai.repos
$ rosdep update
$ rosdep install -y --from-paths src --ignore-src --rosdistro $ROS_DISTRO
#编译(有CUDA支持)
$ AUTOWARE_COMPILE_WITH_CUDA=1 colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
#编译(无CUDA支持)
$ colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
安装完成以后跑ROSBAG demo
https://gitlab.com/autowarefoundation/autoware.ai/autoware/-/wikis/ROSBAG-Demo
carla-autoware官方文档:https://github.com/carla-simulator/carla-autoware
1.setup
#下载carla-autoware
cd ~
git lfs clone https://github.com/carla-simulator/carla-autoware.git
cd carla-autoware
git submodule update --init
cd catkin_ws
source /install/setup.bash
catkin_init_workspace src/
# install dependencies
rosdep update
rosdep install -y --from-paths src --ignore-src --rosdistro $ROS_DISTRO
#编译
catkin_make
2.配置bashrc环境变量
#配置bashrc
export ROS_DISTRO=kinetic
source /opt/ros/kinetic/setup.bash
source ~/autoware.ai/install/setup.bash
export CARLA_AUTOWARE_ROOT=~/carla-autoware/autoware_launch
export CARLA_MAPS_PATH=~/carla-autoware/autoware_data/maps
source $CARLA_AUTOWARE_ROOT/../catkin_ws/devel/setup.bash
export CARLA_ROOT=~/CARLA_0.9.7.4
export PYTHONPATH=$PYTHONPATH:${CARLA_ROOT}/PythonAPI/carla/dist/carla-0.9.7-py2.7-linux-x86_64.egg:${CARLA_ROOT}/PythonAPI/carla/agents:${CARLA_ROOT}/PythonAPI/carla/:${CARLA_ROOT}/PythonAPI/ju/scenario_runner
3.启动CARLA
option1:docker启动
$ docker run -p 2000-2001:2000-2001 -it --rm carlasim/carla: ./CarlaUE4.sh
option2:编译包启动
$ cd ~/CARLA_0.9.7.4
$ ./CarlaUE4.sh
4.连接ROS Bridge
option1:先启动roscore,启动rviz,再运行devel.launch,可以不打开runtime manager界面,此时rviz中已经有地图了。
# 打开一个终端
$ roscore
# 再打开一个终端
$ rviz
# 再打开一个终端
$ cd carla-autoware/autoware_launch
$ roslaunch devel.launch
option2:启动runtime manager,再运行devel.launch。
# 打开一个终端,在runtime manager中打开rviz
$ roslaunch runtime_manager runtime_manager.launch
# 再打开一个终端,运行devel.launch
$ cd carla-autoware/autoware_launch
$ roslaunch devel.launch
备注:
1.使用Python2.7环境,运行devel.launch终端会报错,原因是devel.launch中也包括了manual control的启动。 经试验,在Python2.7环境不连接ros bridge和连接ros bridge的报错一样,而manual control在Python3.5环境下运行不会报错,由于使用ROS,必须使用2.7的环境,故终端会出现报错的现象,但不影响。
2.devel.launch的结构。
第一大部分:carla_autoware_bridge_with_manual_control.launch
1)carla_manual_control.launch #手动控制车的pygame窗口
2)carla_autoware_bridge.launch
2.1) carla_ros_bridge.launch
2.2) carla_ego_vehicle.launch #生成主车,可以指定spawn point
2.3) carla_waypoint_publisher.launch #发布waypoint信息
2.4) carla_point_map_loader.launch #加载地图,已经tf转换
2.5) carla_autoware_bridge_common.launch
2.5.1)tf.launch
2.5.2)carla_ackermann_control.launch
第二大部分:autoware.launch
1)my_map.launch #空文件
2)my_sensing.launch
3)my_localization.launch
4)my_detection.launch
5)my_mission_planning.launch
6)my_motion_planning.launch3.默认的devel.launch包括了以上内容,正常运行以后,town03下,会任意位置生成主车,终点固定,通过2.3)carla_waypoint_publisher发布waypoint信息,且waypoint只发布一次,这里发布的waypoint是自动生成计算得到的,因此每次循迹的路线都不一样,但是终点是固定的。
4.devel.launch循迹的最大速度是15km/h,测试在town03下会出现撞车的问题,可能是速度太大跟踪不上,在town04下稍微好点,偶尔也会出现撞车的情况,撞车以后,可以在manual control的界面下,按键盘B,切换为手动模式,手动控制一下,再切为自动模式。
5.launch文件是多节点的同时启动,默认的devel.launch可以实现自动驾驶循迹的例子,也可以将其中的某些节点注释点,只保留需要使用的,然后通过runtime manager中的模块来实现对应的功能,runtime manager中的模块实际上是对应节点的封装。
1.注释launch文件
保留下面的部分
a)故原本的devel.launch现在只保留了bridge,manual control和localization部分,连接以后只实现了两边的通信,lidar数据实时传输,没有控制命令,不会进行自动驾驶的循迹。
b)可以在终端echo /point raw话题,也可以在runtime manager中echo。
2.录制bag
3.ndt_mapping建图
Autoware培训笔记1:https://www.cnblogs.com/hgl0417/p/11130747.html
4.回放bag,生成csv文件
Autoware培训笔记3:https://www.cnblogs.com/hgl0417/p/11144203.html
5.回放bag,加载csv,跟踪
Autoware培训笔记4:https://www.cnblogs.com/hgl0417/p/11147109.html
#!/usr/bin/python
# -*- coding: utf-8 -*
import glob
import os
import sys
try:
sys.path.append(glob.glob('../carla/dist/carla-*%d.%d-%s.egg' % (
sys.version_info.major,
sys.version_info.minor,
'win-amd64' if os.name == 'nt' else 'linux-x86_64'))[0])
except IndexError:
pass
import carla
import scenario_runner
#Import the library Transform used to explicitly spawn an actor
from carla import Transform, Location, Rotation
from carla import Map
from carla import Vector3D
from srunner.challenge.utils.route_manipulation import interpolate_trajectory
import random
import time
actor_list = []
try:
##General connection to server and get blue_print
client = carla.Client('localhost',2000)
client.set_timeout(5.0)
world = client.get_world()
world = client.load_world('Town04') #change maps
mp = world.get_map()#get the map of the current world.
blueprint_library = world.get_blueprint_library()
#使用interpolate_trajectory方法,可以生成一段路径,并指定路径点的间隔,该方法有两个返回值,一个经纬度,一个transform格式。
#该方法使用scenario_runner模块,需要制定起点和终点。
transform = carla.Transform(carla.Location(x=-65.4, y=4.0, z=11), carla.Rotation(pitch=0,yaw=180,roll=0))
map = world.get_map()
start_waypoint = map.get_waypoint(transform.location)
end_waypoint = start_waypoint.next(400)[-1]
waypoints = [start_waypoint.transform.location, end_waypoint.transform.location]
gps_route, trajectory = interpolate_trajectory(world,waypoints,1.0)
#print(gps_route)
#print(len(gps_route))
#print("**************************************")
#print(trajectory)
#print(len(trajectory))
#transform格式解析为(x,y,z,yaw,velocity,change_flag)
def _get_waypoints(trajectory):
waypoints = []
for index in range(len(trajectory)):
waypoint = trajectory[index][0]
# print(waypoint)
# waypoints.append([waypoint['lat'], waypoint['lon'], waypoint['z']])
waypoints.append([waypoint.location.x, waypoint.location.y, waypoint.location.z, waypoint.rotation.yaw, 5.0, 0])
# print(waypoints)
return waypoints
#print(_get_waypoints(trajectory))
waypoints_list = _get_waypoints(trajectory)
#导入txt文件
def text_save(filename, data):#filename为写入CSV文件的路径,data为要写入数据列表.
file = open(filename,'a')
for i in range(len(data)):
s = str(data[i]).replace('[','').replace(']','')#去除[],这两行按数据不同,可以选择
s = s.replace("'",'').replace(',','') +'\n' #去除单引号,逗号,每行末尾追加换行符
file.write(s)
file.close()
print("保存文件成功")
filename = '/home/juling/Desktop/waypoint.txt'
text_save(filename, waypoints_list)
#使用draw_point方法绘制路径
def draw_trajectory(trajectory, persistency=0, vertical_shift=0):
for index in range(len(trajectory)):
waypoint = trajectory[index][0]
location = waypoint.location + carla.Location(z=vertical_shift)
world.debug.draw_point(location, size=0.1, color=carla.Color(255, 255, 0), life_time=persistency)
draw_trajectory(trajectory)
finally:
for actor in actor_list:
actor.destroy()
print("All cleaned up!")
路径跟踪联合仿真和回放bag跟踪本质上是有无反馈的区别,基于bag数据回放的跟踪是没有反馈的开环仿真,而联合仿真是有反馈的闭环仿真。
1.注释launch,只保留carla_autoware_bridge_with_manual_control.launch以及my_localization.launch这两个部分。
2.连接ROS Bridge,参照上述CARLA-Autoware ROS Bridge
部分。
3.将CARLA0.9.7.4生成400m路径,并导入txt,绘制路径
部分生成的txt文件转为csv文件。
4.输入csv路径,使用pure pursuit跟踪,参照上述回放bag,加载csv,跟踪
部分。
问题:
1.代码生成的csv文件(也包括x,y,z,yaw,velocity,change_flag)加载会出现lane data is something wrong的错误,但是通过建图生成的csv文件加载正常。两者格式都是x,y,z,yaw,velocity,change_flag。2.经过多次试验,单个数据复制粘贴到建图生成的csv文件,20×5个数据,发现加载成功,但是轨迹发生偏移超出车道线外。代码生成的路径点在导出的同时,也被绘制出来,是在正常车道线上的,在ROS Bridge连接以后,manual control的pygame界面显示的x,y位置也符合csv中的坐标,rviz中/image话题显示的路径也是正常车道线上的,但是点云中的这个20个点偏移到车道外了。
3.也考虑是否是yaw数值不对,最终排除,CARLA中yaw的值范围为-180到180。
4.代码生成的csv文件和录制bag建图生成的csv文件是同一段路径下的,但是两者的坐标相差甚远,因此判断存在tf转换的问题。代码生成的csv文件无法正确加载,建图生成的csv文件可以正常加载,但是加载出来的点不与相应路径重合,确实存在tf转换的问题,修改2.5) carla_autoware_bridge_common.launch中的tf.launch里的值,有变化,但是它们之间的转换规律和法则无法知晓,不可行。
5.通过复制粘贴数据来替换建图生成的csv文件,可以加载成功,但是工作量巨大。因为是400×5的数据量,通过单个粘贴复制的数据量太大,另外,通过单个粘贴复制20×5个数据,发现加载成功,但是轨迹发生偏移超出车道线外,这意味着还要对每个数据修改,使轨迹正常在车道上,这样做也不太可行。
6.只要这个路径正确加载在车道上,就可以实现路径跟踪的闭环联合仿真。