Example_03#
앞 후드를 열 시에 wiper는 자동으로 정지하고 후드 등은 켜지는 동작 구현
0. 목차#
- 새 프로토 타입 생성
- 차량을 제어할 차량 API를 사용한 Python 코드 작성
- 프로토 타입와의 상호작용을 시각화하는 Dashboard 수정
- 프로토 타입 시나리오 실행
- 전체 실행 코드
1. 새 프로토 타입 생성#
Create New Prototype선택Prototype Name: <사용자가 원하는 프로토 타입 이름 지정>Project Template: (default) Python Single File
2. 차량을 제어할 차량 API를 사용한 Python 코드 작성#
SDV Code탭 선택하여 코드 작성 화면으로 이동
- 오른쪽 탭에서
COVESA Signals탭 선택하여 사용 가능한 모든 Signal을 확인 - 이번 실습에서 사용할 아래의 Signals 찾아 코드 작성 화면에 복사
(코드에 API가 존재할 경우
Used APIs에 생성, 주석처리된 코드도 동일) Vehicle.Body.Trunk.Front.IsOpen(주의.Vehicle.Body.Hood.IsOpenAPI를 사용하는 예제도 있지만 주로 사용하는3D_Car_UnityWidget에서는 호환 X)Vehicle.Body.Trunk.Front.IsLightOnVehicle.Body.Windshield.Front.Wiping.Mode
- 시나리오 시작 전에 초기 상태로 reset 하기 위해
SetAPI 사용 - 오른쪽 Used APIs 탭의
Vehicle.Body.Trunk.Front.IsOpen클릭 -
Set API 복사 후
on_start함수에 사용
-
Front Trunk가 열릴 때 호출될
on_Front_Trunk_is_open_changed함수 구현 - on_start 내에 정의(def) => self 생략
IsOpen: bool: Listener가 바라보는 값의 변화 값을 바로 읽어온다. 즉, Get 함수 생략 가능- Wiper의 Mode는 String으로 정의되어 있다. 즉, Set함수에 반영

-
구현된 코드는 아래와 같이 작성

-
Vehicle.Body.Trunk.Front.IsOpen값에 Subscribe API를 통해 Listener 함수on_Front_Trunk_is_open_changed등록 -
self 없이 등록된 것을 확인

-
나머지 코드 구현 [1] Wiper를 "MEDIUM" 속도로 작동 [2] Wiper가 작동하는 중에 Front Trunk 열기

3. 프로토 타입와의 상호작용을 시각화하는 Dashboard 수정#
Dashboard탭을 선택하여 이동- 오른쪽 상단의
Edit선택하여 widget 수정
- 상단의
Delete all widgets선택하여 기본으로 설정된 모든 widget 삭제
- 아래의 그림과 같이 widget 설정
- 1,2번 칸:
Signal List Settable - 6,7번 칸:
Terminal - 3,4,5,8,9,10번 칸:
3D_Car_Unity
Signal List Settable을 수정- 오른쪽 상단의
Used Signals-Copy all signals선택 - 붙여넣기 후 save

4. 프로토 타입 시나리오 실행#
- 오른쪽의
start버튼을 통해 시나리오 동작 확인 Vehicle.Body.Windshield.Front.Wiping.Mode의 경우 settable에서 콤보박스로 만들어지는 것을 확인
5. 전체 실행 코드#
from vehicle import Vehicle
import time
import asyncio
import signal
from sdv.vdb.reply import DataPointReply
from sdv.vehicle_app import VehicleApp
from vehicle import Vehicle, vehicle
class TestApp(VehicleApp):
def __init__(self, vehicle_client: Vehicle):
super().__init__()
self.Vehicle = vehicle_client
async def on_start(self):
await self.Vehicle.Body.Mirrors.DriverSide.IsFolded.set(True)
await self.Vehicle.Body.Trunk.Front.IsOpen.set(False)
async def on_Front_Trunk_is_open_changed(IsOpen: bool):
print("Listener was triggered")
if IsOpen == False:
await self.Vehicle.Body.Windshield.Front.Wiping.Mode.set("OFF")
print("Wipers were turned off because Front Trunk was opened")
await self.Vehicle.Body.Trunk.Front.IsLightOn.set(True)
else :
await self.Vehicle.Body.Trunk.Front.IsLightOn.set(False)
await self.Vehicle.Body.Trunk.Front.IsOpen.subscribe(on_Front_Trunk_is_open_changed)
print("Listener was registered")
await asyncio.sleep(3)
# Turn wiper on
print("Turn on Wipers with MEDIUM speed")
await self.Vehicle.Body.Windshield.Front.Wiping.Mode.set("MEDIUM")
await asyncio.sleep(3)
# Now test the listener
print("Open the Front Trunk")
await self.Vehicle.Body.Trunk.Front.IsOpen.set(True)
async def main():
vehicle_app = TestApp(vehicle)
await vehicle_app.run()
LOOP = asyncio.get_event_loop()
LOOP.add_signal_handler(signal.SIGTERM, LOOP.stop)
LOOP.run_until_complete(main())
LOOP.close()
# Vehicle.Body.Trunk.Front.IsOpen
# Vehicle.Body.Trunk.Front.IsLightOn
# Vehicle.Body.Windshield.Front.Wiping.Mode