2024年3月6日水曜日

wasm環境構築

https://rustwasm.github.io/docs/book/game-of-life/setup.html

に書いてあることをコピーとちょっとしたエラー時の対応のログです。

必要なパッケージのインストール

npm

npm install npm@latest -g

wasm pack

curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh

cargo-generate

$ cargo --version
cargo 1.71.1 (7f1d04c00 2023-07-29)
$ cargo install cargo-generate
  Updating crates.io index
  Installing cargo-generate v0.19.0
  Updating crates.io index
error: failed to compile `cargo-generate v0.19.0`, intermediate artifacts can be found at `/tmp/cargo-installDG3XkQ`
Caused by:
  package `normpath v1.2.0` cannot be built because it requires rustc 1.74.0 or newer, while the currently active rustc v
ersion is 1.71.1
  Try re-running cargo install with `--locked`

エラーの指示の通りrustcのバージョンアップを
する。

$ rustup check
stable-aarch64-unknown-linux-gnu - Update available : 1.71.1 (eb26296b5 2023-08-03) -> 1.76.0 (07dca489a 2024-02-04)
rustup - Up to date : 1.26.0
$ rustup update stable
$ cargo install cargo-generate

無事インストール完了

動作確認

cargo generate --git https://github.com/rustwasm/wasm-pack-template
cd wasm-game-of-life
wasm-pack build
npm init wasm-app www

pkg/package.json を作成し、下記を追加

{
  "name": "wasm-game-of-life",
  "collaborators": [
    "Your Name <your.email@example.com>"
  ],
  "description": null,
  "version": "0.1.0",
  "license": null,
  "repository": null,
  "files": [
    "wasm_game_of_life_bg.wasm",
    "wasm_game_of_life.d.ts"
  ],
  "main": "wasm_game_of_life.js",
  "types": "wasm_game_of_life.d.ts"
}
vi www/package.json

以下ブロックを追加

  "dependencies": {
    "wasm-game-of-life": "file:../pkg"
  },

export NODE_OPTIONS=--openssl-legacy-provider
npm install
npm run start

ブラウザでhttp://localhost:8080 を開くとアラートが表示される

Exercises

lib.rsのgreeting関数に引数をして、jsから引数ありの呼び出しをしてみる。

lib.rs

pub fn greet(name: &str) {
    alert(&format!("Hello, {}!", name));
}

index.js

wasm.greet("Your Name");

2023年10月20日金曜日

Eclipse Kuksaを調べてみた

Eclipse SDV Project調査です。今回はEclipse KUKSA。

https://eclipse-kuksa.github.io/kuksa-website/

語源ですが、
ククサ:北欧の遊牧民族の使っているマグカップ
とのことです。
この語源と実際の機能にどのように結びついているかは不明。

以下調べた内容です。

  • Eclipse Kuksaについて
  • 簡易動作確認

ちなみにメインのメンテナはBoschの方です。

Eclipse Kuksaについて

KUKSAの主な機能

  • 車両データとインターフェースをVehicleSignalsSpecification(VSS)にもとづいて共通フォーマットに抽象化
  • さまざまな車両インタフェースを基本的なインタフェースに適合することを重点としている
  • オンボード、オフボードの新しい技術を車両アーキテクチャに追加可能
  • アプリケーションやToolChainは対象外で、それについてはEclipse Velocitasを参照

KUKSA.valは以下のコンポーネントがある

VSSを使ったブローカ、サーバとClientのサンプルが提供されている。

Componentescription
KUKSA DatabrokergRPC + Rustで実装されたVSSのブローカー。認証アクセスも提供
KUKSA Serverwesocket + C++ で実装されたVSSのデータサーバ。認証アクセスも提供で、機能がリッチ。
KUKSA PythonClientとSDKコマンドラインツール。VSSBroker,サーバにアクセスできデータ取得、更新が可能
KUKSA GO Client ExampleGoで書かれたBroker, ServerにアクセスできるClient
Example Applications上記を使ったサンプル
Feeders and ProvidersBroker, Serverを使ったデータ交換の複数Feeder、Provider

COVESA_VSSについて

VSS(VehiclesSignalSpecification)はCOVESAで定義されている車両信号のカタログ定義

  • 車両信号に対してdomain taxonomyを導入
  • VSS標準カタログを定義し、ベンダー依存しないように定義する。ベンダー固有部はオーバーレイの拡張が可能

VSSの詳細については割愛

簡易動作確認

KUKSA.valのBrokreを使って動作確認をする。

  • 対話ツールを使った動作確認
  • node-redを使ったサンプル確認

対話ツールを使った動作確認

  1. Brokerを立ち上げる
  2. clientを使って
  • データの取得
  • データの設定
  • 対象データのSubscribe
    今回はBrokerを使ったサンプル

https://github.com/eclipse/kuksa.val

podman run -it --rm --net=host ghcr.io/eclipse/kuksa.val/databroker:master --insecure

データ取得、設定

> podman run -it --rm --net=host ghcr.io/eclipse/kuksa.val/kuksa-client:master 
Test Client> getMetaData   Vehicle.Speed 
{
    "path": "Vehicle.Speed",
    "metadata": {
        "data_type": "FLOAT",
        "entry_type": "SENSOR",
        "description": "Vehicle speed"
    }
}
Test Client> getValue   Vehicle.Speed 
{
    "path": "Vehicle.Speed"
}

Test Client> setValue   Vehicle.Speed 5.1
OK

Test Client> getValue   Vehicle.Speed 
{
    "path": "Vehicle.Speed",
    "value": {
        "value": 5.099999904632568,
        "timestamp": "2023-10-01T15:02:36.725825+00:00"
    }
}

浮動小数点の誤差があるのはなぜかは不明。

subscribe

Test Client> subscribe Vehicle.Speed
{
    "subscriptionId": "a126e311-02a0-44f9-a49e-0687e5cf2afe"
}

[
  {
    "entry": {
      "path": "Vehicle.Speed",
      "value": {
        "value": 5.199999809265137,
        "timestamp": "2023-10-01T15:06:55.475883+00:00"
      }
    },
    "fields": [
      "VALUE"
    ]
  } 
]

別ターミナルで

Test Client> setValue Vehicle.Speed 5.2
OK

node-redを使ったサンプル確認

https://github.com/eclipse/kuksa.val/tree/master/kuksa_apps/node-red

> git clone https://github.com/eclipse/kuksa.val
> cd kuksa.val/kuksa_apps/node-red
> docker-compose up -d
>
  • http://<IPアドレス>:1880/ ブラウザを開く
    • 以下の拡張をインストール
    • node-red-dashboard
    • node-red-contrib-web-worldmap
  • http://<IPアドレス>:1880/ui ブラウザを開く
> cd ../../
> docker build -f kuksa-client/Dockerfile -t kuksa-client:latest .
> docker run --rm -it --net=host kuksa-client:latest
> connect ws://127.0.0.1:8090
> authorize -f kuksa_certificates/jwt/super-admin.json.token
> setValue Vehicle.Speed 10

以下のリンクの画像のように更新時にメータが反映される。
https://github.com/eclipse/kuksa.val/blob/master/kuksa_apps/node-red/node-red-screenshot.png


reference

所感

明確な用途は書いていないが、KUKSA.valでデータリポジトリを構築して、クラウドからデータ収集していくのかなと思う。
サーバー側は「gRPC + Rust」 、 「WebSocket+C++」と選択肢があることはよい。gRPC+Rustは今の流行りか。
VSSのデータ構造をみると、実際のECUから直接KUKSA Broker/Serverに登録はできなそう。
なのでCANデータをgRPC/Websocket通信ができるECUに転送し、登録するのかなと思う。

用語集

用語説明
GENIVIIVIシステム向けにオープンなインフォテインメントプラットフォームの幅広い採用を目指し発足された非営利団体
COVESA(The Connected Vehicle Systems Alliance)GENIVIの名称変更し、狙いをオンエッジ・インクラウドサービス、インターフェース、データ交換を含むコネクテッド車両システムへと進化したもの

2023年9月28日木曜日

Eclipse Ankaios を調べてみた

Eclipse SDV ProjectnのEclipse Ankaiosを調べてみました。

アンカイオスはギリシャ神話の人物。

「リュクルゴスの息子」と「サモス島の領主」の同名の別人がいるらしい。
前者のほうは、ギリシャ神話の英雄とのこと。
多分語源はこっち。

まとめとしては以下の内容

  • スコープや背景
  • 技術的な要約
  • 簡易動作確認

スコープと背景

基本的に以下のサイトに書いてあることを要約した。

https://eclipse-ankaios.github.io/ankaios/

スコープ

Scope¶
Eclipse Ankaios provides workload and container orchestration for automotive High Performance Computing (HPC) software . While it can be used for various fields of applications, it is developed from scratch for automotive use cases and provides a slim yet powerful solution to manage containerized applications. It supports various container runtimes with Podman as the first one, but other container runtimes and even native applications can be supported. Eclipse Ankaios is independent of existing communication frameworks like SOME/IP, DDS, or REST API.

Eclipse Ankaios manages multiple nodes and virtual machines with a single unique API in order to start, stop, configure, and update containers and workloads. It provides a central place to manage automotive applications with a setup consisting of one server and multiple agents. Usually one agent per node connects to one or more runtimes that are running the workloads.


車載HPC向けのワークロードとコンテナオーケストレーションを提供
車載向けにスクラッチ開発し、スリムで強力なソリューションを実現する。
Podmanを使ってさまざまなコンテナランタイムをサポート。
ネイティブアプリケーションもサポートができる。
Ankaiosは既存の通信フレームワーク(SOME/IP、DDS、REST APIなど)に依存していない。

Ankaiosは複数ノード、仮想マシンを単一のAPIで管理できる。
コンテナ、ワークロードに対するstart/stop/configuration/update
Ankaiosサーバ、Ankaiosエージェントという構成を持ち、
車載アプリケーションを管理するための中央的な場所を提供。
※ central placeの意味がしっくりこない。
1ノードに1エージェントを配置し、複数のワークロードを実行中のランタイムに接続される

背景

以下サイトの記載を引用

Eclipse Ankaios follows the UNIX philosophy to have one tool for one job and do that job well. It does not depend on a specific init system like systemd but can be started with any init system. It also does not handle persistency but can use an existing automotive persistency handling, e.g. provided by AUTOSAR Adaptive.

The workloads are provided access to the Eclipse Ankaios API using access control and thus are able to dynamically reconfigure the system. One possible use case is the dynamic startup of an application that is only required in a particular situation such as a parking assistant. When the driver wants to park the car, a control workload can start the parking assistant application. When the parking is finished, the parking assistant workload is stopped again.

Eclipse Ankaios also provides a CLI that allows developers to develop and test configurations. In order to gain compatibility with Kubernetes, Eclipse Ankaios accepts pod specifications.

An optional fleet connector can use the Eclipse Ankaios API to connect to a cloud-based software update system, which allows an OEM to manage a fleet of vehicles and provide new states to Eclipse Ankaios in order to update single or all applications.

In order to support the Automotive SPICE process, Eclipse Ankaios comes with requirements tracing supported by OpenFastTrace.

以下設計指針

  • ツールの思想はUNIX哲学に従っている。
  • 永続的な処理はない。
    • 既存のAutomotiveno永続性処理を使用することが可能。
  • initシステムに依存せずに起動可能
  • APIを使用して、システムを動的に再構成する
  • 開発者向にCLI(コマンドライン)も提供(ank)
  • Kubernetesと互換性を確保のためにPod仕様も対応
  • Automotive SPICEプロセスをサポートするためにOpenFastTraceによって要件トレース

動的に再構成するユースケース

  • パーキングアシストなどの特定条件のみで必要となるアプリケーションの起動停止。
    • パーキングしたい場合、駐車アシスタントのワークロードを起動
    • パーキング完了の場合、駐車アシスタントのワークロードを停止

任意のフリートコネクタを用いた場合、
Ankaios APIのを使ってクラウドベースのソフト更新システムに接続できる。
OEMが車両管理やソフト更新のためにAnkaiosに新しい状態を通知したりできる。

※ここの文章の内容がいまいちな気がするので、以下として理解。
Fleet ConnectorがAnkaios Serverにアクセスし、ワークロード情報を収集する。
その結果をクラウドサーバにアップする。
FleetConnectorからワークロードの動的な構成が行える。

参考図

技術的な要約

  • 言語
    • Rust
  • コンテナ
    • podman
  • 通信プロトコル
    • gRPC


 システム構成の概略図



component Ankaios_CLI<<process>>
component Ankaios_Server <<process>>
component Agent_node {
  component Ankaios_Agent<<process>>
  component Podman
  component Workload

  Ankaios_Agent *-down- Workload
  Ankaios_Agent -> Podman: use
  Podman -left-> Workload : コンテナ起動 with Pod
}

Ankaios_CLI -right-> Ankaios_Server:  communication with gRPC
Ankaios_Server "1"<-down->"n" Ankaios_Agent: communication with gRPC

基本的にAnkaios_Agentが受け取ったコマンドをpodmanで実行する。
Ankaios_Server とAnkaios_Agentのメッセージフォーマットは
ankaios.proto参照

簡易動作確認

前提条件

  • rust がインストールされていること

インストール手順

> apt install podman
> sudo usermod --add-subuids 10000-65536 ponta027
> sudo usermod --add-subgids 10000-65536 ponta027
> cat /etc/containers/containers.conf 
[containers]
keyring=false

> apt install protobuf-compiler
> git clone https://github.com/eclipse-ankaios/ankaios.git
> cd ankaios
> cargo build

動作確認

terminal1

> ./target/debug/ank-server --startup-config startConfig.yaml

startConfig.yamlを作成。
workloadを定義し、起動するagentを設定する。
workloadは、runtimeConfigに指定してあるとおりに動作する。

terminal2

> podman pull docker.io/library/nginx:latest
> ./target/debug/ank-agent --name agent_A

agennt_Aでnginxのコンテナが起動

terminal3

> ./ank get workload
 WORKLOAD NAME   AGENT     RUNTIME   EXECUTION STATE 
 api_sample      agent_A   podman    Failed          
 hello1          agent_B   podman    Unknown         
 hello2          agent_B   podman    Unknown         
 hello3          agent_B   podman    Unknown         
 nginx           agent_A   podman    Running         

workloads:
  nginx:
    runtime: podman
    agent: agent_A
    restart: true
    updateStrategy: AT_MOST_ONCE
    accessRights:
      allow: []
      deny: []
    tags:
      - key: owner
        value: Ankaios team
    runtimeConfig: |
      image: docker.io/library/nginx:latest
      ports:
      - containerPort: 80
        hostPort: 8081
  api_sample:
    runtime: podman
    agent: agent_A
    restart: true
    updateStrategy: AT_MOST_ONCE
    accessRights:
      allow: []
      deny: []
    tags:
      - key: owner
        value: Ankaios team
    runtimeConfig: |
      image: ankaios_workload_api_example
  hello1:
    runtime: podman
    agent: agent_B
    restart: true
    updateStrategy: AT_MOST_ONCE
    accessRights:
      allow: []
      deny: []
    tags:
      - key: owner
        value: Ankaios team
    runtimeConfig: |
      image: alpine:latest
      command: ["echo"]
      args: ["Hello Ankaios"]
      remove: true
  hello2:
    runtime: podman
    agent: agent_B
    restart: true
    updateStrategy: AT_MOST_ONCE
    accessRights:
      allow: []
      deny: []
    tags:
      - key: owner
        value: Ankaios team
    runtimeConfig: |
      image: alpine:latest
      command: ["echo"]
      args: ["Hello Ankaios"]
      remove: false
  hello3:
    runtime: podman
    agent: agent_B
    restart: true
    updateStrategy: AT_MOST_ONCE
    accessRights:
      allow: []
      deny: []
    tags:
      - key: owner
        value: Ankaios team
    runtimeConfig: |
      image: alpine:latest
      command: ["echo"]
      args: ["Hello Ankaios"]


所感

Kubernetesなどのオーケストレーションツールを車載品質に焼き直そうという
シンプルな目的なので分かりやすいが、車両へコンテナの適用が増加していき、ツールの機能が拡充すれば使えるツールになるのかもしれない。
技術的な観点だと、Rust、gRPCのトレンド技術を取り入れているあたりは
面白いと思う。
要件トレースにopenFastTraceというテキストベースのトレースツールを使っていて、ちょっと試してみようかと思う。



2023年9月7日木曜日

Eclipse eCALを動かしてみる

Eclipse eCALを動かしてみる

eCALとは

eCAL
とはEclipse SDV Projectの1プロジェクト。

ハイパフォーマンスでスケーラブルなpub/subミドルウェア。
マルチプラットフォームサポート(Windows/Linux)

付属アプリケーションとして以下が提供されている。

  • Monitor
  • Recorder
  • Player

以下プロトコルをサポート

  • Google Protobuf
  • CapnProto
  • Flatbuffers

ROS2と接続できるようにRMW(ROSMiddleWare)をサポート

やったこと

  • eCALの環境構築。
  • 同一コンテナ内でProtobufでPub/Subの動作確認

動作確認環境

xxxx@penguin:~/$ hostnamectl 
   Static hostname: penguin
         Icon name: computer-container
           Chassis: container
        Machine ID: xxxxx
           Boot ID: xxxxx
    Virtualization: lxc
  Operating System: Debian GNU/Linux 11 (bullseye)
            Kernel: Linux 5.15.112-19404-g55fe7e355056
      Architecture: arm64

環境構築

Dockerfileを作成

FROM ubuntu:20.04

# https://github.com/eclipse-ecal/ecal


RUN apt-get update && apt-get upgrade   \
      && apt-get -y install software-properties-common  \
      && add-apt-repository ppa:ecal/ecal-latest  \
      && apt-get update   \
      && apt-get -y install ecal  \
      && apt-get -y install vim cmake g++ libprotobuf-dev protobuf-compiler

ビルド

> docker build -t eCAL_sample . 

動作確認

コンテナ起動して、受信プログラムを実行

> docker run -it -v data:/data eCAL_sample bash

>root@febee21d92e6:/# ecal_sample_person_rec
^

別ターミナルで同一コンテナに入る。

> docker exec -it [container_id] bash

>root@febee21d92e6:/# ecal_sample_person_snd

送受信のプログラムが動作し始める。

実装

> apt-get install cmake g++ libprotobuf-dev protobuf-compiler

protcol bufferで送受信するプログラムを実装。
実装内容は以下参照。

https://eclipse-ecal.github.io/ecal/getting_started/hello_world_proto.html

以下簡単に処理内容を記載する。





今後確認してみること

参考

2023年2月5日日曜日

ChromeBookのLinux環境構築の備忘録