ubuntu18和20都可以很好的运行。不过配置需要注意一些问题罢了,我个人比较习惯20,所以就主要从ubuntu20来说。
首先听说是最好自己使用一个新的python环境来用,那就先去下载anaconda,直接去清华源下载快一些:
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D
现在最新的版本即可
然后再下载release版本的carla
官网下载还是比较慢,去镜像下载:https://mirrors.sustech.edu.cn/help/carla.html
下载预编译版本即可。
下载的时候不要忘了下载额外的地图包AdditionalMaps_0.9.14.tar.gz
carla是可以在ubuntu20和18上使用的,但是环境不尽相同,推荐18版本使用python2.7,20版本使用python3.7。经过几天努力,终于是搞清楚了各方面的环境配置了。
额外安装的依赖内容:
先创建一个虚拟环境的conda,官方提供了2.7和3.7的东西。
conda create -n py37 python==3.7
conda activate py37
sudo apt install python3-pip
# For Python 3
pip3 install --upgrade pip
# For Python 2
pip install --upgrade pip
pip install --user pygame numpy &&
pip3 install --user pygame numpy
pip3 install carla
sudo apt-get install -y libgeographic-dev
#安装依赖库
pip3 install carla
pip3 install pygame
pip3 install numpy
pip3 install networkx
pip3 install distro
pip3 install Shapely
把地图文件复制到这个文件夹中。然后去运行自动脚本:
./ImportAssets.sh
然后安装whl,在这个文件夹下面
我们使用的是python3.7的话:
pip3 install <wheel-file-name>.whl
然后就可以运行了:
cd /opt/carla-simulator/bin/
./CarlaUE4.sh
运行一些example时应该先下载一些依赖:
cd PythonAPI/examples
python3 -m pip install -r requirements.txt
安装测试:
启动carla(低渲染),对gpu占用大幅减少(40%左右):
./CarlaUE4.sh -prefernvidia -quality-level=Low -RenderOffScreen
启动bridge
roslaunch carla_ros_bridge carla_ros_bridge.launch
启动物体布置
roslaunch carla_spawn_objects carla_spawn_objects.launch
启动控制模块
roslaunch carla_manual_control carla_manual_control.launch
服务器(主机)运行carla,笔记本运行ros-bridge:
./CarlaUE4.sh -carla-rpc-port=2000 -RenderOffScreen -graphicsadaper=1
./CarlaUE4.sh -prefernvidia -quality-level=Low -RenderOffScreen
本地运行:
python3 manual_control.py --host xx.xx.xx.xx -p 2000
官方文档:
https://carla.readthedocs.io/en/latest/
https://www.carla.org.cn/#/
https://carla.readthedocs.io/projects/ros-bridge/en/stable/
https://carla-scenariorunner.readthedocs.io/en/latest/
carla的接口信息:
carla_ros_bridge 功能包是运行基本 ROS 桥接功能所需的主要功能包。
这个包封装了操作 Carla 服务端的 API,使用户不用关心 Server 层的东西,直接通过其提供的几个ROS service 创建车辆、传感器、路灯等等各种 objects ,并对其进行了管理,同时将各类传感器数据从 Carla 格式转化为 ROS 消息 publish 出去。
发布的内容
Publications
* /carla/actor_list [carla_msgs/CarlaActorList]
* /carla/ego_vehicle/collision [carla_msgs/CarlaCollisionEvent] # 本车碰撞信息
* /carla/ego_vehicle/depth_front/camera_info [sensor_msgs/CameraInfo]
* /carla/ego_vehicle/depth_front/image [sensor_msgs/Image]
* /carla/ego_vehicle/dvs_front/camera_info [sensor_msgs/CameraInfo]
* /carla/ego_vehicle/dvs_front/events [sensor_msgs/PointCloud2]
* /carla/ego_vehicle/dvs_front/image [sensor_msgs/Image]
* /carla/ego_vehicle/gnss [sensor_msgs/NavSatFix] # GPS信息
* /carla/ego_vehicle/imu [sensor_msgs/Imu] # IMU信息
* /carla/ego_vehicle/lane_invasion [carla_msgs/CarlaLaneInvasionEvent]
* /carla/ego_vehicle/lidar [sensor_msgs/PointCloud2] # 激光雷达点云数据
* /carla/ego_vehicle/objects [derived_object_msgs/ObjectArray]
* /carla/ego_vehicle/odometry [nav_msgs/Odometry] # 里程话题包含,定位信息,速度信息;
* /carla/ego_vehicle/radar_front [sensor_msgs/PointCloud2]
* /carla/ego_vehicle/rgb_front/camera_info [sensor_msgs/CameraInfo]
* /carla/ego_vehicle/rgb_front/image [sensor_msgs/Image]
* /carla/ego_vehicle/rgb_view/camera_info [sensor_msgs/CameraInfo]
* /carla/ego_vehicle/rgb_view/image [sensor_msgs/Image] # 第三视角图像信息
* /carla/ego_vehicle/semantic_lidar [sensor_msgs/PointCloud2]
* /carla/ego_vehicle/semantic_segmentation_front/camera_info [sensor_msgs/CameraInfo]
* /carla/ego_vehicle/semantic_segmentation_front/image [sensor_msgs/Image]
* /carla/ego_vehicle/speedometer [std_msgs/Float32]
* /carla/ego_vehicle/vehicle_info [carla_msgs/CarlaEgoVehicleInfo]
* /carla/ego_vehicle/vehicle_status [carla_msgs/CarlaEgoVehicleStatus]
* /carla/map [std_msgs/String]
* /carla/markers [visualization_msgs/MarkerArray] # 场景物体的marker(默认只有本车和其它可运动车辆)
* /carla/markers/static [visualization_msgs/MarkerArray]
* /carla/objects [derived_object_msgs/ObjectArray]
* /carla/status [carla_msgs/CarlaStatus]
* /carla/traffic_lights/info [carla_msgs/CarlaTrafficLightInfoList]
* /carla/traffic_lights/status [carla_msgs/CarlaTrafficLightStatusList]
* /carla/world_info [carla_msgs/CarlaWorldInfo]
* /clock [rosgraph_msgs/Clock]
* /rosout [rosgraph_msgs/Log]
* /tf [tf2_msgs/TFMessage] # 本车ego_vehicle与map,已经本车传感器的tf关系;
接受的内容
Subscriptions
* /carla/control [carla_msgs/CarlaControl]
* /carla/debug_marker [visualization_msgs/MarkerArray] # 可将marker显示到carla环境中;
* /carla/ego_vehicle/control/set_target_velocity [geometry_msgs/Twist] # 控制ego_vehicle按照此速度运动(不受运动学约束)
* /carla/ego_vehicle/control/set_transform [unknown type]
* /carla/ego_vehicle/enable_autopilot [std_msgs/Bool] # 使能自动驾驶(时能后,本车漫无目的运动,会避免碰撞并遵守交通规则)
* /carla/ego_vehicle/rgb_view/control/set_target_velocity [unknown type]
* /carla/ego_vehicle/rgb_view/control/set_transform [unknown type]
* /carla/ego_vehicle/vehicle_control_cmd [carla_msgs/CarlaEgoVehicleControl] # 非手动模式的控制量(油门\刹车\方向盘)
* /carla/ego_vehicle/vehicle_control_cmd_manual [carla_msgs/CarlaEgoVehicleControl] # 手动控制量
* /carla/ego_vehicle/vehicle_control_manual_override [std_msgs/Bool] # 是否启用手动控制
* /carla/weather_control [unknown type] # 场景天气
* /clock [rosgraph_msgs/Clock]
服务接受内容:
Services
* /carla/destroy_object
* /carla/get_blueprints
* /carla/spawn_object
* /carla_ros_bridge/get_loggers
* /carla_ros_bridge/set_logger_level
规控接口:
1.carla_ackerman_control
订阅
/carla/ego_vehicle/vehicle_info;
/carla/ego_vehicle/vehicle_status;
发布
/carla/ego_vehicle/vehicle_control_cmd;
内部原理
该模块根据ackerman指令,生成控制车辆底盘的油门\刹车\档位\手刹等量;
方向盘控制
output.steer = target.streering_angle/max_steering_angle;(归一化)
输出的方向盘控制量为归一化的值;
停车与档位控制
(1) 若 current_speed_abs < 0.1: (在低速下执行换挡与手刹动作)
if target_speed_abs < 0.001: 手刹;
else if target_speed > 0: D档;
else : R档位;
(2) 当实际车速与目标车速正负相反时:设定参考车速为0(通过控制回路执行减速);
速度控制回路
若ackerman指令有加速度,则直接利用此加速度信息作为输出:acc_target = acc_from_ackerman;
否则,执行速度调节:
acc_delta = PID(reference_speed, current_speed);
acc_target = acc_target + acc_delta;
加速度控制回路
根据目标加速度和实际加速度的差值,通过PID调节,计算出油门刹车开度值的增量;
pedal_delta = PID(acc_target, acc_feedback);
pedal_target = pedal_target + pedal_delta;
底盘控制量生成
将开度值分成了三个等级:油门踏板输出,油门与刹车都不输出,刹车踏板输出;
若 pedal_target > throttle_lower_border:
throttle = pedal_target - throttle_lower_border;
brake = 0.0;
若 brake_upper_border <= pedal_target <= throttle_lower_border:
throttle = 0.0;
brake = 0.0;
若 pedal_target < brake_upper_border:
throttle = 0.0;
brake = brake_upper_border - pedal_target;
2.carla_ad_agent
在此ros包中有两个节点:
carla_ad_agent,根据红绿灯控制车辆的目标速度;
local_planner,生成控制车辆运动的底盘指令;
3.local_planner
在参考路径上选择前瞻点,根据前瞻点与实际位置做横纵向的运动控制;
寻找前瞻点
在参考路径上寻找车前s=current_speed*look_ahead_time处的路径点goal_waypoint;
4.横纵向运动控制
纵向控制:控制车辆速度
根据车辆目标速度和实际速度,生成油门刹车开度值;
pedal_target = PID(target_speed, current_speed);
横向控制:控制方向盘转角
根据车辆朝向与前瞻点夹角的角度差值,调节方向盘转角输出值;
v_vec = [ cos(current_yaw), sin(current_yaw) ];
w_vec = [ goal_waypoint.x - current_x, goal_waypoint.y - current_y ];
theta_error = acos(v_vec, w_vec) * sign(v_vec X w_vec );
steering_target = PID(theta_error);
fist-time:运行carla-ros-bridge:
roslaunch carla_ros_bridge carla_ros_bridge.launch
roslaunch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch
这两个不能同时启动哦。
这两个是典型的例子,所以先从这两个文件入手,第一个是配置carla的参数使用的,里面的内容为:
<!-- -->
<launch>
<!-- global parameter to set CARLA as time source -->
<param name="use_sim_time" value="True"/>
<!-- the network connection for the python connection to CARLA -->
<arg name='host' default='localhost'/>
<arg name='port' default='2000'/>
<arg name='timeout' default='2'/>
<!--
enable/disable synchronous mode. If enabled ros-bridge waits until
expected data is received for all sensors
-->
<arg name="passive" default='False'/>
<arg name='synchronous_mode' default='True'/>
<arg name='synchronous_mode_wait_for_vehicle_control_command' default='False'/>
<!-- set the fixed timestep length -->
<arg name='fixed_delta_seconds' default='0.05'/>
<arg name='town' default='Town01'/>
<!-- enable/disable the registration of all sensors. If disabled, only sensors
spawned by the bridge are registered -->
<arg name='register_all_sensors' default='True'/>
<!--
the role name of the vehicles that acts as ego vehicle for this ros bridge instance
Only the vehicles within this list are controllable from within ROS.
(the vehicle from CARLA is selected which has the attribute 'role_name' set to this value)
-->
<arg name='ego_vehicle_role_name' default='["hero", "ego_vehicle", "hero0", "hero1", "hero2", "hero3", "hero4", "hero5", "hero6", "hero7", "hero8", "hero9"]'/>
<node pkg="carla_ros_bridge" name="carla_ros_bridge" type="bridge.py" output="screen" required="true">
<param name="host" value="$(arg host)" unless="$(eval host == '')"/>
<param name="port" value="$(arg port)" unless="$(eval port == '')"/>
<param name="timeout" value="$(arg timeout)" unless="$(eval timeout == '')"/>
<param name="passive" value="$(arg passive)"/>
<param name="synchronous_mode" value="$(arg synchronous_mode)"/>
<param name="synchronous_mode_wait_for_vehicle_control_command" value="$(arg synchronous_mode_wait_for_vehicle_control_command)"/>
<param name="fixed_delta_seconds" value="$(arg fixed_delta_seconds)"/>
<param name="register_all_sensors" value="$(arg register_all_sensors)"/>
<param name="town" value="$(arg town)"/>
<param name="ego_vehicle_role_name" value="$(arg ego_vehicle_role_name)"/>
</node>
</launch>
1.use_sim_time:这应该被设置为 True ,以确保 ROS 使用的是 CARLA 仿真时间而不是系统时间。这个参数将使 ROS 的 /clock topic 与 CARLA 的仿真时间同步;
2.host and port: 使用 Python 客户端连接到 CARLA 的网络设置;
3.timeout:等待与服务器成功连接的时间;
4.passive:passive 模式用于同步模式。当启用时, ROS Bridge 接将处于次要地位,必须有另一个客户端与世界联系。 ROS Bridge 将等待所有传感器接收所有预期数据;
5.town:既可以使用 CARLA 地图 (eg. ‘town01’) 或者 OpenDRIVE 格式地图文件 (ending in .xodr);
6.ego_vehicle_role_name:用于识别主车辆的角色名称,相关的主题将被创建,以便这些车辆能够被 ROS 控制;
7.register_all_sensors :
false: 只注册 Bridge 产生的传感器
true (default):仿真中所有的传感器都会被注册
8.synchronous_mode:
如果为 false :数据发布在每个 world.on_tick() 和每个 sensor.listen() 回调上;
如果为 true (默认):ROS Bridge 等待下一个 tick 之前所有的传感器消息。这可能会降低整个模拟的速度,但可以确保结果的可重复性;
9.synchronous_mode_wait_for_vehicle_control_command :在同步模式下,暂停 tick,直到完成车辆控制;
10.fixed_delta_seconds :仿真步骤之间的仿真时间(增量秒)。它必须小于0.1。这个参数很重要,因为它会跟你设置的传感器频率关联,如果不能理解这个参数,后续传感器频率的配置以及传感器同步都会出问题。
车辆控制测试:
启动carla(低渲染),对gpu占用大幅减少(40%左右):
./CarlaUE4.sh -prefernvidia -quality-level=Low -RenderOffScreen
启动bridge
roslaunch carla_ros_bridge carla_ros_bridge.launch
启动物体布置
roslaunch carla_spawn_objects carla_spawn_objects.launch
启动控制模块
roslaunch carla_manual_control carla_manual_control.launch
参考:
Carla安装与使用及ros-bridge
ROS Bridge 笔记(02)— carla_ros_bridge 功能包(准备 ROS环境、运行 ROS Bridge、配置 CARLA 参数、同步模式下使用 ROS Bridge、主车辆控制)
Ubuntu20.04 Carla安装以及ros-bridge控制
【carla】ubuntu20.04 编译carla-ros-bridge 安装过程、报错及其解决方法
Conda虚拟环境下libp11-kit.so.0: undefined symbol: ffi_type_pointer…问题解决
源码安装的:
自动驾驶ros-carla规控算法设计+测试全记录[安装已完结,实验测试中]
我还是很想要在ubuntu18上使用python3.7的ros-bridge的:
Carla 0.9.13 与ROS bridge安装记录
CARLA-ROS联合仿真环境搭建
CARLA_autoware的配置流程(二)CARLA 与 ROS1 的联合
Carla基础 | Carla预编译版安装与ROS联合仿真图文教程
Ubuntu18.04安装carla0.9.9 & UE4.24踩坑版
Carla学习笔记(二)服务器跑carla,本地运行carla-ros-bridge并用rviz显示
windows也可以用这样的驾驶模拟
Carla自动驾驶仿真一:快速安装与运行Carla
我很喜欢这个表格的样式
这个插件比较好看:
最开始安装carla的参考:
ubuntu安装carla0.9.14打包版+编译版教程
问题排除部分:
1.ros原生python环境与conda环境的区别
ros自带的python一般比较固定,主要就是python2.7和python3.6
这个环境又和whl和egg有一些关系,carla额外需要的whl一般是通过pip直接下载到虚拟环境中去,然后我们需要再ros-bridge中声明carla的相关环境。
2.ros-bridge要再conda中还是原生环境中编译
原生环境即可
并且由于涉及rosdep,需要能够rosdep init不超时,所以就用小鱼的rosdepc即可(这个就好像是把依赖给提前准备好了,然后通过rosdepc来安装就是了。)
wget http://fishros.com/install -O fishros && . fishros
3.编译通过了之后在conda中运行还是原生环境
conda环境
一般conda都是为了python3来的,所以肯定就是python3.7了,在这里面同样需要先去下载requirements.txt
pip install -r requirement.txt即可
可能还需要这些内容
pip install carla
pip install transforms3d
pip install pyyaml
pip install numpy
pip install opencv-python
pip install pygame
else:
需要再原生环境也要下载一些内容才行!!!,这个很奇怪,但是是必须的。
现在已知需要下载的内容包括:
pip install pygame PyYAML rospkg rospkg rospy catkin_tools transforms3d
遇到carla版本不对应,一般是CARLA_VERSION没有修改:
一般在这个位置去修改,修改成相应的版本即可
gedit /home/moresweet/ROS_WS/calar-ros-bridge/src/ros-bridge/carla_ros_bridge/src/carla_ros_bridge/CARLA_VERSION
到这基本上就没有什么运行的问题了,接下来就是使用carla进行算法开发了:
包括强化学习
联合仿真测试之:roadrunner carsim autoware等等