Skip to content

Commit

Permalink
course (#26)
Browse files Browse the repository at this point in the history
* course

* course

* course

* coures

* course

* coure

* course

* course

* course

* course

* course

* course

* course

* course

* course

---------

Co-authored-by: zoudai <2184819232>
  • Loading branch information
jiandaoshou-aidehua authored Jul 10, 2024
1 parent 7b8b2fa commit e440f8f
Show file tree
Hide file tree
Showing 7 changed files with 453 additions and 100 deletions.
120 changes: 120 additions & 0 deletions docs/course/auto_signal_control.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
# 自动信号控制

这是一个基于Flask的应用程序,用于控制[Carla仿真环境](https://pan.baidu.com/s/15T1hGoWJ70tVmsTX7-zcSw?pwd=hutb)中的红绿灯。该应用程序通过检测路口的交通流量动态调整红绿灯的时长,以优化交通通行效率。

#### 主要功能

[应用程序](../../src/course/auto_signal_control.py)主要功能包括:

1. 获取指定路口的交通流量。
2. 根据交通流量动态调整红绿灯(绿灯)的时长。
3. 返回指定路口当前全部红绿灯的状态和时长信息。

#### 传入参数

- 无需传入参数,该应用程序自动检测指定路口的交通流量并调整红绿灯的时长。

#### 核心实现步骤

1. **初始化和连接Carla服务器**:获取世界对象并设置仿真参数。

```
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)
world = client.get_world()
```

2. **获取路口信息**:通过中心位置获取指定路口的交通信号灯信息。

为了保证每次请求不会往该路口的交通灯集合中新加重复的红绿灯,先用集合存储红绿灯的唯一ID

```
traffics_in_junction = set()
```

```
def get_traffic_lights_in_junction(world, junction):
"""获取路口的所有红绿灯"""
traffic_lights = world.get_actors().filter('traffic.traffic_light')
for traffic_light in traffic_lights:
if get_distance(traffic_light.get_location(), center_location[0]) <= 50:
id = traffic_light.get_opendrive_id()
traffics_in_junction.add(id)
```

```
def get_light(all_traffic_lights):
"""根据红绿灯ID列表获取对应的红绿灯对象"""
drive_list = list(traffics_in_junction)
traffic_lights = []
for traffic_light in all_traffic_lights:
if traffic_light.get_opendrive_id() in drive_list:
traffic_lights.append(traffic_light)
return traffic_lights
```

3. **计算交通流量**:检测指定范围内的车辆数量。

```
def get_vehicles_in_intersection(world, intersection_location, intersection_radius):
"""获取路口范围内的车辆数量"""
vehicles = world.get_actors().filter('vehicle.*')
vehicles_in_intersection = []
for vehicle in vehicles:
distance = get_distance(vehicle.get_location(), intersection_location)
if distance <= intersection_radius:
vehicles_in_intersection.append(vehicle)
return len(vehicles_in_intersection)
```

4. **调整红绿灯时长**:根据交通流量动态调整红绿灯的时长。

```
if junction_flow > 15:
for traffic_light in get_light(all_traffic_lights):
traffic_light.set_green_time(GREEN_TIME + 15)
last_green_time = GREEN_TIME + 15
elif junction_flow > 10:
for traffic_light in get_light(all_traffic_lights):
traffic_light.set_green_time(GREEN_TIME + 10)
last_green_time = GREEN_TIME + 10
elif junction_flow > 5:
for traffic_light in get_light(all_traffic_lights):
traffic_light.set_green_time(GREEN_TIME + 5)
last_green_time = GREEN_TIME + 5
else:
for traffic_light in get_light(all_traffic_lights):
traffic_light.set_green_time(GREEN_TIME)
last_green_time = GREEN_TIME
```

5. **返回结果**:返回当前红绿灯的状态和调整后的时长信息。

```
response_data = {
"traffic_lights": [
{"id": traffic_ids},
{"init_green_time": traffic_init_green_time},
{"last_green_time": last_green_time}
]
}
```

#### 使用步骤

获取路口交通灯信息,可以发送一个GET请求到 `/set_traffic_light`路由,应用程序会自动根据路口的交通流量调整红绿灯的时长并返回结果。

1. 打开Carla仿真环境
2. 先运行[generate_traffic.py](../../src/examples/generate_traffic.py)来生成交通
3. 运行脚本auto_signal_control.py来开启服务端
4. 发送http请求:

```
http://127.0.0.1:5000/set_traffic_light
```

通过这些步骤和说明,用户可以使用该应用程序动态调整Carla仿真环境中的红绿灯时长,以优化交通通行效率。
103 changes: 85 additions & 18 deletions docs/course/signal_control.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
# 智能信号控制
# 手动信号控制

该脚本用于在[CARLA仿真环境](https://pan.baidu.com/s/15T1hGoWJ70tVmsTX7-zcSw?pwd=hutb )中智能控制红绿灯信号。可以根据传入的参数设置特定红绿灯的颜色和持续时间。红绿灯的颜色设置包括绿灯、黄灯和红灯,分别对应颜色ID [1, 2, 3]。颜色持续时间以秒为单位。
这是一个用于控制红绿灯的Flask应用程序,通过[Carla仿真环境](https://pan.baidu.com/s/15T1hGoWJ70tVmsTX7-zcSw?pwd=hutb)实现。用户可以通过指定红绿灯的OpenDRIVE ID、颜色ID以及设置时长来控制红绿灯的状态。红绿灯的颜色设置包括绿灯、黄灯和红灯,分别对应颜色ID [1, 2, 3]。颜色持续时间以秒为单位。

#### 参数说明

[脚本](../../src/course/signal_control.py)接收以下参数:

1. `--host` (`-H`): CARLA服务器的IP地址,默认为`127.0.0.1`
2. `--port` (`-p`): CARLA服务器的TCP端口,默认为`2000`
3. `--traffic_id` (`-I`): 目标红绿灯的OpenDrive ID,默认为`-5`
4. `--color_id` (`-C`): 红绿灯颜色ID,对应绿灯、黄灯和红灯,分别为1、2和3,默认为`1`
5. `--color_time` (`-T`): 红绿灯颜色的持续时间,单位为秒,默认为`20`
1. `--traffic_id` (`-I`): 目标红绿灯的OpenDrive ID。
2. `--color_id` (`-C`): 红绿灯颜色ID,对应绿灯、黄灯和红灯,分别为1、2和3。
3. `--color_time` (`-T`): 红绿灯颜色的持续时间,单位为秒。

#### 参数格式

Expand All @@ -22,28 +20,97 @@
- 黄灯:`2`
- 红灯:`3`

#### 示例
#### 使用步骤

要设置红绿灯,可以发送一个GET请求到 `/set_traffic_light`

1. 打开Carla仿真环境
2. 运行脚本signal_control.py来开启服务端
3. 发送http请求:

```
python signal_control.py --traffic_id -5 --color_id 1 --color_time 30
http://127.0.0.1:5000/set_traffic_light?traffic_id=-5&color_id=3&color_time=30
```

以上命令设置OpenDrive ID为`-5`的红绿灯为绿灯,持续时间为`30`秒。
以上请求表示设置OpenDrive ID为`-5`的红绿灯的红灯的持续时间为`30`秒。

#### 脚本工作流程

1. 连接到CARLA服务器并获取世界对象。
2. 设置世界为同步模式,以确保红绿灯设置的应用。
3. 获取所有红绿灯的对象。
4. 根据传入的参数,设置指定红绿灯的颜色和持续时间。
5. 通过`world.tick()`应用红绿灯的设置。
6. 恢复世界设置为异步模式。
应用程序的主要功能是根据用户提供的参数设置指定红绿灯的颜色和持续时间。具体实现步骤如下:

1. 接收用户请求,并解析传入的参数。

2. 连接到Carla仿真服务器并获取当前世界对象。

```
client = carla.Client('localhost', 2000)
client.set_timeout(10.0) # 设置超时
world = client.get_world() # 获取世界对象
```

3. 查找指定的红绿灯对象,输出修改前的灯光时间。

```
for traffic_light in traffic_lights:
if float(traffic_light.get_opendrive_id()) == traffic_id:
if color_id == 1:
init_time = traffic_light.get_green_time()
elif color_id == 2:
init_time = traffic_light.get_yellow_time()
elif color_id == 3:
init_time = traffic_light.get_red_time()
```

4. 跳转视角到该红绿灯合适的位置。

```
lights_setting = [
[-6, carla.Transform(carla.Location(x=-220, y=-9, z=5), carla.Rotation(yaw=180))],
[-5, carla.Transform(carla.Location(x=-260, y=35, z=5), carla.Rotation(yaw=-90))]
]
```

```
spectator = world.get_spectator()
for setting in lights_setting:
if setting[0] == traffic_id:
spectator.set_transform(setting[1])
break
```

5. 根据颜色ID设置红绿灯的持续时间。

```
for traffic_light in traffic_lights:
if float(traffic_light.get_opendrive_id()) == traffic_id:
if color_id == 1:
traffic_light.set_green_time(float(color_time))
color_name = "绿色"
elif color_id == 2:
traffic_light.set_yellow_time(float(color_time))
color_name = "黄色"
elif color_id == 3:
traffic_light.set_red_time(float(color_time))
color_name = "红色"
```

6. 返回设置结果的JSON响应。

```
response_data = {
"id": traffic_id,
"color": color_name,
"init_time": init_time,
"last_time": color_time
}
```

#### 注意事项

- 在执行脚本前,请确保CARLA服务器已启动。
- 脚本中的默认参数适用于一般情况,可根据需要进行调整
- 若需要添加更多的红绿灯配置,可在`lights_setting`列表中添加相应的项
- 发送请求时,需要传入对应的参数值
- settings.no_rendering_mode = False 不能重复设置,否则即使修改红绿灯时长也不会有效果

#### 运行结果

Expand Down
4 changes: 2 additions & 2 deletions docs/course/traffic_indicators.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# 路口评价指标分析计算(HutbCarlaCity)

​ 为支持 [**湖工商场景**](https://pan.baidu.com/s/15T1hGoWJ70tVmsTX7-zcSw?pwd=hutb ) **(WindowsNoEditor)** 高保正的十字路口三维建模,设计 **[traffic_indicators.py](../../src/course/traffic%20indicators.py)** 脚本对路口交通流量、路口车均延误、路口饱和、排队长度四种路口真实性评价指标分析。
​ 为支持 [**湖工商场景**](https://pan.baidu.com/s/15T1hGoWJ70tVmsTX7-zcSw?pwd=hutb ) **(WindowsNoEditor)** 高保正的十字路口三维建模,设计 **[traffic_indicators.py](../../src/course/traffic_indicators.py)** 脚本对路口交通流量、路口车均延误、路口饱和、排队长度四种路口真实性评价指标分析。

**首先需要对场景中添加车辆,运行[generate_traffic.py](../../src/examples/generate_traffic.py)脚本,生成足够的车辆**

**首先需要对场景中添加车辆,运行[generate_traffic.py](../../src/examples/generate_traffic.py)脚本,生成足够的车辆**


## 定义命令行参数并获取仿真世界对象
Expand Down
3 changes: 2 additions & 1 deletion docs/tutorials.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@

- [交通数据导入和编辑支持从公开道路地图导入或创建生成道路网络](course/scenario.md#generateMapByOpenMap),支持添加车辆到道路网络并定义其轨迹以合成驾驶场景,[支持定义车道数量和车道长宽度,支持自定义道路编辑](course/scenario.md#sceneEding)
- [车辆运动支持定义车辆运动起点和目标位置](course/navigation.md#definePoint)[为每辆车指定随机速度值](course/navigation.md#definePoint)[生成车辆轨迹](course/navigation.md#generateTrajectory)。支持自定义车辆的速度,使其沿轨迹移动时不会发生碰撞或模拟碰撞。支持车辆运动模拟和显示自动生成的轨迹场景,可以看到车辆沿指定轨迹行驶以到达其目标位置。
- 联合仿真支持联合虚拟引擎仿真模拟实验,不仅可以看到[区域宏观](course/regional_macro.md),还可以看到[路口微观](course/microscopic_Intersection_demo.md),支持 3D 动画演示运动场景。[支持配置单个或多个摄像头,进行车辆的检测](course/multi-view_camera.md)[支持计算红绿灯的配时方案,并进行红绿灯的设置](course/signal_control.md)[支持测试车辆按地图选点进行移动,看到红灯停、绿灯行,以及避让等功能](course/locate_moving.md)。支持加入更多的车辆进行交通拥堵的模拟,统计优化前和优化后的结果。

- 联合仿真支持联合虚拟引擎仿真模拟实验,不仅可以看到[区域宏观](course/regional_macro.md),还可以看到[路口微观](course/microscopic_Intersection_demo.md),支持 3D 动画演示运动场景。[支持配置单个或多个摄像头,进行车辆的检测](course/multi-view_camera.md)[支持计算红绿灯的配时方案,并进行红绿灯的设置](course/auto_signal_control.md)[支持测试车辆按地图选点进行移动,看到红灯停、绿灯行,以及避让等功能](course/locate_moving.md)。支持加入更多的车辆进行交通拥堵的模拟,统计优化前和优化后的结果。

##### 效果评价

Expand Down
Loading

0 comments on commit e440f8f

Please sign in to comment.