官网:https://carla.readthedocs.io/projects/ros-bridge/en/latest/carla_spawn_objects/
carla_spawn_objects
包用于生成角色(车辆、传感器、步行者)并将传感器附加到它们。调用 carla_ros_bridge
生成物体的service
完成,实际使用时,需要在 config
中参考给定的 json
文件新建自己的车辆和传感器配置,并创建对应的 launch
文件即可。
1. 配置和传感器设置
目标及其附加的传感器通过一个 .json
文件定义。该文件的默认位置在 carla_spawn_objects/config/objects.json
中。要使用其它文件可以通过在启动包时,通过私有 ROS
参数 objects_definition_file
传递文件的路径:
roslaunch carla_spawn_objects carla_spawn_objects.launch objects_definition_file:=path/to/objects.json
可以在 ros-bridge 仓库中找到一个例子,也可以按照下面的大纲创建你自己的配置和传感器设置:
{
"objects":
[
{
"type": "<SENSOR-TYPE>",
"id": "<NAME>",
"spawn_point": {"x": 0.0, "y": 0.0, "z": 0.0, "roll": 0.0, "pitch": 0.0, "yaw": 0.0},
<ADDITIONAL-SENSOR-ATTRIBUTES>
},
{
"type": "<VEHICLE-TYPE>",
"id": "<VEHICLE-NAME>",
"spawn_point": {"x": -11.1, "y": 138.5, "z": 0.2, "roll": 0.0, "pitch": 0.0, "yaw": -178.7},
"sensors":
[
<SENSORS-TO-ATTACH-TO-VEHICLE>
]
}
...
]
}
注意: 当定义坐标时,
ROS
使用的时右手坐标系。
所有传感器属性都按照蓝图库 蓝图库 中的描述定义。
- sensor_tick 参数
官方解释:Simulation seconds between sensor captures (ticks)
其倒数也就是传感器输出频率,实际使用时要注意结合 fixed_delta_seconds
使用,也就是仿真步长时间。仿真与真实的区别在于真实时间是连续的,而仿真时间是离散的,仿真器只会计算时隔 fixed_delta_seconds
的帧,也就是说,将 sersor_tick
设置为小于 fixed_delta_seconds
(传感器频率高于仿真器频率)是没有太大意义的,因为会导致仿真一步计算需要计算多帧该传感器数据,并且在同一时刻发出,用户也无法获取每个传感器数据的精确时间,如下图所示:
可以认为,fixed_delta_seconds
要小于你配置的所有传感器的 sersor_tick
,也就是仿真器频率要大于等于所有传感器频率才有意义,在上图的案例中,建议将 fixed_delta_seconds
设置为 0.01s,但是这样会导致计算量增加,而且由于目前 Python
版 ROS
有些 bug
,会导致计算更慢,此外,使用大量高频率传感器会让仿真器计算量大幅增加,尤其是图像传感器,因此实际使用时,sersor_tick
需要酌情而定,如果发现仿真器跑得太慢,可以考虑减少图像传感器或者降低其输出频率。
2. 生成车辆
如果没有指定生成车辆的位置,那么车辆位置将随机生成。要定义车辆的生成位置,有两个方法:
- 将所需的位置传递给
ROS
参数spawn_point_<VEHICLE-NAME>
,<VEHICLE-NAME>
将是你在.json
文件中给出的车辆id
。
roslaunch carla_spawn_objects carla_spawn_objects.launch \
spawn_point_<VEHICLE-NAME>:=x,y,z,roll,pitch,yaw
- 在
.json
文件中定义初始位置
{
"type": "vehicle.*",
"id": "ego_vehicle",
"spawn_point": {"x": -11.1, "y": 138.5, "z": 0.2, "roll": 0.0, "pitch": 0.0, "yaw": -178.7},
}
3. 再次生成车辆
通过发布到主题 /carla/<ROLE NAME>/<CONTROLLER_ID>/initialpose
,车辆可以在仿真过程中再次生成到不同的位置。要使用这个功能有以下两种方法:
- 将一个
actor.pseudo.control
pseudo-actor 附加到.json
文件中的车辆上。它的id
值应该与传递给用于发布到主题的<CONTROLLER_ID>
值相同:
{
"type": "vehicle.*",
"id": "ego_vehicle",
"sensors":
[
{
"type": "actor.pseudo.control",
"id": "control"
}
]
}
- 启动
set_inital_pose
节点,<CONTROLLER_ID>
将作为参数传递给ROS
参数controller_id
(默认= ‘control’):
roslaunch carla_spawn_objects set_initial_pose.launch controller_id:=<CONTROLLER_ID>
4. 生成传感器
-
传感器的初始位置应该直接在
.json
文件中定义,如上所示用于车辆。 -
附着在车辆上的传感器的位置被认为是相对于车辆的。
传感器可以生成在现有的车辆上,可以使用下面的方法:
- 在
.json
中定义一个假的传感器sensor.pseudo.actor_list
,这将使我们能够访问已经存在的角色对象。
...
{
"type": "sensor.pseudo.actor_list",
"id": "actor_list"
},
- 定义其它需要的传感器
- 将
spawn_sensors_only
参数设置为True
并启动节点 。这将检查是否有一个与.json
文件中指定的id
和类型相同的actor
已经激活,如果有,则将传感器附加到这个actor
上。
roslaunch carla_spawn_objects carla_spawn_objects.launch spawn_sensors_only:=True