Carla与Ros联合仿真教学与踩坑经历
前言
本人需要用到carla进行仿真,做实验,研究了这个平台几个月。
需要注意的是,本人没有保留所有的ros包,而是选择一些进行使用,其他大家可以进行扩展。
carla0.9.5版本和carla0.9.11版本对比
carla-0.9.5的优点:
(1)内存小,显卡要求不高,友好运行。
(2)代码框架友好,足以进行传统规划算法的学习使用。
(3)适合入门。
carla-0.9.5的缺点:
(1)传感器不齐全。
(2)ros-bridge不可以在carla绘制Marker。
(3)ros-bridge不能订阅traffic light等道路信息
(4)ros-bridge只支持ROS1
carla-0.9.11的优点:
(1)ros-bridge可扩展到多智能体,carla_ad_agent(在目前的开发中此包被本人删除)
(2)ros-bridge可以订阅traffic light等道路信息
(3)ros-bridge可以在carla绘制Marker
(4)ros-bridge可以扩展到ROS2
(5)传感器更加齐全
carla-0.9.11的缺点:
(1)较长时间运行,leaderboard 会崩溃,暂未找到原因… 随机发生
4.26.2-0+++UE4+Release-4.26 522 0
Disabling core dumps.
Signal 11 caught.
Malloc Size=65538 LargeMemoryPoolOffset=65554
CommonUnixCrashHandler: Signal=11
Malloc Size=131160 LargeMemoryPoolOffset=196744
Malloc Size=131160 LargeMemoryPoolOffset=327928
Engine crash handling finished; re-raising signal 11 for the default handler. Good bye.
Segmentation fault (core dumped)
(2)内存大于0.9.5版本,显卡要求更高。
(3)bug更多,比如自己写的放置车的位置的代码在0.9.5版本可以,在0.9.11版本会有偏移。
(4)ros联合关闭rviz时,CarlaUE4容易挂掉。
学习建议
(1)如果只学习使用路径规划和控制算法,而且电脑配置较差的,建议大家使用carla-0.9.5版本,此版本bug少。
(2)如果想学习感知融合,定位融合等其他内容,建议使用carla-0.9.11及以上的版本,因为传感器齐全,但此版本bug较多。
(3)不要用carla的0.9.6,0.9.7,0.9.8,0.9.9版本,有TF的bug。
carla联合ros开发-0.9.5版本
carla-0.9.5源码:
https://github.com/carla-simulator/carla/tree/0.9.5
下载完解压,给整个文件夹赋权限
sudo chmod -R 777 文件夹
单独carla的代码测试
安装环境
pip install pygame numpy future networkx scikit-learn
pip install networkx
sudo apt-get install -y libomp5
sudo apt-get install jstest-gtk
本人使用的是python3.8
配置环境与测试
首先在~/.bashrc添加:
export PYTHONPATH=$PYTHONPATH:/opt/carla-0.9.5/PythonAPI/carla/dist/carla-0.9.5-py3.5-linux-x86_64.egg
export PYTHONPATH=$PYTHONPATH:/opt/carla-0.9.5/PythonAPI/egg/carla-0.9.5-py3.5-linux-x86_64.egg:/opt/carla-0.9.5/PythonAPI/agents
然后:
source ~/.bashrc
测试一下:
python -c 'import carla; print("Success")'
运行carla:
./CarlaUE4.sh # 电脑配置可以
./CarlaUE4.sh -prefernvidia -quality-level=Low -benchmark -fps=15 # 电脑配置可以
-prefernvidia:使用NVIDIA显卡启动
-quality-level=Low:调低渲染水平
-benchmark -fps=15:引擎以1/15秒的固定时间逐步运行
配置选项可用:
carla-rpc-port=N:侦听端口 N 处的客户端连接。默认情况下,流式端口 Streaming port 设置为 N+1;
carla-streaming-port=N:指定用于传感器数据流的端口。 使用 0 获取随机未使用的端口。 第二个端口将自动设置为 N + 1;
quality-level={Low,Epic}:更改图形质量级别;
-carla-server:让 carla以服务的方式运行;
-benchmark -fps=15:引擎以1/15秒的固定时间逐步运行;
-windowed -ResX=800 -ResY=600:屏幕窗口大小;
测试py脚本:
python PythonAPI/examples/spawn_npc.py -n 30
python PythonAPI/examples/manual_control.py
python PythonAPI/examples/automatic_control.py
python PythonAPI/examples/dynamic_weather.py -s 5
-s 5意思是把天气变化加速了5倍。
注意,使用vscode打开文件夹的时候,有些py文件运行会出现找不到目录的问题,可以通过以下指令,来修改import目录:
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), '../'))
ros-bridge(0.9.5.1版本)
源码下载:https://github.com/carla-simulator/ros-bridge/tree/0.9.5.1
下载完解压。
安装依赖环境
sudo apt-get install python-protobuf
sudo apt install ros-noetic-ackermann-msgs
sudo apt install ros-noetic-derived-object-msgs
sudo apt install ros-noetic-vision-msgs
(base) pip install pyyaml
(base) pip install simple_pid
(base) pip3 install pycryptodomex
编译
py不用编译:
1.catkin build carla_msgs t4ac_msgs
2.catkin build
运行
窗口运行carla:
./CarlaUE4.sh -windowed -ResX=640 -ResY=480 -quality-level=Low -fps=15
再加些车辆
python PythonAPI/examples/spawn_npc.py -n 30
测试
source ./devel/setup.bash
roslaunch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch
(注意:此launch文件在本人开发的工程中被本人修改)
运行指令后,再加载rviz,可以看到自主车的Marker,还有其他车辆的Marker,还有图像等等。还可以通过rostopic list查看发布和订阅的话题。
具体参考:https://github.com/carla-simulator/ros-bridge/tree/0.9.5.1
本人针对carla-0.9.5实现的ros联合仿真过程
注意:carla版本和ros版本要对应,不然运行不了
1.将ros-bridge的python2内容修改为python3
这个简单,一开始python3运行报错的地方,有两个,修改方案为:
(1)has_key函数改为in
(2) items()替换iteritems()
2.修改源代码
本人对源代码进行修改,除了一些小Bug,主要有以几点:
(1)只保留以下几个ros包和协议,本人将carla_msgs移动到自己的msgs文件夹。本人在0.9.5版本将carla_waypoint_publisher整合到了carla_ego_vehicle.py。而0.9.11版本则保留carla_waypoint_publisher,具体见0.9.11版本的介绍。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uqX0mXrF-1688824666285)(/home/cg/.config/Typora/typora-user-images/image-20230122094733881.png)]
(2)新建文件夹my_py,主要是写了三个脚本
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U6pMZm1w-1688824666286)(/home/cg/.config/Typora/typora-user-images/image-20230122094831393.png)]
作用分别是:更改地图,销毁actor,放置静态车辆作为静态障碍物。
(3)修改ros-bridge/carla_ego_vehicle/src/carla_ego_vehicle/carla_ego_vehicle.py的源代码,主要修改以下内容:
a.修改起点发布的话题,"/carla/{}/initialpose".format(self.role_name)修改为"/initialpose"
b.增加监视器spectator
c.增加终点订阅,还有全局规划导航点的获取和显示
(4)修改launch文件,修改了ros-bridge/carla_ros_bridge/launch/carla_ros_bridge_with_ego_vehicle.launch的里面的launch文件,删除了ros-bridge工程中多余的测试launch文件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NfbTpuGO-1688824666287)(/home/cg/.config/Typora/typora-user-images/image-20230122095909798.png)]
3.创建带有各种传感器的ego
在ros-bridge/carla_ego_vehicle/config/sensors.json里面添加需要的传感器及其放置位置:
{
"sensors": [
{
"type": "sensor.camera.rgb",
"id": "front",
"x": 2.0, "y": 0.0, "z": 2.0, "roll": 0.0, "pitch": 0.0, "yaw": 0.0,
"width": 800,
"height": 600,
"fov": 100
},
{
"type": "sensor.camera.rgb",
"id": "view",
"x": -4.5, "y": 0.0, "z": 2.8, "roll": 0.0, "pitch": -20.0, "yaw": 0.0,
"width": 800,
"height": 600,
"fov": 100
},
{
"type": "sensor.camera.depth",
"id": "view",
"x": -4.5, "y": 0.0, "z": 2.8, "roll": 0.0, "pitch": -20.0, "yaw": 0.0,
"width": 800,
"height": 600,
"fov": 100
},
{
"type": "sensor.camera.semantic_segmentation",
"id": "view",
"x": -4.5, "y": 0.0, "z": 2.8, "roll": 0.0, "pitch": -20.0, "yaw": 0.0,
"width": 800,
"height": 600,
"fov": 100
},
{
"type": "sensor.lidar.ray_cast",
"id": "lidar1",
"x": 0.0, "y": 0.0, "z": 2.4, "roll": 0.0, "pitch": 0.0, "yaw": 0.0,
"range": 5000,
"channels": 32,
"points_per_second": 320000,
"upper_fov": 2.0,
"lower_fov": -26.8,
"rotation_frequency": 20
},
{
"type": "sensor.other.gnss",
"id": "gnss1",
"x": 1.0, "y": 0.0, "z": 2.0
},
{
"type": "sensor.other.collision",
"id": "collision1",
"x": 0.0, "y": 0.0, "z": 0.0
},
{
"type": "sensor.other.lane_invasion",
"id": "laneinvasion1",
"x": 0.0, "y": 0.0, "z": 0.0
}
]
}
运行
python PythonAPI/examples/spawn_npc.py -n 30 # 先添加一些车,可选
roslaunch carla_ros_bridge carla_ros_bridge_with_ego_vehicle.launch
carla_ros_bridge_with_ego_vehicle.launch会加载carla_ego_vehicle.py,创建带有配置传感器的自主车。
可以测试ros发布控制车的命令:
rostopic pub /carla/ego_vehicle/vehicle_control_cmd carla_msgs/CarlaEgoVehicleControl "{throttle: 0.3, steer: 0.0}" -r 10 # ego_vehicle改成自己的role_name
本人将不使用carla_manual_control的launch,因为本人电脑太卡。然后修改carla_ego_vehicle.py内容,这样直接运行carla_ros_bridge_with_ego_vehicle.launch就可以加载出rviz和俯视界面,实现很好的联合仿真。
注意:
- 本人因为强迫症,把没有用的工程包和文件都删除,只保留别人开源的license,尊重别人的代码
- 一开始加载rviz后,需要重新定义车的起点
- 车已经到达终点后需要重新定义起点和终点
- 车达到终点之前不能再定义起点和终点
4.添加opendrive地图显示
<!-- 加载carla的opendrive地图 -->
<include file="$(find t4ac_map_monitor_ros)/launch/mapping.launch">
<arg name="map_name" value="$(arg map_name)"/>
</include>
具体参考开源:https://github.com/AlejandroDiazD/opendrive-mapping-planning
5.跟局部规划算法进行结合
要实现跟我们在ros仿真里面写好的算法框架进行联合,主要更改以下几点:
(1)更改获取导航点的方式
原来我们的地图路径点是手动设置的,要改为订阅carla发布的导航点,carla主要使用以下函数进行导航点的获取:
def calculate_route(self, goal):
"""
Calculate a route from the current location to 'goal'
"""
dao = GlobalRoutePlannerDAO(self.world.get_map())
grp = GlobalRoutePlanner(dao)
grp.setup()
route = grp.trace_route(self.player.get_location(),
carla.Location(goal.location.x,
goal.location.y,
goal.location.z))
return route
导航点的获取代码写在carla_ego_vehicle.py,只要定义起点和终点,就可以返回导航点。
(2)更改获取里程计的方式
这个只需要更改订阅的消息类型就可以
由“odom”改为"/carla/" + role_name + "/odometry "。
(3)关闭ros单独仿真时特定的消息类型
比如原来的地图路线显示,应该选择关闭。
(4)更改障碍物的订阅内容
因为carla的障碍物发布的消息类型跟之前不一样,所以我们必须根据carla发布的障碍物消息类型进行订阅函数的修改,以获取相应的障碍物信息。
(5)增加一些订阅内容(等carla升级后再考虑)
如果carla升级,规划算法可以进一步考虑交通灯,斑马线等道路规则,通过订阅这些信息,来完善规划
(6)更改控制的发布方式
控制的发布话题和消息类型跟之前不同,更改即可。
6.carla-ros-bridge-0.9.5版本的坑
(1)控制指令的坑
我也不清楚,我使用"/carla/" + role_name + “/vehicle_control_cmd “进行控制,车跑着跑着会偏离,而且坐标系是反过来了,也就是说我们原本方向盘向左边打为正,右边为负,变成右边打为正,左边为负,于是,我改成了”/carla/” + role_name + "/ackermann_cmd"进行控制,车就不会偏离。这两个话题的差别在于:
/carla/" + role_name + "/vehicle_control_cmd:发送的是油门(不等同于速度)和转角,左手坐标系
/carla/" + role_name + "/ackermann_cmd:发送速度,和转角弧度,右手坐标系,同时可以发送控制加速度的指令,对目标使用PID进行跟踪。
(2)弯道的坑
目标无法开90度弯道,轨迹规划没有问题,单纯的ros仿真也没有问题,具体原因应该是出在控制方法和参数配置,目前还没有解决。
(3)自主车的role_name只能选择hero和ego_vehicle,但是两者在ros仿真下的自主车跟踪效果不一样。
7.编译运行与使用方法
请参考视频内容。
常见报错
1.trying to create rpc server for traffic manager; but the system failed to cr
netstat -tnlp | grep :8000
kill -9 pid
2.INTEL-MESA: warning: Performance support disabled, consider sysctl dev.i915.perf_stream_paranoid=0
sudo sysctl dev.i915.perf_stream_paranoid=0
3.报错:
X Error of failed request: BadDrawable (invalid Pixmap or Window parameter)
Major opcode of failed request: 149 ()
Minor opcode of failed request: 4
Resource id in failed request: 0x4600041
Serial number of failed request: 388
Current serial number in output stream: 399
terminating with uncaught exception of type std::__1::system_error: mutex lock failed: Invalid argument
Signal 6 caught.
Segmentation fault (core dumped)
./CarlaUE4.sh -prefernvidia
效果
需要代码的可以私信