Example_02#
잠금 해제/설정 시 앞 램프가 깜밖이는 동작 구현
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.Cabin.Door.Row1.DriverSide.IsLockedVehicle.Body.Lights.Beam.Low.IsOnVehicle.Body.Lights.Beam.High.IsOn(기본적으로 On 되어있는 등을 Off시키기 위한 용도)

- 시나리오 시작 전에 초기 상태로 reset 하기 위해
SetAPI 사용 - 오른쪽 Used APIs 탭의
Vehicle.Body.Lights.Beam.High.IsOn클릭 -
Set API 복사 후
on_start함수에 사용Vehicle.Body.Lights.Beam.Low.IsOn,Vehicle.Cabin.Door.Row1.DriverSide.IsLocked반복
-
Trigger 신호가 될
Vehicle.Cabin.Door.Row1.DriverSide.IsLocked을 Used APIs 탭에서 선택 - 값의 변화를 확인하기 위해
subscribeAPI 선택 - 값이 변화할 때마다 호출될 함수
self.Unlock_detected_func할당

Unlock_detected_func로직 구현DriverSide.IsLocked값의 변화를 감지하여 호출된Unlock_detected_func에서 해당 값이 읽어와(Get) 그 값의 따라 동작을 구현- False, Unlock 인 경우 헤드램프를 짧게 2번 점등(Set)
- True, Lock 인 경우 헤드램프를 길게 1번 점등(Set)

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.Cabin.Door.Row1.DriverSide.IsLocked값을 변경할 때 마다 동작
5. 전체 실행 코드#
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 Unlock_detected_func(self, data: DataPointReply):
print("Lock Variable changing detected")
print("Getting Lock status...")
lock_value = (await self.Vehicle.Cabin.Door.Row1.DriverSide.IsLocked.get()).value
if lock_value == False: # Unlock detected
print("Vehicle Unlocked")
await asyncio.sleep(0.5)
await self.Vehicle.Body.Lights.Beam.Low.IsOn.set(True)
await asyncio.sleep(0.5)
await self.Vehicle.Body.Lights.Beam.Low.IsOn.set(False)
await asyncio.sleep(0.5)
await self.Vehicle.Body.Lights.Beam.Low.IsOn.set(True)
await asyncio.sleep(0.5)
await self.Vehicle.Body.Lights.Beam.Low.IsOn.set(False)
else :
print("Vehicle Locked")
await asyncio.sleep(0.5)
await self.Vehicle.Body.Lights.Beam.Low.IsOn.set(True)
await asyncio.sleep(1)
await self.Vehicle.Body.Lights.Beam.Low.IsOn.set(False)
async def on_start(self):
# reset
print("Reset Status")
await self.Vehicle.Body.Lights.Beam.Low.IsOn.set(False)
await self.Vehicle.Body.Lights.Beam.High.IsOn.set(False)
await self.Vehicle.Cabin.Door.Row1.DriverSide.IsLocked.set(True)
#subscribe variable
print("Subscribe Lock Variable")
await self.Vehicle.Cabin.Door.Row1.DriverSide.IsLocked.subscribe(self.Unlock_detected_func)
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.Cabin.Door.Row1.DriverSide.IsLocked
# Vehicle.Body.Lights.Beam.Low.IsOn
# Vehicle.Body.Lights.Beam.High.IsOn