えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

RPi-Pico+PIOで<Wi-Fi.h>が混入するだけでエラーになる(理不尽な)現象

RaspberryPi Picoというボード、皆さんは使っていますか?

RaspberryPi PicoはRaspberryPi財団が独自に開発したマイコンチップおよびマイコンボードです。

デュアルコアのARM Cortex M0+がベースになっており、他の32bitマイコンと比べてとても低価格なのが魅力です。Linuxはインストールできず、C/C++SDKを叩くかMicroPythonを使用して開発を行うことが多いです。

私は、PlatfomIO(PIO)+Arduinoで使用することが多いです。

pico向けのHAT部品も多く発売されており、コミュニティも活発なようです。


移植中に…

最近、IoT関連のプロジェクトに首を突っ込んでいまして、元々ESP32で動いていたものをRaspberryPi Picoに移植しようとしています。

当然ながらESP32とRaspberryPi-Picoはコアが違うものなのでESP32の部分はif definedなどでコンパイル対象から除外してターゲットを切り替える必要があるのですが、そこで1時間程度詰まってしまったのです。

どうやらframework-arduino-mbed関連の部分で詰まっているようで、そのエラーログを見ながら検索したりしていたのですが、どうもうまく解決できませんでした。

キャッシュを削除してもこの問題は再現してしまい、かなりお手上げ状態でした…


一方で、他のボードが関係しないプロジェクトでプログラムをコンパイルしたところ、エラーが起こらず、正常に動くようになりました。

もう一度エラーログを見たところ、なぜかWiFiパッケージがdependencyに含まれていました。おそらくここらへんで詰まっているのでしょう。

現在使用しているのはEthernet付き・Wi-FiなしのRaspberryPi-Picoだったので、明らかにおかしな依存関係です。

W5100S-EVB-Picowww.switch-science.com

なお、この時点では <WiFi.h> をインクルードする記述はコメントアウトせずに #if definedコンパイル対象から除外するようにしていました。


PIOの仕様?

この <WiFi.h>コメントアウトしたところ、すんなりと通るようになりました。

なんと、コンパイル対象から除外していたとしてもPlatfomIO側?がWiFi.hを読んで依存関係を解決しようとするらしいです。

ちなみに、WiFi.h以外のESP32特有のライブラリはコメントアウトしなくても(lib_depsに含めなければ)依存関係に含まれません。

WiFiの問題はArduinoに標準で入っているからこそ起こっているのでしょう。

これはかなり困りますね…


解決法

platfomio.inilib_ignore = WiFi を追加してWiFiブラックリストに入れるだけで解決します。

# 追記例
lib_ignore =
    WiFi


RaspberryPi Picoへの移植時に元のパッケージに<WiFi.h>が含まれていたら要注意です!

rqt_graphを改造してmermaidも出力するようにしてみた

ROS使いであればお馴染みのGUIツールの一つに「rqt_graph」があります。

rqt_graphは、ROSのノード間の接続を確認することができるツールです。

プログラムをノードで管理するROSの特徴を的確に表しているため、これのスクリーンショットをしばしば貼られたりします。

今回は、このrqt_graphにできる限り近い形でmermaidに落とし込むプログラムを作成しました。


mermaidとは

Mermaidはテキストデータをもとにフローチャートやシーケンス図、クラス図を作成可能なツールです。

Markdownドキュメントと非常に相性が良いこともあり、GitHubにも機能が追加されています。

mermaid-js.github.io


mermaid化したいけど面倒→自動生成しよう!

rqt_graphの図形をREADMEに貼り付けるためにはスクショを撮って貼り付けるためのディレクトリを新規に作成して…が必要なので、できればmermaidにすると手軽に通信網を共有することができるでしょう。

しかし、mermaidの記法に慣れているわけでもないと使おうと考えすらしません(怠惰)

そこで、rqt_graphの情報をもとにmermaidも自動生成しようと考えていました。


とりあえずrqt_graphをフォークしてmermaidの出力に必要な接続情報を探すことに。

print出力を繰り返すうちに、描画する情報を集めるノード(dotcode.py)からedgesという情報が有効であることに気づきました。

github.com

edges はEdgeクラスのリストで、__slot__ で定義されている ['start', 'end', 'label', 'key', 'rkey', 'qos'] の要素を使用するとよさそうです。


これらのうち

  • start : トピック発行側
  • end : トピック購読側
  • label : トピック名

を使用してmermaid発行に使用することにしました。


リポジトリ

今回作成したリポジトリ「rmermaid_graph」は以下のリンクからクローン可能です。

github.com

rqt_graphと区別するために名前を変更しています。

ビルド後はrqt_graphと同じ使い方で

rmermaid_graph

と実行すれば動きます。


実行中は以下の画像のような出力が出ます。

https://raw.githubusercontent.com/Ar-Ray-code/rmermaid_graph/humble-devel/image_readme/mermaid.png


あとは、出力されたコードをGitHubやNotionなどに貼り付ければいいです。

トピックを絞りたい場合などは、rqt_graphのチェックボックスなどをつけてください。


更新予定

引数に渡されたテキストファイルにmermaidを書き出したり、GUIなしでも実行できるようにしたいです。

ぜひ、希望があればissueやプルリクエストを送ってもらえると助かります🙏

RTX3060Tiを購入しました。(2080Tiエピソード付き)

GPUを購入した記事を出してからほぼ2年後、新しいGPUを購入しました。

前の記事↓

ar-ray.hatenablog.com


2080Tiとの出会い、中古ガチャ(大)当たり

2年前、私はRTX2080Tiを購入しました。この頃は、RTX3000番台が近いと自作PC界隈がざわついていた頃でした。

この時は1万7000円程度で購入したGTX1650を使っていたのですが、研究などで使用する関係上どうしてもVRAMなどが足りず、困っていた時期でもありました。

研究室のコンピュータはみんな2世代も前のもので、正直学習はできるけど微妙…といった感じでした。


この頃はそれほど使えるお金もなかったので、格安のパーツがないかとフリマを見る機会が多かったのですが、その時9万円で出品されていた2080Tiが目に止まったのです。

RTX2080Tiは2018年に登場したゲーミング向けGPUの最高クラスでした。他の下位クラスは8GBのVRAMである一方で11GB VRAMを搭載しているのも特徴です。

そこらへんの性能のGPUについては9万前後のものは結構あったのですが、その中でも冷却性能の高く見た目もいい感じのROGのGPUで、当時同じ製品を新品で購入するなら18万は超えていたと思うのでかなり魅力的に感じたわけです。


中古品は自分が思っていたよりも悪いこともあるので、正直なところ運要素強めです。

しかし、手が出ないものが手に届きそうな感じがして、所持金ほぼ全額使って背伸びして購入することにしました。

GPUの状態は、ちょっとLED点灯に難あり程度で普通に動作してくれて売却する直前までしっかりと動作してくれたので当たりだったでしょう。

(しかも、この半年後くらいは在宅の流れやマイニングブームによって世界的にGPUが非常に手に入りづらい状況になり、GPUの相場も1.2倍程度上がりました。結果的に絶妙なタイミングでGPUを購入したことになりました。)


このGPU機械学習の学習環境が整えられたのはもちろんのこと、GPUが必要な開発において十分すぎる性能を与えました。

GPUが大いに役立った?記事

ar-ray.hatenablog.com

ar-ray.hatenablog.com

GPUが全てではないですが、現在の活動を支えた重要なパーツの一つと言えるでしょう。


売却。さすがに2世代前は…

このパーツは9月中旬に売却を行いました。

理由は、3つあります。

  1. 4年前のGPUだから
  2. RTX2080Tiが大きくて重すぎる
  3. 修復用GPUを持っておきたい


1は、中古を使っているがゆえに起こる不安です。5年、状態が良ければもっと使えるそうですが、GPUを酷使するとなると過去の使われ方を知らないがゆえにいつ壊れてもおかしくないという不安に駆られます。(意外にも中古品のデメリットをここで感じました。)

2は、自分が来年東京に行くからです。箱も大きいし重いので、3連ファンなので壊れて自分で処分する羽目になる前に売っておきたいと思いました。

3は、来年東京に行った後にデスクトップPCを2・3台組むので、その時にGPU交換時の繋ぎ止めに使えます。


結果、梱包・手数料などを差し引いて3万5千円で売れました。傷や年数を考慮するなら売却相場よりも少し高いくらいで売れました。


RTX3060Tiを選びました。

3070にするか、3050や1650などにするか非常に悩みましたが、いいとこ取りができる3060Tiを購入することしました。

3060Tiは大体6万5千円で購入でき、セールを狙えば5.5万も狙えるコスパの良いミドルレンジGPUです。


3060Tiは8GB RAMが搭載されたミドルレンジGPUですが、前世代のハイエンドGPURTX2080Superとほぼ同じ性能を出すことができると実測上言われています。VRAM、速度ともに2080Tiを持っているならダウングレードになります。

一方で、2080Tiを購入した当初の目的である「機械学習の環境」が現在必要ないことや購入から2年経過してVRや配信・重量級ゲームのプレイをしていないことを考慮すると、2080Tiと同等の性能はいらないことも薄々気付いていました。

正直なところGazebo/Unityシミュレーションとそこそこの物体検出ランタイムが動けばそれでいいとすら思っています。


そのため、「繋ぎ止め」を行うGPUに3060Tiを選定しました。3070はリリース日が1年違うことと消費電力で除外し、3060は12GB VRAMを搭載している分のコスパ悪化を考慮して除外しました。


RTX3060Ti届いた!

RTX3060Tiが届きました。

台風接近中に届けにきた配達の方、お疲れ様です…

早速組み立てました。

かなり小さい。これがRTX…?

200Wなので電源は8pinが一つだけです。


今回購入したものは、Mini ITXケースにも入るGPUなので、結構廉価版みたいな作りになっています。

ファンコントロールは効くものの、LEDの変更が効かなかったりします。仕方ない。(Win11使わないのであまり関係ないけど)


RTXかどうか怪しくなってきたので、とりあえずMinecraftをRTXしてみることに。

Minecraftのインストールを久しぶりにしたのですが、統合版しか買っていないのにJavaEditionも使えるようになっててびっくり。

www.minecraft.net

FHDならRTXしてくれました。ちゃんと60fpsは出そうです。

またマイクラやりたいなー。時間が無限にあれば…


darknet_rosもこの機会に実行してみました。

ちなみに、cudnn8が付いたDockerfileが新しく登場しているので、ちょっとDockerfileをいじりつつ実行してみることに。

↓リリースはこちらから

github.com


体感RTX2080Tiの80%くらいの性能でした。処理が軽ければ軽いほど性能差は出ないので、軽ければ問題ないくらいでした。


まとめ

GPUを新しく買った。 ハイエンドGPUを中古で購入して2年使ってまた中古で流したというお話でした。

売却額を考慮すると月2000円でRTX2080Ti使い放題プラン(※電気代別)を契約していたのとほとんど同じですね。(お得⁉︎)

機械学習周りは多くのネタのルーツになっているので、本当にいい買い物だと思います。

ReadableWidgetsの紹介 (技育展2022)

みなさん、こんにちは!

今回、私は「簡易GUI設計支援ライブラリ ReadableWidgets」という作品名で「開発・スキル支援」部門に作品を出しています。

技育展とは、株式会社サポーターズが主催する学生向け技術ピッチコンテストです。今年は、事前審査を通過した15テーマ・全180作品(チーム)の作品が展示・発表されます。

人数・規模も然る事ながら提出・提案される作品のクオリティも非常に高いものが見られるため、学生登壇の場としては国内最大規模と言っても差し支えないでしょう。


選考を通った学生は、2週間の仕上げ期間を経て3分間のLTに臨みます。

優秀な発表・展示には賞金もあるそうで、総額600万円❗️

一般審査枠もあるそうです。ぜひ以下のリンクから詳細を確認してみてください。

talent.supporterz.jp


私は昨年登壇していたので、今年は(やる気的にも)どうしようかなーと思っていたのですが、

「参加賞 1万円/チーム」というのはやはり大きいのか、あるいは寂しがり屋なのか、いつの間にか作品を応募していました。


私は特に発表が苦手なので、失敗する前にあらかじめ内容を頭に入れてもらおうと思います。

ここには載せていないものもあるので、ぜひプレゼン資料をご覧いただければと思います。


ReadableWidgetsの紹介

ここから本題、ReadableWidgetsの紹介を行います。

ReadableWidgetsはGUI開発ツールですが、どちらかといえば、組み込み・IoT向けのGUI設計ツールになります。


GUI作成って手間かかりますよね?(簡単なものほど)

みなさんは、GUI作成にどれくらいの手間をかけていますか?

GUI前提(Webアプリとかスマホアプリ)であればともかく、元々便利ツール的に作っていたものだと意外とハードルは高いと思います。


「せっかくだし」…や「軽く」…なんて言われても実際は、軽いどころではなく時間がかかるものです。

そのため、他の人に使ってもらうにはGUI化したいけどできない…ということがしばしばあります。


そこで、流用しやすく修正・変更が効きやすいGUIの設計図があると素早く開発が進むのではないでしょうか?

私は、YAMLによるGUI表現があってもいいのではないかと考え、このツールを作成しました。


YAMLとは、タブとハイフンでキーと内容を表記するテキスト形式で、人間でも読みやすい形式に落とし込んであります。

ほとんどの言語で解読ライブラリが開発されているのも特徴です。


ReadableWidgetsでは、そのYAMLファイルをライブラリに通すことで初期化時点で自動的にGUIを生成します。

ライブラリ内では、解読したウィジェットの定義をキーと一緒に辞書型に格納し、GUIを構成していきます。

これで、初期化時点で既に完成されたGUIを実現します。


GUIへ機能を追加

しかしながら、生成されたGUIにはまだ機能が伴っていないため、先ほど生成された辞書を元に機能を追加していきます。

生成された辞書はクラスオブジェクトと同様に扱うことができ、これでボタン押下時の挙動やテキスト設定などが可能になります。


この機能により、初期化時点で完成されたGUIを提示することができるため、わずか20行程度でも「一応動く」GUIアプリが完成します。

このくらい短くできれば、本体のプログラムを読みにくくすることなく手軽に開発・流用できるのではないかと考えています。


中間表現としての活用の模索

また、現在、GUI自体の設計ツールについても言語の壁を越えられるYAMLならではの活用法を模索しています。

ここでは、DrawioからYAMLを生成してGUIに反映しています。

これなら、(私のような)デザインセンス皆無な人でもスムーズに開発ができそうです。


インストール手順

ここまで聴いたみなさんは、おそらく「使ってみたい!!!」と思ったでしょう(?)

ReadableWidgetsはGitHubから入手可能です。

github.com

以下にインストール用コマンドを示します。PySide2が動くPythonが必要です。

git clone https://github.com/Ar-Ray-code/ReadableWidgets
python –m pip install –v ReadableWidgets/PySide2/

Raspberry Pi OSの場合は、aptでPySide2を入手する必要があります。


まとめ

読みやすく汎用的なフォーマットでGUIデザインができれば、開発速度も格段に上がりそうです。

このライブラリはあまりGUI開発を行わない人を対象にしていますが、さまざまなライブラリのパーサーとして機能し、ちょっとしたシステムの別プラットフォームへの移植ができるようにしたらいいなーとか思っています。

例:高機能Linuxコンピュータ→軽量LinuxLinuxコンピュータ→Arduino GFXライブラリ


まだまだ実用というには使いづらい状態なので、サポートいただけるとありがたいです🙏🙏🙏


その他リンク

前身となったライブラリ(PyamlQt)

zenn.dev

LinuxのDesktopショートカットを自動生成するテンプレートを作った

最近ずっと「そこそこ作りやすくて使いやすいアプリケーション」という課題に対していくつか個人的にツールを作っていたりします。


ここでは、Linuxアプリケーションにおけるデスクトップショートカットの作成についてより手続きを単純化するツールを作ったので紹介します。


Linuxアプリのショートカットの作り方

Linuxアプリケーションのショートカットを作成するためには、.desktop ファイルを作成して .local/share/applications/~/Desktop に配置して実行権限を与えるだけでOKです。

.desktop には実行先のパスなどのアプリケーション情報を記載していきます。

ただ、慣れないうちはこの .desktop を正しく作るのは意外と面倒で、正しくパスを通しているはずなのにどこかでコケていることが多々あります。

そこで、エントリーポイントとなるbashファイル情報とアイコンを入力として勝手にインストールするスクリプトを作りました。

github.com

近いうちにReadableWidgetsの機能の一つに入れる予定です。


ショートカットの作り方

以下の画像にインストールの流れを示します。用意すべきものは緑枠の2つのファイルだけです。

アイコンはオプション指定しなかった場合は自動的にダウンロードするようにテンプレートを組んでいるので、実行可能なbashファイルさえあればなんとかなります。


別にインストールしたいアプリがないなら以下のコードで試せます。

インストールしたアプリのリンク先は entrypoint.bash になっており、ターミナル上に hello world を表示して5秒待機するシェルスクリプトです。

インストール時に --terminal (-t) をつけると、実行時にターミナルを開きます。実行中の出力をみたい場合や管理者権限確認ウィンドウを開かない場合は付けておいた方がいいです。

# git clone https://github.com/Ar-Ray-code/icon2entry-Linux.git
cd icon2entry-Linux/
sudo bash icon2entry_linux.bash --entry_bash ./entrypoint.bash -t

インストールするとデスクトップに entrypoint という名前の白紙アイコン(いらすとや)が貼り付けられます。

バツマークが付いて実行できなかったら、右クリック→ "Allow launching" を選択して有効化してください。

次のルートから実行可能です。


アンインストール

--entry_bash (-e) <.bash>--uninstall (-u) オプションでアンインストール可能です。

sudo bash icon2entry_linux.bash --entry_bash ./entrypoint.bash -u


注意

SCRIPT_DIR=$(cd $(dirname $0); pwd) でパス通しができなくなったり、ターミナルのinputが効かなくなったりする場合があります。

パス通しについては、テンプレートに環境変数登録スクリプトを埋め込み→環境変数を登録などで対応しておくといいかもしれません。