[carla] carla-ros-bridge 修改信号灯行为。

本教程适用于采用编译下载安装方式安装carla-ros-bridge 的用户。

1.修改信号灯

1.1 修改原理

我们要通过API过滤出所有绿灯的actor信息,然后修改他们的状态为常绿。

查阅API网站可知traffic_light具有set_state(self,state)方法
https://carla.readthedocs.io/en/latest/python_api/#carlatrafficlight

官网提供了一段代码,可以参考:

world = client.get_world()
spectator = world.get_spectator()

vehicle_bp = random.choice(world.get_blueprint_library().filter('vehicle.bmw.*'))
transform = random.choice(world.get_map().get_spawn_points())
vehicle = world.try_spawn_actor(vehicle_bp, transform)

# Wait for world to get the vehicle actor
world.tick()

world_snapshot = world.wait_for_tick()
actor_snapshot = world_snapshot.find(vehicle.id)

# Set spectator at given transform (vehicle transform)
spectator.set_transform(actor_snapshot.get_transform())
# ...# ...
if vehicle_actor.is_at_traffic_light():
    traffic_light = vehicle_actor.get_traffic_light()
    if traffic_light.get_state() == carla.TrafficLightState.Red:
       # world.hud.notification("Traffic light changed! Good to go!")
        traffic_light.set_state(carla.TrafficLightState.Green)

需要注意的是,set_state()只能暂时把灯变绿,之后灯还会变回来。所以为了实现信号灯一直是绿色,还需要锁住信号灯,采用.freeze(True).

参考这个方法:

freeze(self, freeze)
	Stops all the traffic lights in the scene at their current state.
		Parameters:
		freeze (bool)

1.2 具体代码

了解了上述原理,之后,下面就介绍如何修改代码。

首先定位到文件位置为:

carla-ros-bridge-0.9.12/catkin_ws/src/ros-bridge/carla_ros_bridge/src/carla_ros_bridge/bridge.py

在444行:

 carla_bridge.initialize_bridge(carla_client.get_world(), parameters)

之后,加入以下代码:

        # lbw add:turn off trafficLight
        carla_world = carla_client.get_world()
        actors=carla_world.get_actors()
        light_actor_list=actors.filter('*traffic_light*')
        carla_bridge.loginfo(">>>>>>>>>>>>>>>>light_actor number:{}".format(len(light_actor_list)))
        for light_actor in light_actor_list:
            light_actor.set_state(carla.TrafficLightState.Green)
            light_actor.freeze(True)
            carla_bridge.loginfo(light_actor)

截图:
在这里插入图片描述

修改保存后,重新catkin_make后运行

roslaunch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch  town:="town02" 

可以看到24个交通信号灯的打印的信息:

[INFO] [1670599386.103029, 0.000000]: >>>>>>>>>>>>>>>>light_actor number:24
[INFO] [1670599386.104971, 0.000000]: Created TrafficLight(id=531)
[INFO] [1670599386.106751, 0.000000]: Actor(id=551, type=traffic.traffic_light)
[INFO] [1670599386.109619, 0.000000]: Created TrafficLight(id=532)
[INFO] [1670599386.111681, 0.000000]: Actor(id=550, type=traffic.traffic_light)
[INFO] [1670599386.114241, 0.000000]: Created TrafficLight(id=533)
[INFO] [1670599386.116681, 0.000000]: Actor(id=549, type=traffic.traffic_light)
[INFO] [1670599386.121154, 0.000000]: Created TrafficLight(id=534)
略去一部分...

打印信号灯的状态:

rostopic echo /carla/traffic_lights/status

可以看到,所有灯的状态都变成了2。

---
traffic_lights: 
   id: 531
    state: 2
  - 
    id: 532
    state: 2
  - 
    id: 533
    state: 2
  - 
    id: 534
    state: 2
  - 

...略去一部分

可以看到,信号灯都已经是常绿了~~~
在这里插入图片描述

dwh@PC:~/carla-ros-bridge/catkin_ws$ catkin_make # 或 catkin build(若使用catkin_tools) Base path: /home/dwh/carla-ros-bridge/catkin_ws Source space: /home/dwh/carla-ros-bridge/catkin_ws/src Build space: /home/dwh/carla-ros-bridge/catkin_ws/build Devel space: /home/dwh/carla-ros-bridge/catkin_ws/devel Install space: /home/dwh/carla-ros-bridge/catkin_ws/install Multiple packages found with the same name "carla_ackermann_control": - ros-bridge/carla-ros-bridge/src/ros-bridge/carla_ackermann_control - ros-bridge/carla_ackermann_control Multiple packages found with the same name "carla_ackermann_msgs": - ros-bridge/carla-ros-bridge/src/ros-bridge/carla_ackermann_msgs - ros-bridge/carla_ackermann_msgs Multiple packages found with the same name "carla_ad_agent": - ros-bridge/carla-ros-bridge/src/ros-bridge/carla_ad_agent - ros-bridge/carla_ad_agent Multiple packages found with the same name "carla_ad_demo": - ros-bridge/carla-ros-bridge/src/ros-bridge/carla_ad_demo - ros-bridge/carla_ad_demo Multiple packages found with the same name "carla_common": - ros-bridge/carla-ros-bridge/src/ros-bridge/carla_common - ros-bridge/carla_common Multiple packages found with the same name "carla_manual_control": - ros-bridge/carla-ros-bridge/src/ros-bridge/carla_manual_control - ros-bridge/carla_manual_control Multiple packages found with the same name "carla_msgs": - ros-bridge/carla-ros-bridge/src/ros-bridge/carla_msgs - ros-bridge/carla_msgs Multiple packages found with the same name "carla_ros_bridge": - ros-bridge/carla-ros-bridge/src/ros-bridge/carla_ros_bridge - ros-bridge/carla_ros_bridge Multiple packages found with the same name "carla_ros_scenario_runner": - ros-bridge/carla-ros-bridge/src/ros-bridge/carla_ros_scenario_runner - ros-bridge/carla_ros_scenario_runner Multiple packages found with the same name "carla_ros_scenario_runner_types": - ros-bridge/carla-ros-bridge/src/ros-bridge/carla_ros_scenario_runner_types - ros-bridge/carla_ros_scenario_runner_types Multiple packages found with the same name "carla_spawn_objects": - ros-bridge/carla-ros-bridge/src/ros-bridge/carla_spawn_objects - ros-bridge/carla_spawn_objects Multiple packages found with the same name "carla_twist_to_control": - ros-bridge/carla-ros-bridge/src/ros-bridge/carla_twist_to_control - ros-bridge/carla_twist_to_control Multiple packages found with the same name "carla_walker_agent": - ros-bridge/carla-ros-bridge/src/ros-bridge/carla_walker_agent - ros-bridge/carla_walker_agent Multiple packages found with the same name "carla_waypoint_publisher": - ros-bridge/carla-ros-bridge/src/ros-bridge/carla_waypoint_publisher - ros-bridge/carla_waypoint_publisher Multiple packages found with the same name "carla_waypoint_types": - ros-bridge/carla-ros-bridge/src/ros-bridge/carla_waypoint_types - ros-bridge/carla_waypoint_types Multiple packages found with the same name "pcl_recorder": - ros-bridge/carla-ros-bridge/src/ros-bridge/pcl_recorder - ros-bridge/pcl_recorder Multiple packages found with the same name "ros_compatibility": - ros-bridge/carla-ros-bridge/src/ros-bridge/ros_compatibility - ros-bridge/ros_compatibility Multiple packages found with the same name "rqt_carla_control": - ros-bridge/carla-ros-bridge/src/ros-bridge/rqt_carla_control - ros-bridge/rqt_carla_control Multiple packages found with the same name "rviz_carla_plugin": - ros-bridge/carla-ros-bridge/src/ros-bridge/rviz_carla_plugin - ros-bridge/rviz_carla_plugin dwh@PC:~/carla-ros-bridge/catkin_ws$ source devel/setup.bash bash: devel/setup.bash: 没有那个文件或目录
03-19
<think>嗯,用户在使用catkin_make编译Carla ROS Bridge时遇到了多个同名包的问题,并且在编译后无法找到devel/setup.bash文件。首先,我需要分析这些同名包的原因。可能的情况是用户的工作空间中有重复的包路径,导致编译系统无法正确处理。例如,用户可能克隆了仓库到不同的目录,或者子模块嵌套导致路径重复。 接下来,用户执行source devel/setup.bash时提示文件不存在,这通常意味着编译没有成功完成,因此devel目录没有被正确生成。编译失败的原因很可能就是前面提到的重复包问题,导致catkin_make中途停止,从而没有生成必要的setup文件。 需要指导用户如何解决这些重复包的问题。首先应该检查工作空间中的src目录,查找是否有重复的包路径。例如,用户可能同时有ros-bridge/carla-ros-bridge/src/ros-bridge/...和ros-bridge/...这样的路径,这会导致catkin工具发现多个同名包,进而报错。 解决方法包括清理重复的包,可能通过移除重复的目录或调整工作空间的结构。另外,用户可能需要检查是否正确地克隆了子模块,或者是否有误操作导致包被复制到错误的位置。建议用户手动删除重复的包目录,然后重新运行catkin_make,确保编译过程顺利完成,从而生成devel/setup.bash文件。 此外,还需要提醒用户在编译成功后正确source环境变量,以确保ROS能够识别新编译的包。如果用户使用catkin build命令,可能需要使用不同的目录结构,但当前问题主要是重复包导致的编译失败,因此重点应放在解决路径冲突上。</think>在运行`catkin_make`时出现多个同名ROS包冲突的问题,这会导致编译失败。以下是逐步解决此问题的方法: --- ### **问题分析** 错误信息显示**同一工作空间(workspace)中存在多个同名ROS包**,例如: ``` Multiple packages found with the same name "carla_ackermann_control": - ros-bridge/carla-ros-bridge/src/ros-bridge/carla_ackermann_control - ros-bridge/carla_ackermann_control ``` 原因是工作空间的`src`目录中存在重复的包路径。这通常由以下原因导致: 1. **错误地克隆仓库**:可能重复克隆了Carla ROS Bridge的子模块。 2. **子模块嵌套问题**:`carla-ros-bridge`可能自身包含子模块,与其他手动克隆的包冲突。 --- ### **解决方案** #### **步骤1:清理重复的包** 进入工作空间的`src`目录,手动删除重复的包: ```bash cd ~/carla-ros-bridge/catkin_ws/src # 删除所有重复路径的包(根据错误提示选择保留一个) # 例如:保留 "ros-bridge/carla-ros-bridge/src/ros-bridge/carla_ackermann_control" # 删除 "ros-bridge/carla_ackermann_control" rm -rf ros-bridge/carla_ackermann_control rm -rf ros-bridge/carla_ackermann_msgs # 其他重复包同理 ``` #### **步骤2:确保子模块正确初始化** 如果使用了Git子模块,需重新初始化: ```bash cd ~/carla-ros-bridge/catkin_ws/src git submodule update --init --recursive ``` #### **步骤3:重新编译** 清理之前的编译缓存并重新编译: ```bash cd ~/carla-ros-bridge/catkin_ws catkin clean -y # 若使用catkin_tools catkin_make ``` #### **步骤4:Source环境变量** 编译成功后,`devel/setup.bash`会自动生成: ```bash source devel/setup.bash ``` --- ### **注意事项** 1. **路径规范**:确保`src`目录中的包路径唯一,避免嵌套或重复克隆。 2. **子模块管理**:若从Git仓库克隆,建议使用`git submodule`统一管理依赖。 3. **编译失败排查**:若编译仍失败,检查终端输出的具体错误信息(如依赖缺失)。 --- ### **补充说明** - **`catkin_make` vs `catkin build`**:若使用`catkin_tools`工具链,建议使用`catkin build`,它能更好地处理复杂包依赖。 - **工作空间结构**:标准ROS工作空间结构应确保所有包位于`src`目录下,且无重复名称。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值