[자율주행 시뮬레이터] CARLA Road Side Unit(RSU) 이해
INTRO 🙌
이전 시간에는 CARLA 기본 개발 능력을 연마했다.
이번에는 CARLA 시뮬레이터를 활용해서 RSU를 구현해보자.
코드 분석은 각 라인별 주석으로 대체한다.
GitHub Repository에서 이번 학습 모듈(Learning Task 4 & 5)관련 파일을 열람할 수 있다.
RSU 란? 🎆
1대 이상의 탑재장치와 데이터 통신을 하기 위하여 도로변에 설치된 고정 통신장치로, RSU(Road Side Unit) 또는 고정장치와 동일한 의미를 가진다.
쉽게 말해서, 도로에 설치되어 주변 지나치는 차량과 정보 통신을 통해 네이게이션 정보 등을 실시간으로 주고받게 도와주는 통신망이라 이해하면 된다.
이번 예제에서는 공사 꼬깔, 도로 표지판 등 RSU 객체와 지나치는 자동차 사이를 레이저로 표현하고 거리를 반환하는 통신 시스템을 구현해보자.
CARLA에서 RSU 구현
우선 대표적인 RSU 오브젝트인 도로 표지판을 blueprint에서 가져와 생성해보자.
이전 프로젝트에서 다룬 내용이니 디테일은 과감히 생략한다.
rsu_bp_1 = blueprint_library.find('static.prop.streetsign')
spawn_point_rsu1 = carla.Transform(carla.Location(x=-57, y=61.22, z=6.5), carla.Rotation(pitch=0.000000, yaw=0.000000, roll=0.000000))
rsu1 = world.spawn_actor(rsu_bp_1, spawn_point_rsu1)
actor_list.append(rsu1)
이후 Testing 환경에서, 향상된 RSU 관찰을 목격하기 위해 카메라 시점을 조정해보자.
spectator = world.get_spectator()
rsu_transform = rsu1.get_transform()
spectator.set_transform(carla.Transform(rsu_transform.location, carla.Rotation(pitch=-35)))
이제, Testing 환경에 필요한 오토파일럿 모드로 움직여 다니는 무작위 자동차를 생성해보자.
# Generate NPC vehicles
if SPAWN_NPC_VEHICLES == 1:
for i in range(NPC_VEH_NUM):
# Choose random blueprint and choose the i-th default spawn points
vehicle_bp_i = random.choice(blueprint_library.filter('vehicle.*.*'))
spawn_point_i = spawn_points[i]
print(spawn_point_i.location, spawn_point_i.rotation)
# Spawn the actor
vehicle_i = world.try_spawn_actor(vehicle_bp_i, spawn_point_i)
# Append to the actor_list
if vehicle_i != None:
actor_list.append(vehicle_i)
vehicle_list.append(vehicle_i)
print('%d vehicles are generated' % len(vehicle_list))
# Set autopilot for each vehicle
for vehicle_i in vehicle_list:
vehicle_i.set_autopilot(True)
이전 프로젝트에서 배운 방법으로 공사 꼬깔 또한 여러 개 생성했다.
이제, 생성한 공사 꼬갈과 지나치는 자동차 사이를 시각적으로 나타내보자.
while True:
if iter >= max_iteration:
break
world_snapshot = world.get_snapshot()
timestamp = world_snapshot.timestamp.elapsed_seconds # Get the time reference
if iter == 1:
# Visulize static information:
# Construction zone
if VISUALIZE_CONSTRUCTION_ZONE == 1:
h = carla.Location(x=0, y=0, z=1)
# Add a text to the RSU
world.debug.draw_string(location=rsu1.get_location(), text='RSU', draw_shadow=True, color=carla.Color(255, 0, 0), life_time=max_time)
# Draw 5 boundaries
world.debug.draw_line(begin=cone_1.get_location()+h, end=cone_2.get_location()+h, color=carla.Color(255, 0, 0), life_time=max_time)
world.debug.draw_line(begin=cone_2.get_location()+h, end=cone_3.get_location()+h, color=carla.Color(255, 0, 0), life_time=max_time)
world.debug.draw_line(begin=cone_3.get_location()+h, end=cone_4.get_location()+h, color=carla.Color(255, 0, 0), life_time=max_time)
world.debug.draw_line(begin=cone_4.get_location()+h, end=cone_5.get_location()+h, color=carla.Color(255, 0, 0), life_time=max_time)
world.debug.draw_line(begin=cone_5.get_location()+h, end=cone_1.get_location()+h, color=carla.Color(255, 0, 0), life_time=max_time)
# Detection area
if VISUALIZE_DETECTION_AREA:
h_detect = 0.3
corner_1 = carla.Location(x=rsu1.get_location().x, y=cone_1.get_location().y) + carla.Location(x=0, y=-DETECTION_RANGE, z=h_detect)
corner_2 = cone_2.get_location() + carla.Location(x=DETECTION_RANGE, y=-DETECTION_RANGE, z=h_detect)
corner_3 = cone_4.get_location() + carla.Location(x=DETECTION_RANGE, y=DETECTION_RANGE, z=h_detect)
corner_4 = carla.Location(x=rsu1.get_location().x, y=cone_5.get_location().y) + carla.Location(x=0, y=DETECTION_RANGE, z=h_detect)
# Draw 4 boundaries
world.debug.draw_line(begin=corner_1, end=corner_2, thickness=0.03, color=carla.Color(255, 255, 0), life_time=max_time)
world.debug.draw_line(begin=corner_2, end=corner_3, thickness=0.03, color=carla.Color(255, 255, 0), life_time=max_time)
world.debug.draw_line(begin=corner_3, end=corner_4, thickness=0.03, color=carla.Color(255, 255, 0), life_time=max_time)
world.debug.draw_line(begin=corner_4, end=corner_1, thickness=0.03, color=carla.Color(255, 255, 0), life_time=max_time)
이제, RSU 통신의 실질적 목표인 RSU ~ 자동차 사이 거리를 계산해보자.
for i in range(len(vehicle_list)):
vehicle = vehicle_list[i]
v_x = vehicle.get_location().x
v_y = vehicle.get_location().y
for j in range(len(cone_list)):
cone = cone_list[j]
c_x = cone.get_location().x
c_y = cone.get_location().y
# Calculate the distance between each vehicle and each cone
dist_x = np.abs(v_x - c_x)
dist_y = np.abs(v_y - c_y)
# If the vehicle is within the detection area, assume RSU could send this message to the vehicle.
if dist_x < DETECTION_RANGE and dist_y < DETECTION_RANGE:
# Visualize the communication process
if VISUALIZE_COMMUNICATION == 1:
world.debug.draw_line(begin=rsu1.get_location(), end=vehicle.get_location()+carla.Location(z=0.6), color=carla.Color(64, 255, 0), life_time=dt)
break
콘솔창에서 사이 거리를 반환하는 모습이고, CARLA 시뮬레이터에서는 사이 구간을 시각적으로 보여주는 모습이다.
댓글남기기