Skip to content

Example_03#

앞 후드를 열 시에 wiper는 자동으로 정지하고 후드 등은 켜지는 동작 구현

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.Body.Trunk.Front.IsOpen (주의. Vehicle.Body.Hood.IsOpen API를 사용하는 예제도 있지만 주로 사용하는 3D_Car_Unity Widget에서는 호환 X)
  • Vehicle.Body.Trunk.Front.IsLightOn
  • Vehicle.Body.Windshield.Front.Wiping.Mode

  • 시나리오 시작 전에 초기 상태로 reset 하기 위해 Set API 사용
  • 오른쪽 Used APIs 탭의 Vehicle.Body.Trunk.Front.IsOpen 클릭
  • Set API 복사 후 on_start함수에 사용 2-3

  • Front Trunk가 열릴 때 호출될 on_Front_Trunk_is_open_changed 함수 구현

  • on_start 내에 정의(def) => self 생략
  • IsOpen: bool: Listener가 바라보는 값의 변화 값을 바로 읽어온다. 즉, Get 함수 생략 가능
  • Wiper의 Mode는 String으로 정의되어 있다. 즉, Set함수에 반영 2-3 2-3

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

  • Vehicle.Body.Trunk.Front.IsOpen 값에 Subscribe API를 통해 Listener 함수 on_Front_Trunk_is_open_changed 등록

  • self 없이 등록된 것을 확인 2-3

  • 나머지 코드 구현 [1] Wiper를 "MEDIUM" 속도로 작동 [2] Wiper가 작동하는 중에 Front Trunk 열기 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.Body.Windshield.Front.Wiping.Mode의 경우 settable에서 콤보박스로 만들어지는 것을 확인 2-3

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