1. 目的

默认情况下,Carla运行在异步模式下。服务器与客户端以各自的速度运行。当客户端请求到来时,服务器相应请求,处理结束之后继续运行,并不等待客户端处理完成服务器返回的数据。

存在的问题是,当保存相机传感器在Carla中获取的场景数据时,保存的数据有可能不连续,即缺帧。

在使用Carla获取训练数据时,设置Carla的同步模式很有必要。

When you want to start producing training data or deploying an agent within the simulation, it is advised that you use the synchronous mode since this will give you more control and predictability

2. 时间步长

在设置Carla同步模式前,需要先了解Carla中的时间步长。
在Carla中,定义时间步长为服务器状态变化需要的时间。时间步长分为可变时间步长与固定时间步长。
可变时间步长中,服务器每次状态变化所需要的时间都不固定。

#在代码中设置
settings = world.get_settings()
settings.fixed_delta_seconds = None # Set a variable time-step
world.apply_settings(settings)#使用.py文件设置
cd PythonAPI/util && python3 config.py --delta-seconds 0

固定时间步长中,服务器每次状态变化需要的时间都相同,如果服务器实际所需的时间小于用户设置的时间步长,那么服务器将进入等待。

#在代码中设置
settings = world.get_settings()
settings.fixed_delta_seconds = 0.05
world.apply_settings(settings)#使用.py文件设置
cd PythonAPI/util && python3 config.py --delta-seconds 0.05

设置固定时间步长为0.05,表示在1秒钟的时间内,服务器状态改变1/0.05=20次。

在同步模式下,Carla官方建议使用固定时间步长

Using the same time increment on each step is the best way to gather data from the simulation.

3.设置同步

Carla中,使用布尔值表示同步模式与异步模式,True表示同步模式,False表示异步模式。

settings = world.get_settings()
settings.synchronous_mode = True # 同步模式
settings.fixed_delta_seconds = 0.05 # 固定时间步长
world.apply_settings(settings)

设置异步模式只需要修改布尔值为False

#在代码中设置
settings = world.get_settings()
settings.synchronous_mode = False# Enables synchronous mode
settings.fixed_delta_seconds = None # 可变时间步长
world.apply_settings(settings)#使用.py文件设置
cd PythonAPI/util && python3 config.py --no-sync # Disables synchronous mode

需要注意的是,无法通过上述.py文件将Carla设置为同步模式。
虽然Carla服务器可以连接多个客户端,但在连接的客户端中,只能有一个客户端设置Carla为同步模式。

4. 完整代码

代码来自 小飞自动驾驶系列分享[四]

import glob
import os
import sys
import random
import os
from queue import Queue
from queue import Empty
import numpy as nptry: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:passimport carladef sensor_callback(sensor_data, sensor_queue, sensor_name):if 'lidar' in sensor_name:sensor_data.save_to_disk(os.path.join('../outputs/output_synchronized', '%06d.ply' % sensor_data.frame))if 'camera' in sensor_name:sensor_data.save_to_disk(os.path.join('../outputs/output_synchronized', '%06d.png' % sensor_data.frame))sensor_queue.put((sensor_data.frame, sensor_name))def main():actor_list = []sensor_list = []try:# 连接Carla服务器client = carla.Client('localhost', 2000)client.set_timeout(10.0)world = client.get_world()blueprint_library = world.get_blueprint_library()# 设置同步模式original_settings = world.get_settings()settings = world.get_settings()settings.fixed_delta_seconds = 0.05settings.synchronous_mode = Trueworld.apply_settings(settings)traffic_manager = client.get_trafficmanager()traffic_manager.set_synchronous_mode(True)sensor_queue = Queue()# 创建车辆ego_vehicle_bp = blueprint_library.find('vehicle.mercedes-benz.coupe')ego_vehicle_bp.set_attribute('color', '0, 0, 0')transform = random.choice(world.get_map().get_spawn_points())ego_vehicle = world.spawn_actor(ego_vehicle_bp, transform)ego_vehicle.set_autopilot(True)actor_list.append(ego_vehicle)# 指定传感器数据的保存目录output_path = '../outputs/output_synchronized'if not os.path.exists(output_path):os.makedirs(output_path)# 创建相机传感器camera_bp = blueprint_library.find('sensor.camera.rgb')camera_transform = carla.Transform(carla.Location(x=1.5, z=2.4))camera = world.spawn_actor(camera_bp, camera_transform, attach_to=ego_vehicle)# 注册回调函数camera.listen(lambda image: sensor_callback(image, sensor_queue, "camera"))sensor_list.append(camera)# 创建LiDAR传感器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))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: sensor_callback(point_cloud, sensor_queue, "lidar"))sensor_list.append(lidar)while True:world.tick()# 使用queue.get()函数,在数据处理完成之前,阻止程序的推进try:for i in range(0, len(sensor_list)):s_frame = sensor_queue.get(True, 1.0)print("    Frame: %d   Sensor: %s" % (s_frame[0], s_frame[1]))except Empty:print("   Some of the sensor information is missed")finally:# 恢复异步模式,否则退出之后Carla将卡死world.apply_settings(original_settings)print('destroying actors')client.apply_batch([carla.command.DestroyActor(x) for x in actor_list])for sensor in sensor_list:sensor.destroy()for actor in actor_list:actor.destroy()print('done.')if __name__ == '__main__':try:main()except KeyboardInterrupt:print(' - Exited by user.')

参考:

Carla官方文档
小飞自动驾驶系列分享
史上最全Carla教程 |(四)同步模式

Carla设置同步模式相关推荐

  1. 解决Carla同步模式下Runtime Error的问题(tick hangs)

    解决Carla同步模式下Runtime Error的问题(RuntimeError: time-out of 10000ms while waiting for the simulator, make ...

  2. 三菱伺服定长追剪,系统为Q172DSCPU,高级同步模式。 包含一个程序例子,有详细的机械参数分析,伺服参数设置

    三菱伺服定长追剪,系统为Q172DSCPU,高级同步模式. 包含一个程序例子,有详细的机械参数分析,伺服参数设置,以及追剪凸轮表设置的由来. ID:69100609575345770个人资料窝

  3. 以太坊Geth几种同步模式

    链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 以太坊Geth几种同步模式 同步模式分类 –fast Enable fast syncing through s ...

  4. mysql 半同步关闭_MySQL的半同步模式配置

    1.什么是半同步? 在有一台主服务器.多台从服务器的情况下,主服务器只会等待一台从服务器同步数据. 2.为什么要使用半同步? 在使用同步模式时,数据的写速度太慢. 在使用异步模式时,可能会造成从服务器 ...

  5. MFC win32 API串口同步模式代码示范

    win32 API串口同步模式代码示范 源文件下载: vs2015打开 文件名: MFC_Win32API_同步串口.rar 在OnInitDialog()位置初始化串口: handleFile1 = ...

  6. [译]C++中的内存同步模式(memory order)

    C++11 引入了一个有些晦涩的主题: 内存模型,不过一般都只会在需要 Lock-Free 编程时才会遇到,这里翻译一篇相关文章,希望能够给有兴趣的朋友多些参考.原文在这里. 内存模型中的同步模式(m ...

  7. 三菱伺服定长追剪,系统为Q172DSCPU,高级同步模式

    三菱伺服定长追剪,系统为Q172DSCPU,高级同步模式. 包含一个程序例子,有详细的机械参数分析,伺服参数设置,以及追剪凸轮表设置的由来. YID:34100609575345770个人资料窝

  8. MySQL 主从同步模式

    目录 MySQL 主从同步模式 主从同步结构 结构类型 配置一主多从结构 拓扑结构 配置从服务器 测试一主多从的配置 配置主从从结构 拓扑结构 配置主服务器 配置从服务器 测试配置 配置主主结构 拓扑 ...

  9. C#.多线程 (一)多线程(异步模式)与单线程(同步模式)的应用与区别 举例

    先看网上百度的几张图片: 什么是单线程?单线程工作模式也成为同步模式.其就是在一定状态下只能做一件事情,比如我在18:00-18:30时间段可以做饭. 什么是多线程?多线程工作模式也成为异步模式.其就 ...

最新文章

  1. AI算力需求6年增长30万倍,「超异构计算」才能满足下一个10年
  2. html三个div相同高度,如何使用jquery保持多个div的高度相同?
  3. shell 流程控制语句
  4. Android开发工具GenyMotion安装和使用方法
  5. 第三次Python作业———林东
  6. 我凭什么拿到了阿里、腾讯、今日头条3家大厂offer?这原因我服了
  7. linux语音识别_linux语音识别 arm_linux 语音识别引擎 - 云+社区 - 腾讯云
  8. ProcExp的利用
  9. 机器人学习参考书籍目录整理
  10. vim复制转帖格式错乱
  11. C++随机生成中文名的实例
  12. Linux用户与内核空间交互—procfs
  13. Spring Cloud 工具集
  14. 技术、商业和创新的彼岸:“被折叠”的三星
  15. 2023款ThinkBook 14和15锐龙版区别对比评测选哪个好
  16. 计算机怎么打开隐藏的项目,展示win10系统怎么打开隐藏文件夹
  17. 题目:请写一段将正整数转化为四进制字符串的函数(十进制正整数转四进制字符串)
  18. 入手佳能24-70mm f/2.8L
  19. Android版本号和版本名对应关系
  20. 【Python 骚操作】使用 Gitbook + Typora 打造一个属于自己的电子书网站

热门文章

  1. Vivado 综合后工程
  2. WebApp微信集成登录
  3. Computer Vision: A Modern Approach - 计算机视觉书籍阅读笔记 -第四章 -线性滤波
  4. metalink 使用向导(整理点metalink使用资料)
  5. 社交时代的孤独:保持联系却依旧寂寞
  6. 004、利用 百度AI 语音技术,把语音转文本
  7. 吾爱破解java游戏下载_JAVA 猜数字游戏
  8. 论文学习记录20200605:隐私保护神经网络推理[USENIX2020]
  9. Java实现经典算法
  10. linux网络电话代码,即使拨打至电话号码,Skype 翻译功能仍然可以使用啊