Carla与Ros联合仿真教学与踩坑经历

news/2024/11/10 7:41:30

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和俯视界面,实现很好的联合仿真。

注意:

  1. 本人因为强迫症,把没有用的工程包和文件都删除,只保留别人开源的license,尊重别人的代码
  2. 一开始加载rviz后,需要重新定义车的起点
  3. 车已经到达终点后需要重新定义起点和终点
  4. 车达到终点之前不能再定义起点和终点

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

效果

在这里插入图片描述

需要代码的可以私信


http://www.niftyadmin.cn/n/3369346.html

相关文章

力扣-跳跃游戏Ⅱ

给你一个非负整数数组 nums &#xff0c;你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 假设你总是可以到达数组的最后一个位置。 public int jump(int[] nums) {int length nu…

八大排序——归并排序

归并排序&#xff08;Merge sort&#xff09; 定义 归并排序时建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。 作为一种典型的分而治之思想的算法应用&#xff0c;归并排序的实现有两种方法&#xff1a; 自上而下的递归&#xff08;所有…

WINCE驱动程序编写者指南(转载)

WINCE驱动程序编写者指南在CE中&#xff0c;最简单的一个驱动程序莫过于一个内置&#xff08;Built-in&#xff09;设备的流接口驱动。对于一个不支持热拔插的设备&#xff0c;最快捷的方法就是为其实现一个内置的流接口的驱动。对于这样一类驱动程序&#xff0c;我们只需要按一…

vs 2008调试DLL的方法(转载)

对DLL的调试是一个热门话题&#xff0c;上网搜索了一下&#xff0c;发现很多相关的信息&#xff0c;但几乎全部是没有进行验证的摘抄&#xff0c;很鄙视这种行为。所以我在浏览的一些国外的网站后&#xff0c;结合自己的经验写下我在vs 2008编译平台上调试DLL的方法。按照我描述…

jdk1.8 中 ArrayList扩容部分源码

2019独角兽企业重金招聘Python工程师标准>>> ArrayList 作为Java常用的一种数据结构&#xff0c;是基于数组实现的&#xff0c;是一个动态数组&#xff0c;其容量能自动增长。 ArrayList动态扩容的全过程。如果通过无参构造的话&#xff0c;初始数组容量为0&#xf…

ASP.NET CORE下运行CMD命令

ASP.NET CORE下运行CMD命令&#xff0c;用以前的ASP.NET 的命令System.Diagnostics.Process.Start("notepad");这样是可以运行出记事本的&#xff0c; 现在公司的C大神开发了个EXE&#xff0c;需要放在服务器上&#xff0c;然后当访问服务器上的某个网页的时候就执行…

iOS RAC 的使用总结 (转载)

ReactiveCocoa(简称RAC),是GitHub上开源的一个应用于iOS和OS X开发的一个新框架.RAC具有函数式编程和响应者编程的特性. ReactiveCocoa解决的问题: 1.传统iOS开发过程中,状态以及状态之间依赖过多的问题2.传统MVC架构的问题:Controller比较复杂,可测试性差3.提供统一的消息传递…

机器学习A-Z~支持向量机

本文将介绍机器学习中一个非常重要的算法&#xff0c;叫做SVM&#xff0c;中文翻译支持向量机。首先看一组例子来解释这个算法。 基本概念 有一组数据如图所示&#xff0c;有红色的点和蓝色的点&#xff0c;代表了两种分类的数据&#xff0c;现在我们要做的是如何将这两种数据准…