ubuntu 20.04 carla-ros-birdge

在Ubuntu 20.04 下安装 Carla 指定版本

参考:
Ubuntu 20.04 安装CARLA.
CARLA官网.

系统配置要求

130GB以上的硬盘空间,其中carla需要19.5GB,UnrealEngine需要96.1GB
16GB以上的内存,不够的可以扩容虚拟内存,但是会使运行卡顿
6 GB GPU,但推荐8GB
2 个TCP 端口以及良好的网络,安装时要确保不被防火墙block

安装依赖

参考官网命令,安装系统依赖

 sudo apt-get update &&
sudo apt-get install wget software-properties-common &&
sudo add-apt-repository ppa:ubuntu-toolchain-r/test &&
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add - &&
sudo apt-add-repository "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-8 main" &&
sudo apt-get update

配置编译器,要保证CALAR 和Unreal Engine用的是相同的clang。

sudo apt-add-repository "deb http://apt.llvm.org/focal/ llvm-toolchain-focal main"
sudo apt-get install build-essential clang-10 lld-10 g++-7 cmake ninja-build libvulkan1 python python-dev python3-dev python3-pip libpng-dev libtiff5-dev libjpeg-dev tzdata sed curl unzip autoconf libtool rsync libxml2-dev git
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/lib/llvm-10/bin/clang++ 180 &&
sudo update-alternatives --install /usr/bin/clang clang /usr/lib/llvm-10/bin/clang 180

为了与carla-ros-bridge适配,carla安装版本选择0.9.13,需要clang-8编译,但是clang-8不是Ubuntu20.04默认的版本,安装可参考
ubuntu20.04 安装clang(什么是llvm、什么是clang以及其和clang的关系).
Cannot install ‘libclang-dev‘–Ubuntu20.04 安装 libclang-dev 插件.
使用 aptitude安装clang-8

sudo aptitude install clang-8

通过 aptitude 安装 libclang-dev 时,选择安装目标clang版本的方案执行(不一定就是第二个)
在这里插入图片描述像这样的方案,不安装clang-8,输入n拒绝掉
在这里插入图片描述等到出现这样安装clang-8的方案,输入Y接受。

安装Python依赖。pip版本需要大于20.3。

pip install --user setuptools &&
pip3 install --user -Iv setuptools==47.3.1 &&
pip install --user distro &&
pip3 install --user distro &&
pip install --user wheel &&
pip3 install --user wheel auditwheel

安装Unreal Engine

CALAR 0.9.12以后的版本使用的引擎是Unreal Engine 4.26。在安装CALAR 之前要安装好Unreal Engine 4.26 。我这里使用的是刘博士提供的安装包。

解压后进入UnrealEngine_4.26文件夹,执行

./Setup.sh && ./GenerateProjectFiles.sh && make
cd ~/UnrealEngine_4.26/Engine/Binaries/Linux && ./UE4Editor

检查是否安装成功:

cd ~/UnrealEngine_4.26/Engine/Binaries/Linux && ./UE4Editor

安装完,要把UnrealEngine的路径添加到 ~/.bashrc

gedit ~/.bashrc

在最后一行写入

export UE4_ROOT=~/UnrealEngine_4.26

Carla源码编译安装

首先从GitHub上下载指定版本的carla。为了与carla-ros-bridge适配,需安装carla 0.9.13

git clone -b 0.9.13 https://github.com/carla-simulator/carla

安装aria2可以加速下载

sudo apt-get install aria2

编译安装

cd ~/carla
./Update.sh
make PythonAPI
#若指定Python版本,使用
#make PythonAPI ARGS="--python-version=2.7"
make launch

carla 0.9.13编译需要clang8,与ubuntu20.04自带的不同,需另外安装。

过程中可能会遇到下载失败的问题,多试几次可以成功。

用这种方法安装0.9.13的话,直接make PythonAPI 的话主要出现两个问题,参考Ubuntu 20.04 安装CARLA.可以解决。
在这里插入图片描述这是xerces-c的版本相关的报错,xerces-c版本问题主要是配置文件中xerces-c的网址现在已经从3.2.3更新到3.2.4,如果按照原来的配置文件就安装不料xerces-c,后面就会报错。所以需要把 carla/Util/BuildTools 下的 Setup.sh 和 BuildOSM2ODR.sh 中xerces-c的版本改成3.2.4 。
在这里插入图片描述在这里插入图片描述共4处。

make launch最后会启动carla窗口,点击绿色三角运行按钮可以运行的话,可以认为安装成功。
1Ubuntu20.04指定python版本时,由于系统自带的python是python3.8,需要将默认python和pip均设置为python2。

make PythonAPI ARGS="--python-version=2.7"

在这里插入图片描述这个报错可以不管

设置python2为默认可参考在 Ubuntu20.04 上安装 python2 并设置为默认方式
首先安装python2的setuptools

sudo apt-get install -y python-setuptools

安装过程中可能会报错缺少python依赖,参考Ubuntu 20.04 python2安装pip使用pip安装

在这里插入图片描述
例如这里是缺少distro,使用

 python2 -m pip install distro

安装

Carla Python API 使用

参考:史上最全Carla教程 |(三)基础API的使用.

配置Python环境

make PythonAPI 命令基于Ubuntu20.04默认的Python 3.8环境编译出了一个.whl文件和一个.egg文件。两个文件均在 carla/PythonAPI/carla/dist 路径下。Ubuntu 20.04 下的ros noetic实现了对Python3的支持,使用系统默认的Python版本即可。Ubuntu 18.04 下的ros melodic 仅支持Python2,所以需要将系统默认Python版本设为Python2。也可以使用anaconda进行管理。相关可参考这个.
.whl文件可以通过如下命令安装:

#Python 3
pip3 install <path/to/wheel>.whl
#Python 2
pip install <path/to/wheel>.whl

修改~/.bashrc,在末尾添加

export CARLA_ROOT=~/carla
export PYTHONPATH=$PYTHONPATH:$CARLA_ROOT/PythonAPI/carla/dist/carla-0.9.13-py3.8-linux-x86_64.egg:$CARLA_ROOT/PythonAPI/carla

Carla 官方提供了一些例程在 carla/PythonAPI/examples 路径下,可通过在carla安装目录下运行如下命令进行测试

#第一个终端
cd PythonAPI/examples
python3 -m pip install -r requirements.txt
python3 generate_traffic.py  
#另外再打开一个终端
cd PythonAPI/examples
python3 dynamic_weather.py 

运行效果如图
在这里插入图片描述

自己编写Python脚本并运行,可以将.py置于和 carla/PythonAPI/examples 同级的文件夹下,如carla/PythonAPI/carla_projects

Carla机制简述

如下图所示,Carla主要分为Server与Client两个模块,Server端用来建立这个仿真世界,而Client端则是由用户控制,用来调整、变化这个仿真世界。
Server: Server端负责任何与仿真本身相关的事情:从3D渲染汽车、街道、建筑,传感器模型的构建,到物理计算等等。它就像一个造物主, 将整个世界建造出来,并且根据Client 的外来指令更新这个世界。它本身是基于UnrealEnigne做出的3D渲染。make launch启动carla窗口后点击运行按钮之后,Server端才启动成功。
Client: 如果server构造了整个世界,那么这个世界不同时刻到底该如何运转(比如天气是什么样,有多少辆车在跑,速度是多少)则是由Client端控制的。用户通过书写Python脚本(最新版本C++ 也可以)来向Server端输送指令指导世界的变化,Server根据用户的指令去执行。 另外,Client端也可以接受Server端的信息,譬如某个照相机拍到的路面图片。Client需要等Server端启动后再运行。
a

Carla Client 脚本

参考 carla/PythonAPI/examples 里的内容,Carla Client 脚本需添加如下内容引入Carla

#!/usr/bin/env python

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

用户通过Client载体与python API与仿真环境交互,所以我们第一步就是要创建Client,并且设置一个timeout时间防止连接时间过久。

client = carla.Client('127.0.0.1', 2000)
client.set_timeout(2.0)

其中2000是端口,2.0是秒数。

接下来我们就要通过这个构建的Client来获取仿真世界(World)。我们如果想让仿真世界有任何变化,都要对这个获取的world进行操作。

world = client.get_world()

这样加载的是默认地图。Carla官方提供了很多地图,可以通过在脚本中添加 print(client.get_available_maps()) 来查看。如要切换地图:

# 加载Town01
world = client.load_world('Town01')
# 重新加载当前地图
world = client.reload_world()

加载地图或者重新加载当前地图都会初始化当前Carla World对象。详细可参考Carla 地图
自己编辑carla地图需要使用RoadRunner软件

创立了世界之后,就要开始安放我们的主角——actor了。顾名思义,Actor意味演员,在仿真世界里则代表可以移动的物体,包括汽车,传感器(因为传感器要安在车身上)以及行人。完整流程的简单示例如下

# 拿到这个世界所有物体的蓝图
blueprint_library = world.get_blueprint_library()

# 从浩瀚如海的蓝图中找到奥迪的蓝图
ego_vehicle_bp = blueprint_library.find('vehicle.audi.a2')
# 随机选一个是这样
# ego_vehicle_bp = random.choice(blueprint_library.filter('vehicle.*.*'))
# 找到所有可以作为初始点的位置并随机选择一个
transform = random.choice(world.get_map().get_spawn_points())
# 在这个位置生成汽车
ego_vehicle = world.spawn_actor(ego_vehicle_bp, transform)

# 再给它挪挪窝
location = ego_vehicle.get_location()
location.x += 10.0
ego_vehicle.set_location(location)
# 把它设置成自动驾驶模式
ego_vehicle.set_autopilot(True)
# 我们可以甚至在中途将这辆车“冻住”,通过抹杀它的物理仿真
# actor.set_simulate_physics(False)

Sensors搭建

与汽车类似,我们先创建蓝图,再定义位置,设置传感器参数,然后再选择我们想要的汽车安装上去。不过,这里的位置都是相对汽车中心点的位置(以米计量)。我们还要对传感器定义它的callback function,定义每次仿真世界里传感器数据传回来后,我们要对它进行什么样的处理。
我添加了Lidar、IMU、GNSS传感器

# 雷达
# 创建蓝图
lidar_bp = blueprint_library.find('sensor.lidar.ray_cast')
# 设置传感器参数
lidar_bp.set_attribute('channels', str(32))
lidar_bp.set_attribute('points_per_second', str(90000))
lidar_bp.set_attribute('rotation_frequency', str(40))
lidar_bp.set_attribute('range', str(20))

output_path = "/home/sydl/carlaData/"
# 相对位置
lidar_location = carla.Location(0, 0, 2)
lidar_rotation = carla.Rotation(0, 0, 0)
lidar_transform = carla.Transform(lidar_location, lidar_rotation)
# 选择我们想要的汽车安装上去
lidar = world.spawn_actor(lidar_bp, lidar_transform, attach_to=ego_vehicle)
# 定义回调函数
lidar.listen(lambda point_cloud: point_cloud.save_to_disk(os.path.join(output_path, '%06d.ply' % point_cloud.frame)))

# IMU
IMU_bp = blueprint_library.find('sensor.other.imu')

IMU_location = carla.Location(0, 0, 1)
IMU_rotation = carla.Rotation(0, 0, 0)
IMU_transform = carla.Transform(IMU_location, IMU_rotation)
IMU = world.spawn_actor(IMU_bp, IMU_transform, attach_to=ego_vehicle)
IMU.listen(lambda IMUData : print(IMUData))

# GNSS
GNSS_bp = blueprint_library.find('sensor.other.gnss')

GNSS_location = carla.Location(0, 0, 1.5)
GNSS_rotation = carla.Rotation(0, 0, 0)
GNSS_transform = carla.Transform(GNSS_location, GNSS_rotation)
GNSS = world.spawn_actor(GNSS_bp, GNSS_transform, attach_to=ego_vehicle)
GNSS.listen(lambda GNSSData : print(GNSSData))

Carla可以设置很多传感器,可参考官方文档或者CARLA传感器详细文档介绍+python实例(持续更新ing)

当我们去观察仿真界面时,我们会发现,自己的视野并不会随我们造的小车子移动,所以经常会跟丢它。解决这个问题的办法就是把spectator对准汽车,这样小汽车就永远在我们的视野里了。

while True:
    # set the sectator to follow the ego vehicle
    spectator = world.get_spectator()
    transform = ego_vehicle.get_transform()
    spectator.set_transform(carla.Transform(transform.location + carla.Location(z=20), carla.Rotation(pitch=-90)))

运行效果如图
在这里插入图片描述

Carla ros bridge

参考官方文档
[carla入门教程]-5 使用ROS与carla通信

Github 源码编译安装与使用

mkdir -p ~/carla-ros-bridge/catkin_ws/src
cd ~/carla-ros-bridge
git clone --recurse-submodules https://github.com/carla-simulator/ros-bridge.git catkin_ws/src/ros-bridge
cd catkin_ws
rosdep update
rosdep install --from-paths src --ignore-src -r
catkin build

修改~/.bashrc,在最后一行添加

source ~/carla-ros-bridge/catkin_ws/devel/setup.bash

这样每次启动终端即完成ros初始化,比较方便

启动carla ros bridge。carla ros bridge也是一个carla client,所以运行前应确保carla server运行。

#roslaunch carla_ros_bridge carla_ros_bridge.launch
roslaunch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch

第二个选择会启动一个新窗口,我们可以手动操控车辆。如图所示:
在这里插入图片描述
按H打开帮助界面,按B切换手动操作模式,wasd或者上下左右方向键都可以控制运动,w/上方向键 加油门,s/下方向键 刹车,q切换前进挡、倒挡。

在这里插入图片描述
第一次运行carla ros bridge时可能会因为缺少依赖报错,典型报错如下:
在这里插入图片描述
需要关注红字上方部分 ,比如这里的

ModuleNotFoundError: No module named 'carla'

这是由于 ~/.bashrc 中没有添加如下内容导致的,或者是make PythonAPI 的Python版本和ros使用的不对应

export CARLA_ROOT=~/Append/carla
export PYTHONPATH=$PYTHONPATH:$CARLA_ROOT/PythonAPI/carla/dist/carla-0.9.13-py3.8-linux-x86_64.egg:$CARLA_ROOT/PythonAPI/carla

如果是别的模块没找到,安装对应的包即可。

如下启动 carla ros bridge 时,创建的小车会包含carla支持的全部传感器,并将传感器数据发送到对应的 ros topic 中。对于车辆的控制也有相应的话题。

roslaunch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch

在这里插入图片描述
tf_tree如下
在这里插入图片描述 常用的传感器信息话题和消息类型如下:

传感器话题消息类型
GNSS(GPS)/carla/ego_vehicle/gnsssensor_msgs/NavSatFix
IMU/carla/ego_vehicle/imusensor_msgs/Imu
LIDAR/carla/ego_vehicle/lidarsensor_msgs/PointCloud2
camera/carla/ego_vehicle/rgb_front/imagesensor_msgs/Image

传感器、车辆等的信息可以在如下路径的文件中进行修改和配置。

~/carla-ros-bridge/catkin_ws/src/ros-bridge/carla_spawn_objects/config/objects.json

激光雷达,可以看到是32线的
在这里插入图片描述
GNSS和IMU
在这里插入图片描述

这样我们就可以在ros里使用这些信息了,比如跑一下Fast-Lio-SAM

在这里插入图片描述
carla ros bridge中车辆控制话题是 /carla/ego_vehicle/vehicle_control_cmd ,消息类型是carla_msgs/CarlaEgoVehicleControl。carla ros bridge提供了carla_twist_to_control包,可以将ros里的geometry_msgs/Twist 类型消息转为 carla_msgs/CarlaEgoVehicleControl 类型消息。carla_twist_to_control订阅的geometry_msgs/Twist 类型消息由 /carla/ego_vehicle/twist 话题给出,carla_msgs/CarlaEgoVehicleControl 类型消息发布到 /carla/ego_vehicle/vehicle_control_cmd 话题。不过这个节点不容易实现严格的定速巡航。

carla_twist_to_control 的启动:

roslaunch carla_twist_to_control carla_twist_to_control.launch

利用rqt工具我们可以向 /carla/ego_vehicle/twist 话题中发布消息,之后就可以看到车辆动起来了。
在这里插入图片描述

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值