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 와 연결하려면 Ip
와 Port
를 설정합니다, 그리고 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: Noneuser_stop_callback_func
- Scenario 끝의 Event Callback. Default: None
is_connected(self)
현재 OpenScenarioClient API 가 MORAI: 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
get_states_object(self)
OpenScenario 에서 정의된 https://www.asam.net/static_downloads/ASAM_OpenSCENARIO_V1.2.0_Model_Documentation/modelDocumentation/content/MiscObject.html 들의 상태 정보들을 가지고 올 수 있다.Return: dict
get_states_pedestrian(self)
OpenScenario 에서 정의된 https://www.asam.net/static_downloads/ASAM_OpenSCENARIO_V1.2.0_Model_Documentation/modelDocumentation/content/Pedestrian.html 들의 상태 정보들을 가지고 올 수 있다.Returns: dict
get_states_vehicle(self)
OpenScenario 에서 정의된 https://www.asam.net/static_downloads/ASAM_OpenSCENARIO_V1.2.0_Model_Documentation/modelDocumentation/content/Vehicle.html 들의 상태 정보들을 가지고 올 수 있다.Returns: dict
get_storyboard_element(self)
OpenScenario 에서 정의된 https://www.asam.net/static_downloads/ASAM_OpenSCENARIO_V1.2.0_Model_Documentation/modelDocumentation/content/StoryboardElementState.html 의 상태 정보 및 볼 수 있다. StoryboardElement 같은 경우에는Story
,Act
,ManeuverGroup
,Maneuver
,Event(s)
,Action(s)
의 종류로 나누어진다.Returns: 각 Element 의 object(class)
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제어 방식의 종류:
ControllerFrom.BuiltIn
,ControllerFrom.External
,ControllerFrom.MoraiSim_Drive
Resource: 시뮬레이션 수행 | 로드한-시나리오에-대한-시뮬레이션
sync_mode
: (bool) - 시뮬레이터의 구동 방식. Default: falsesync_mode=true: 시뮬레이터를 한 프레임씩 구동
sync_mode=false: 시뮬레이터를 실시간으로 구동
num_iterations
: (int) - 시나리오를 몇 번 반복할지에 대한 횟수. Default: 1is_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
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())