Skip to main content
Skip table of contents

Python API

Introduction

이 참조 문서에는 Scenario Runner GUI 를 사용하지 않고, Scenario Runner Python API 를 사용해서, OpenScenario Data 에 기반으로 한 Scenario 파일을 MORAI: SIM Drive 와 연동해서 Simulation 를 진행할 수 있습니다.

이 Document 에서는 Scenario Runner Python API의 세부 내용이 포함이 되어있으며, Scenario Runner Release 버전에 따라서, API의 기능 명세가 다를 수 있습니다.

Python API Reference

현재 Scenario Runner 에서 지원하는 Python API는 아래와 같습니다.

Scenario Runner 의 API 기능을 사용하기 위해서는 시나리오 설정 API 를 우선으로 호출 해야 한다.

Instance: OpenScenario ClientAPI

Scenario Runner Client 와 연결하는 API 입니다. Scenario Runner Client 는 OpenScenario Data 를 MORAI: SIM Drive 와 연동해서 Batch Simulation (시뮬레이션 수행 | 배치-시뮬레이션) 을 도와주는 Instance 입니다. MORAI: SIM Drive 와 연결하려면 IpPort 를 설정합니다, 그리고 User 가 Scenario 의 시작과 끝을 명시하기위한 Custom 한 callback 함수를 사용해야 합니다.

Methods

  • __init__(self, host=”127.0.0.1”, port=”7789”, user_start_callback_func=None, user_stop_callback_func=None)
    Client Constructor.

    • Parameters:

      • host(IP)(str) - MORAI: SIM 에서 gRPC 로 연동 하기위한 IP 주소. Default: “127.0.0.1”

      • port (str) - MORAI: SIM 에서 gRPC 로 연동 하기위한 TCP 포트. Default: “7789”

      • user_start_callback_func - Scenario 시작의 Event Callback. Default: None

      • user_stop_callback_func - Scenario 끝의 Event Callback. Default: None

  • is_connected(self)
    현재 OpenScenarioClient APIMORAI: SIM 과 연동의 여부를 확인할 수 있다.

    • Return: true (if the client is connected) / false (if the client is not connected)

  • delete_all_actors(self)
    OpenScenario 에서 정의된 Entity 또는 다른 통신을 통해서 Vehicle 을 Spawn 했을 경우, 모든 Spawned Object 들을 삭제한다.

    • Warning: 실패 시에는 send_delete_all_actor() Error 가 출력된다.

  • get_available_map(self)
    MORAI: SIM 에서 어떤 Map 이 지원되는 지를 알 수 있다.

    • Return: List(string)

  • get_current_scenario_name(self)
    현재 어떤 시나리오파일이 MORAI: SIM 에서 재생되고 있는지를 확인할 수 있다.

    • Return: string

  • get_current_scenario_time_sec(self)
    현재 시나리오가 재생된 시점의 Simulation 의 시간을 확인할 수 있다.

    • Return: float

  • get_is_client_running(self)
    현재 위의 OpenScenarioClient 가 동작하는지를 확인할 수 있다.

    • Return: bool

  • get_simulator_version(self)
    현재 사용하고 있는 MORAI:SIM Drive 버전을 확인할 수 있다.

    • Return: string

  • set_time_of_day(self, hour, animation=True)
    MORAI:SIM 의 시간과 그 시간에 따른 Animation 의 변화를 줄지 안줄지를 결정할 수 있다.

    • Parameters

      • hour: (int) - 시간의 정보 (ex: 13 시)

      • animation: (bool) - 시간에 따른 Animation

  • set_weather(self, weather_type)
    MORAI:SIM 에서의 날씨를 정의할 수 있다.

    • Parameters

      • weather_type: (str) - 계절의 종류로서 아래와 같은 string 값을 사용한다.
        Sunny, Cloudy, Foggy, Storm, Rainy, Snowy

  • set_scenario_config(self, scenario_file_list, controller_mode=ControllerFrom.BuiltIn, sync_mode=False, num_iterations=1, is_ignore_init_ego=False)
    Remark: OpenScenario Data 를 Play 하기 위해서, 필수 항목 들을 미리 세팅해 준다. 필수 항목의 상세내용은 아래와 같다.

    • Parameters

      • scenario_file_list: (list) - OpenScenario File 이 저장되어 있는 경로(string) 를 List 로 준다.

      • controller_mode: (enum) - Ego 의 차량 제어 방식. Default: ControllerFrom.BuiltIn

      • sync_mode: (bool) - 시뮬레이터의 구동 방식. Default: false

        • sync_mode=true: 시뮬레이터를 한 프레임씩 구동

        • sync_mode=false: 시뮬레이터를 실시간으로 구동

      • num_iterations: (int) - 시나리오를 몇 번 반복할지에 대한 횟수. Default: 1

      • is_ignore_init_ego: (bool) - 전 시나리오에 Ego 의 위치와 속도 값을 무시

  • skip_scenario(self)
    재생중의 Scenario 들을 Skip 할수 있다.

  • start_batch_scenario(self)
    Scenario File 에 따라서, Batch Simulation 을 진행할 수 있다.

이 API 를 사용하기 이전에, 위의 set_scenario_config(…) API 를 사용해서, Scenario File 를 List 형태로 설정 해줘야 한다.

  • stop_batch_scenario(self)
    Batch Simulation 을 종료 할수 있다.

Example

PY
def scenario_runner_api_worker(client_api:OpenScenarioClientAPI):
    # OpenScenario File Path (Absolute / Relative)
    scenario_list = [
        '..\..\..\data\openscenario\\v1.2\R_KR_PG_K-City\Scenario_CCRB_1.xosc',
        '..\..\..\data\openscenario\\v1.2\R_KR_PG_K-City\Scenario_CCRB_2.xosc',
    ]

    # Start Batch Simulation
    client_api.set_scenario_config(scenario_file_list =scenario_list,
                                   controller_mode =ControllerFrom.BuiltIn,
                                   sync_mode =False,
                                   num_iterations =1,
                                   is_ignore_init_ego =False)
    client_api.start_batch_scenario()
    
    element = None
    for i in range(20):
        if element is None:
            element = client_api.get_storyboard_element("Event1")
        if element:
            print(element.state)
        time.sleep(1)
    
    client_api.skip_scenario()
    time.sleep(10)
    client_api.stop_batch_scenario()

def custom_start_callback_func():
    pass

def custom_stop_callback_func():
    pass

if __name__ == '__main__':
    App = QApplication(sys.argv)

    # Set for Client for selected ip and port
    client_api = OpenScenarioClientAPI(ip="127.0.0.1", port="7789",
                                       user_start_callback_func=custom_start_callback_func,
                                       user_stop_callback_func=custom_stop_callback_func)
    t_worker = threading.Thread(target=scenario_runner_api_worker, args=(client_api,), daemon=True)
    t_worker.start()
    
    sys.exit(App.exec())
JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.