覚書ブログ
覚えられないので書いておきます。
2024年5月19日日曜日
2024年5月6日月曜日
2024年5月5日日曜日
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から引数ありの呼び出しをしてみる。
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のサンプルが提供されている。
Component | escription |
---|---|
KUKSA Databroker | gRPC + Rustで実装されたVSSのブローカー。認証アクセスも提供 |
KUKSA Server | wesocket + C++ で実装されたVSSのデータサーバ。認証アクセスも提供で、機能がリッチ。 |
KUKSA Python | ClientとSDKコマンドラインツール。VSSBroker,サーバにアクセスできデータ取得、更新が可能 |
KUKSA GO Client Example | Goで書かれたBroker, ServerにアクセスできるClient |
Example Applications | 上記を使ったサンプル |
Feeders and Providers | Broker, Serverを使ったデータ交換の複数Feeder、Provider |
COVESA_VSSについて
VSS(VehiclesSignalSpecification)はCOVESAで定義されている車両信号のカタログ定義
- 車両信号に対してdomain taxonomyを導入
- VSS標準カタログを定義し、ベンダー依存しないように定義する。ベンダー固有部はオーバーレイの拡張が可能
VSSの詳細については割愛
簡易動作確認
KUKSA.valのBrokreを使って動作確認をする。
- 対話ツールを使った動作確認
- node-redを使ったサンプル確認
対話ツールを使った動作確認
- Brokerを立ち上げる
- 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
- https://eclipse-kuksa.github.io/kuksa-website/
- Webサイト
- https://github.com/eclipse/kuksa.val
- Git Repository
所感
明確な用途は書いていないが、KUKSA.valでデータリポジトリを構築して、クラウドからデータ収集していくのかなと思う。
サーバー側は「gRPC + Rust」 、 「WebSocket+C++」と選択肢があることはよい。gRPC+Rustは今の流行りか。
VSSのデータ構造をみると、実際のECUから直接KUKSA Broker/Serverに登録はできなそう。
なのでCANデータをgRPC/Websocket通信ができるECUに転送し、登録するのかなと思う。
用語集
用語 | 説明 |
---|---|
GENIVI | IVIシステム向けにオープンなインフォテインメントプラットフォームの幅広い採用を目指し発足された非営利団体 |
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
以下簡単に処理内容を記載する。
今後確認してみること