Skip to content

Example_02#

잠금 해제/설정 시 앞 램프가 깜밖이는 동작 구현

0. 목차#

  1. 새 프로토 타입 생성
  2. 차량을 제어할 차량 API를 사용한 Python 코드 작성
  3. 프로토 타입와의 상호작용을 시각화하는 Dashboard 수정
  4. 프로토 타입 시나리오 실행
  5. 전체 실행 코드

1. 새 프로토 타입 생성#

  • Create New Prototype 선택
  • Prototype Name: <사용자가 원하는 프로토 타입 이름 지정>
  • Project Template: (default) Python Single File 1-1

2. 차량을 제어할 차량 API를 사용한 Python 코드 작성#

  • SDV Code 탭 선택하여 코드 작성 화면으로 이동 2-1

  • 오른쪽 탭에서 COVESA Signals 탭 선택하여 사용 가능한 모든 Signal을 확인
  • 이번 실습에서 사용할 아래의 Signals 찾아 코드 작성 화면에 복사 (코드에 API가 존재할 경우 Used APIs에 생성, 주석처리된 코드도 동일)
  • Vehicle.Cabin.Door.Row1.DriverSide.IsLocked
  • Vehicle.Body.Lights.Beam.Low.IsOn
  • Vehicle.Body.Lights.Beam.High.IsOn (기본적으로 On 되어있는 등을 Off시키기 위한 용도) 2-2

  • 시나리오 시작 전에 초기 상태로 reset 하기 위해 Set API 사용
  • 오른쪽 Used APIs 탭의 Vehicle.Body.Lights.Beam.High.IsOn 클릭
  • Set API 복사 후 on_start함수에 사용

    • Vehicle.Body.Lights.Beam.Low.IsOn, Vehicle.Cabin.Door.Row1.DriverSide.IsLocked 반복 2-3
  • Trigger 신호가 될 Vehicle.Cabin.Door.Row1.DriverSide.IsLocked을 Used APIs 탭에서 선택

  • 값의 변화를 확인하기 위해 subscribe API 선택
  • 값이 변화할 때마다 호출될 함수 self.Unlock_detected_func 할당 2-3 2-3

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

3. 프로토 타입와의 상호작용을 시각화하는 Dashboard 수정#

  • Dashboard 탭을 선택하여 이동
  • 오른쪽 상단의 Edit 선택하여 widget 수정 2-3

  • 상단의 Delete all widgets 선택하여 기본으로 설정된 모든 widget 삭제 2-3

  • 아래의 그림과 같이 widget 설정
  • 1,2번 칸: Signal List Settable
  • 6,7번 칸: Terminal
  • 3,4,5,8,9,10번 칸: 3D_Car_Unity 2-3

  • Signal List Settable을 수정
  • 오른쪽 상단의 Used Signals-Copy all signals 선택
  • 붙여넣기 후 save 2-3 2-3

4. 프로토 타입 시나리오 실행#

  • 오른쪽의 start버튼을 통해 시나리오 동작 확인
  • Vehicle.Cabin.Door.Row1.DriverSide.IsLocked 값을 변경할 때 마다 동작 2-3

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