Skip to content

Example_01#

Model, Prototype 생성부터 시뮬레이션 동작 확인까지

0. 목차#

  1. Playground 접속 및 계정 생성
  2. 개발 환경 이동
  3. Prototype 생성
  4. 시뮬레이션 작성 및 Dashboard 설정
  5. 시뮬레이션 실행
  6. 프로토타입 내 Signal 조작
  7. 시뮬레이션 코드 추가
  8. 전체 실행 코드

1. Playground 접속 및 계정 생성#

  • https://playground.digital.auto/ 접속
  • 상단의 Sign In을 통해 계정 생성 1-1

2. 개발 환경 이동#

  • Vehicle CatalogVehicle Models 선택하여 개발 환경 이동 2-1
  • 차량 모델에는 사용자가 만든 'My Models'와 'Public' 모델들을 볼 수 있다.
  • 상단의 Create New Model 선택하여 새로운 모델 생성 2-2

  • Model Name: <사용자가 원하는 모델 이름 지정>
  • Signal: (default) COVESA VSS v4.1 2-3

모델 안의 정보들#

  • Overview: 모델의 정보
  • Architecture: 모델의 아키텍처 정의 (자세한 사항은 문서참조)
  • Vehicle: 모델에서 사용가능한 API들
  • Prototype Library: 프로토타입 2-4

  • 상단의 Vehicle API에는 모델 생성에 선택했던 COVESA VSS v4.1에 정의된 API들의 정보를 확인할 수 있다.
  • Branch, Actuator, Sensor 포함 2-4

3. Prototype 생성#

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

- SDV Code tap#

  • 상단의 SDV Code 탭에는 API를 통한 시뮬레이션 과정을 Python 코드로 정의할 수 있다. 2-4

  • API를 사용할 경우 오른쪽 탭에 사용한 API들이 자동으로 표시된다.

  • 사용하고자 하는 API들은 COVESA Signal에서 확인할 수 있다. 2-4

- Dashboard tap#

  • Dashboard 탭에서는 위젯(Widget)들을 통해 차량 내의 변화를 시각화할 수 있다. 2-4

  • 이미지, 3D 모델링, 그래프 등 많은 도구를 지원한다. 2-4

  • 오른쪽 '시작'버튼을 통해 SDV Code에서 정의한 시뮬레이션을 시작할 수 있다. 2-4

  • 상단의 Edit을 통해 위젯들의 배치 등을 변경할 수 있다. 2-4 2-4


4. 시뮬레이션 작성 및 Dashboard 설정#

시나리오 코드 작성#

  • SDV Code 탭에서 아래의 코드를 작성한다.
  • 시나리오: 운전자 측 문이 열리면 문에 내장된 실내등이 점등되고 닫으면 점멸된다. 2-4
    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_driver_door_opened(self, data: DataPointReply):
            print("Driver door event received")
    
            Driver_door_open_value = data.get(self.Vehicle.Cabin.Door.Row1.DriverSide.IsOpen).value
    
            if Driver_door_open_value:  # Door is open
                print("Activating driverside ambient lighting...")
    
                # Set light color and turn on
                await self.Vehicle.Cabin.Light.AmbientLight.Row1.DriverSide.Color.set("#00FFFF")
                await self.Vehicle.Cabin.Light.AmbientLight.Row1.DriverSide.IsLightOn.set(True)
            else:
                await self.Vehicle.Cabin.Light.AmbientLight.Row1.DriverSide.IsLightOn.set(False)
    
    
        async def on_start(self):
            print("Smart Ambient Light application starting...")
    
            # Subscribe to door signal
            await self.Vehicle.Cabin.Door.Row1.DriverSide.IsOpen.subscribe(self.on_driver_door_opened)
    
            print("Door monitoring active - Smart Ambient Light ready")
    
    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()
    

Dashboard 설정#

  • Dashboard
  • Edit 선택 2-4
  • 바둑판 배열에서 원하는 영역 선택 [1,2,6,7 선택]
  • Add widget 선택
  • 3D Car Unity 선택 2-4

  • 바둑판 배열에서 원하는 영역 선택 [3,4 선택]

  • Add widget 선택
  • Signal List Settable 선택 2-4

  • 생성된 Signal List Settable 위젯 오른쪽 상단의 Edit Widget 선택 2-4

  • 위젯을 통해 보고 싶은 값들을 설정 "Vehicle.Cabin.Door.Row1.DriverSide.IsOpen", "Vehicle.Cabin.Light.AmbientLight.Row1.DriverSide.Color", "Vehicle.Cabin.Light.AmbientLight.Row1.DriverSide.IsLightOn"

  • Save 2-4

5. 시뮬레이션 실행#

  • Start 버튼을 통해 시뮬레이션을 시작한 상태에서 차량의 문을 열어본다.
  • 3D 모델을 통해 문 열고 닫기
  • 또는 Settable의 On, Off를 통해 문 열고 닫기
  • 문이 열릴때 문에 내장된 실내등이 점등/점멸되는지 확인 (실내등에 변화가 없을 경우 시뮬레이션이 잘 실행되었는지 확인, 오른쪽 아래 <<를 통해 터미널을 확장하여 코드의 에러가 있는지) 2-4

6. 프로토타입 내 Signal 조작#

  • 오른쪽 >> 버튼을 통해 메뉴를 확장하면 Signal Watch를 통해 모델의 다른 API도 사용할 수 있다.
  • boolean 값은 true, false 작성 후 엔터
  • 실수형 또는 정수형은 값을 작성 후 엔터
  • 문자열 자료형은 API 정보를 확인 후 작성 2-4

7. 시뮬레이션 코드 추가#

  • 시나리오 추가사항: 조수석 문을 열 때 조수석 문에 내장된 실내등 켜지도록한다
  • 추가하는 API (Subscribe, get, set)
  • Vehicle.Cabin.Door.Row1.PassengerSide.IsOpen
  • Vehicle.Cabin.Light.AmbientLight.Row1.PassengerSide.Color
  • Vehicle.Cabin.Light.AmbientLight.Row1.PassengerSide.IsLightOn
  • 차량의 보조석 문이 열리는지 확인 (Subscribe)
  • on_start 함수에 차량의 보조석 문이 열리는지 계속해서 체크하기 위해 async/await 사용
  • 값이 변할 때 호출할 함수를 등록: self.on_passenger_door_opened 2-4

  • Subscribe 호출 함수의 내부 동작 (Get, Set)

  • self.Vehicle.Cabin.Door.Row1.PassengerSide.IsOpen의 값을 Get함수를 통해 가져오기
  • 값이 True일 때는 내장 실내등이 점등: self.Vehicle.Cabin.Light.AmbientLight.Row1.PassengerSide.IsLightOn.set(True)
  • 값이 False일 때는 내장 실내등이 점멸: self.Vehicle.Cabin.Light.AmbientLight.Row1.PassengerSide.IsLightOn.set(False)
  • self.Vehicle.Cabin.Light.AmbientLight.Row1.PassengerSide.Color.set("#00FFFF")를 통해 실내등의 색 변경 2-4

  • Dashboard 수정

  • Dashboard의 Settable을 Edit widget 통해 Passengerside 실내등 API를 등록 2-4

  • 시뮬레이션 실행을 통한 검증

  • 시뮬레이션을 실행하여 보조석 문이 열릴 때 실내등이 점등되는지 확인 2-4

8. 전체 실행 코드#

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_driver_door_opened(self, data: DataPointReply):
        print("Driver door event received")

        Driver_door_open_value = data.get(self.Vehicle.Cabin.Door.Row1.DriverSide.IsOpen).value

        # print(f"Driver door state: {'Open' if value else 'Closed'}")

        if Driver_door_open_value:  # Door is open
            print("Activating driverside ambient lighting...")

            # Set light color and turn on
            await self.Vehicle.Cabin.Light.AmbientLight.Row1.DriverSide.Color.set("#00FFFF")
            await self.Vehicle.Cabin.Light.AmbientLight.Row1.DriverSide.IsLightOn.set(True)
        else:
            await self.Vehicle.Cabin.Light.AmbientLight.Row1.DriverSide.IsLightOn.set(False)


    async def on_passenger_door_opened(self, data: DataPointReply):        
        print("Passenger door event received")    

        Passenger_door_opent_value = data.get(self.Vehicle.Cabin.Door.Row1.PassengerSide.IsOpen).value

        # print(f"Passenger door state: {'Open' if value else 'Closed'}")

        if Passenger_door_opent_value:  # Door is open
            print("Activating driverside ambient lighting...")

            # Set light color and turn on
            await self.Vehicle.Cabin.Light.AmbientLight.Row1.PassengerSide.Color.set("#00FFFF")
            await self.Vehicle.Cabin.Light.AmbientLight.Row1.PassengerSide.IsLightOn.set(True)
        else:
            await self.Vehicle.Cabin.Light.AmbientLight.Row1.PassengerSide.IsLightOn.set(False)


    async def on_start(self):
        print("Smart Ambient Light application starting...")

        # Subscribe to door signal
        await self.Vehicle.Cabin.Door.Row1.DriverSide.IsOpen.subscribe(self.on_driver_door_opened)
        await self.Vehicle.Cabin.Door.Row1.PassengerSide.IsOpen.subscribe(self.on_passenger_door_opened)

        print("Door monitoring active - Smart Ambient Light ready")

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()