2 분 소요

INTRO 🙌

이전 시간에는 CARLA 기본 개발 능력을 연마했다.

이번에는 CARLA 시뮬레이터를 활용해서 RSU를 구현해보자.

코드 분석은 각 라인별 주석으로 대체한다.

GitHub Repository에서 이번 학습 모듈(Learning Task 4 & 5)관련 파일을 열람할 수 있다.

RSU 란? 🎆

image

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)

이전 프로젝트에서 배운 방법으로 공사 꼬깔 또한 여러 개 생성했다.

image

이제, 생성한 공사 꼬갈과 지나치는 자동차 사이를 시각적으로 나타내보자.

            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)

image

                            # 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)

image

이제, 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

image

image

콘솔창에서 사이 거리를 반환하는 모습이고, CARLA 시뮬레이터에서는 사이 구간을 시각적으로 보여주는 모습이다.

Reference

GitHub Repository

UW Madison CARLA Research Team

CARLA Simulator

댓글남기기