ふるお〜と!- FullAuto

AI・ロボットが普及しBI(ベーシックインカム)が早急に実現されることを願う元ニートのブログ

ふるお〜と!-FullAuto

【C++ テンプレート】 ポリシーに基づく設計と静的ポリモーフィズムの比較

IoTとかロボットにプログラムを組み込みするときにC++テンプレートメタプログラミングを使ってみたいよね
x86_x64 , Arm, RISC-VなどのCPU, GPU, FPGAで表面上は同じソースコードを使ってみたいわ

コードをコンパイル時に自動生成って怖くないですか?

えぇなにかあったときヤバイよ。可読性も失われるし。

でもソフトウェアにバグがあったときにヤバイ自動車でさえ先進的な企業はC++14を採用しているわ(AUTOSAR)

Pythonから呼び出すDeepLearningのC++ライブラリもテンプレートが使われているわ

というわけで、もはやC++ テンプレートは必須知識なんだけど...

テンプレートが激ムズじゃありませんかと。

再利用性のないクソコードを書くC++erにならないためにもテンプレートは必須知識ね

プロジェクトのソースコードのレベルはレベルの低い人に合わせるのではなく上に合わせるべきよ

私はレベルの低い人に合わせた再利用性のないクソコードプロジェクトにアサインされたくないわ

テンプレートは自由度が高く人によって実装が違う恐ろしい状態らしいですね

テンプレートの具体的な例もネット上に情報が全然ないのも一因かもね

オッケー テンプレートの例を作ってみよう

テンプレートの例

ポリシーのテンプレート

#include <iostream>

struct Dog {
    static void Print(const std::string& value)
    {
        std::cout << value << "dog" << std::endl;
    }
};

struct Cat {
    static void Print(const std::string& value)
    {
        std::cout << value << "cat" << std::endl;
    }
};

template <class SayPolicy>
struct Animal {
    void Say() const
    {
        SayPolicy::Print("I am ");
    }
};

int main(){
    Animal<Dog>().Say();
    Animal<Cat>().Say();
}

静的ポリモーフィズム(CRTP)

#include <iostream>

template <typename D>
struct Animal
{
    template <typename TI>
    void Say(const TI& input) {
        D* ptr = static_cast<D*>(this);
        ptr->Imp(input);
    }
};

struct  Dog : public Animal<Dog>
{
    template <typename TI>
    void Imp(const TI& input) {
        std::cout << input << "dog" << std::endl;
    }
};

struct  Cat : public Animal<Cat>
{
    template <typename TI>
    void Imp(const TI& input) {
        std::cout << input << "cat" << std::endl;
    }
};



int main(){
    Dog d;
    Cat c;
    d.Say("I am ");
    c.Say("I am ");
}

ビルド

$ g++ -std=c++17 main.cpp 

出力

I am cat
I am dog

どちらも出力は変わらない。
ポリシーに基づく設計はカスタマイズ性の高いクラスに使用される。
ポリシー基づく設計はHeterogeneous Dictionariesと組み合わせて実装される。
...
やっぱり難しい。

Fusion 360からSDFをエクスポートしてみる

方法1

GitHub - Roboy/SDFusion: Exporter for Fusion 360 models to SDFormat

  1. とりあえず、「Open」をして前に作ったやつをオープンします。

  2. Fusion 360上で「Shift + S」で"Scripts nad Add-Ins"を開く。さらに"Add-Ins"タブを開きます。

  3. グリーンのプラスアイコンをクリックして"SDFusion"フォルダを追加します。

  4. SDFusionを選択し、"Run"ボタンをクリックします。

  5. SDFUSIONウィンドウが表示されるので、 Model Nameを付けて、"Export to SDF"ボタンをクリックします。

  6. すると、.sdfが含まれたフォルダがエクスポートされます。

空のファイルが作られます。

方法2

GitHub - KobayashiRui/Fusion360_SDF_Export: This is a script that outputs SDF or URDF with Fusion360.

  1. とりあえず、「Open」をして前に作ったやつをオープンします。

  2. Fusion 360上で「Shift + S」で"Scripts nad Add-Ins"を開きます。今度はそのまま"Scripts"タブにします。

  3. グリーンのプラスアイコンをクリックして"SDFusion"フォルダを追加します。

  4. sdf_exportを選択し、"Run"ボタンをクリックします。

  5. フォルダを選択します。

  6. すると、Completeと表示され、.sdfが含まれたフォルダがエクスポートされます。

注意:左上のギアマーク"Document Setting"の単位の設定を確認します。
Fusion360はデフォルトでmmですがmに変える必要があります。

単位をメートルに変えないとGazeboシミュレーターで特大表示されますね

Node-RED上でArduinoに接続したモータを動かす

...

以前、開発PCからのコマンドを通じてArduinoでモータを動かすプログラムを書いたけど、 さっぱり忘れてしまった...

あのときは1台だったけど、現段階で使用するモーターが24台もある...99%わけわかんなくなりそう...テカムリ

というわけでNode-REDとArduinoを連携してみよう。

Prerequisite

Node-RED インストール - Qiita

Software | Arduino

nodered.jp

上記を読むことで13番PinにLEDを接続してチカチカすることができる。


補足:
/dev/ttyACM0のその他のユーザの書き込み権限も付与する。
全権限付与👇😅

$ sudo chmod 777 /dev/ttyACM0

Arduinoの設定

Arduino IDEでFirmataを書き込みする。
「ファイル」→「スケッチ例」→「Firmata」→「StandardFirmata」 を呼び出し、ビルド⇒書き込みをする。

Node-RED : arduino outの設定

Flow

値:90をインジェクトから投げるだけ。(90°に動く)

[{"id":"a9a0b66ca6ad624a","type":"arduino out","z":"ee0e2f0bae30d36d","name":"モーター","pin":"7","state":"SERVO","arduino":"d7663aaf.47194","x":680,"y":160,"wires":[]},{"id":"1345a30662f04efc","type":"inject","z":"ee0e2f0bae30d36d","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"90","payloadType":"num","x":510,"y":160,"wires":[["a9a0b66ca6ad624a"]]},{"id":"d7663aaf.47194","type":"arduino-board","device":"/dev/ttyACM0"}]

課題

node-red-node-arduinoはシリアルポートに対応している。
しかし、シリアルポートだと
前にROS2トピック上で遅延が発生したことがあった。
よって、TCPあるいはUDP上で通信させる必要がある。

depthai-rosを試してみる

GitHub - luxonis/depthai-ros
GitHub - luxonis/depthai-ros-examples

ROS2 Foxy にない関数使われていたよ。README.mdを信じてはいけない。

いるよね〜。聞けばすぐわかることを延々ソースコード眺めているコミュ障キモメガネ

そうそう、README.mdに書いてあっても日々アップデートしてんだがら仕様変わるつーの

Prerequisite

ROS2 Galactic
Installing ROS 2 via Debian Packages — ROS 2 Documentation: Galactic documentation

↓ROS2 Foxyでハマったときの駄文

ROS1をメインに作れているようでROS2向けにビルドするには工夫が必要。 ~/ros2_ws/src/
に依存パッケージをインストールしていく。

$ git clone https://github.com/ros-perception/vision_msgs --branch foxy

camera_info_managerをCMakeLists.txtから外す。

no member named id,score,x,y 全部削除!

colcon依存追加
https://github.com/ros2/rcpputils

https://github.com/ros-perception/image_common/tree/foxy

多用するコマンド

$ colcon build --cmake-clean-cache

ROS2 Galacticの依存ソースコード

~/ros2_ws/srcにぶち込んでおくソースコード
main(ほぼROS1)ではなくbranch(glatic)にあるので注意。

depthai-ros-examples

とりあえず、~/ros2_ws/installに ネタはビルドできたのでexampleを試してみようと思う。

https://github.com/luxonis/depthai-ros-examples/tree/daxoft/foxy-release

~/ros2_ws/srcへ追加。

libcamera_info_manager.so: undefined reference to `rcpputils::fs::path::stringabi:cxx11 const' collect2: error: ld returned 1 exit status

とかなんとか言われたらこうする

$ sudo ldconfig
$ source ~/ros2_ws/src/local_setup.sh
$ git clone https://github.com/luxonis/depthai-ros-examples
$ cd depthai-ros-examples
$ mkdir build
$ cd build
$ cmake ..
$ make

Run(Mobile)

$ source ~/ros2_ws/install/local_setup.sh
$ ros2 launch depthai_examples mobile_publisher.launch.py camera_model:=OAK-D

No such file or directory: 'xacro'

apt update
apt search xacro
sudo apt install ros-galactic-xacro

OAK-D-LITE

$ ros2 launch depthai_examples mobile_publisher.launch.py camera_model:=OAK-D-LITE

Topic表示

$ ros2 topic list
$ ros2 topic echo /color/image

WebTransportについて

AIに現場の状況を判断させるために、画像の送信はマストである。
画像を高速に送信する場合、現在Websorkcet over TCPが主流だが、 TCP上で画像を送信するとHOL(Head of Line Blocking ) の問題が起こる。

そこで各社・各業界はプロプライエタリUDP上の仕様を策定していた。

ここ最近WebTransport over UDPの規格が標準化されつつある。

次世代IoTやスマートロボットの標準規格はWebTransportになりそう。
いや、Web規格でUDP上で通信する場合はSSL証明書が必須(https)だから、そのへんがめんどくさい。

暗号化したらデバッグ難しくなるし、
暗号化しないWebTransport規格も必要だなぁ。

日本の職場がギスギスしている理由とその解決法

参考

「なぜ、日本の職場は世界一ギスギスしているのか (SB新書)」

分析

人が退職して、入ってくる新人が無能という理由がギスギスしている要因の1つらしい。

労働人口減ってる中で優秀な人を採用できないなんて当然の理(求人倍率1未満の職種は除く)。

人が辞めたら優秀な人が入ってくる氷河期時代とは違 うんだよと。

解決法

1. AI・ロボットを開発する!

そんなにダメな奴と働くのが嫌だったらAI・ロボット開発するしかない!!

2. メタバースで仕事をする

しかめっ面のおっさん・おばさん同士で群れてるからギスギスする。
おっさん・おばさんに美少女のアバターを着せよう!

3. ベーシックインカムを導入する

ベーシックインカムを導入して、グレートリセットをしよう!