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

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

CoRE-1の近況報告

ほぼ1ヶ月投稿しておらず申し訳ないです🥲

CoRE-1というロボットコンテストの募集から5ヶ月、ついに大会直前です。

ar-ray.hatenablog.com

ここ1ヶ月間は(仕事以外の)書類作成タスクや届いたハードウェアに組み込む作業で全く時間が取れていませんでした…😭


ちなみに、大会が終わっても書類タスクが山積…😇

入門書も書く!と宣言しているだけにまだまだ忙しくなりそうです🥺

週一ペースで投稿とXのプロフィールに堂々と書いていますが、ここ数ヶ月は厳しいなぁと。

ただ、トータルの文章量はブログと同じ(もしかしたらそれよりも多いかもしれない)なので、公開された時はぜひご覧ください🙏


今のコンディション

1ヶ月ほど前にロボットが届いて実装開始!とXでは言いつつ実はかなりやばかったりするのですが、開発自体は着々と進めています。

画像処理

大会の規定上、ソフトウェアの全ての部分にROS 2が使用されています。

ROSはそのままでも割とソフトウェアを切り分けやすいのですが、画像処理部分ではpluginlibを使用してさらにノード内を通信部分とアルゴリズム部分を切り分けています。

GitHub - StrayedCats/detector2d: Detection2d node for CoRE-1 2024

pluginlibは、文字列を引数に渡すことでROSに登録されているモジュールを動的に読み込ませることができる機能です。インタフェース部分は確定しているけどその中身を入れ替えたい時に使用できます。

RvizやRqtで使用されていたりするので、実はROSに欠かせない機能だったりします。

TensorRTのdetectorを作りたい!と思った時は別リポジトリプラグインだけ作って後付けロードが可能なので、依存関係を隔離できるのも嬉しいポイント。

開発者はC++コードとして開発してもらって後でplugin仕様に合わせてライブラリを作ってもらえるので、円滑に開発が進むだろうなぁーと。

xmlのエラーに気づきにくかったりするのは罠かもしれないですね。

そういえば、C++でバリバリ(趣味として)開発する人ってどれくらいいるのでしょうか?Rustの方が受けが良かったりするんですかね?


ハードウェアとの繋ぎ込み

チーム結成当初は、「ハードウェアインタフェースで繋ぐぞ!」と意気込んでいたのですが、現実はそうではありませんでした…

GitHub - scramble-robot/CoRE_AutoRobot_2024_raspberrypi

通信相手をEthernetが付いているマイコンだと思っていたのですが、まさかのラズパイ4でした。(なんなら中で私が作ったdpkgが動いているw🙃)

この大会、ラズパイをしばいた方がいいのでは?と思いつつ開発方針を変更しました。rosbagを取りやすいのはいいですね。


行動計画

BehaviorTree (4) を使っています…が、ちょっとまだ作りこめていないので頑張ります…


開発ツール:AprilTag

特定の画像を使って絶対自己位置を推定する手法(TagSLAM)に使われるAprilTagというものがあるのですが、これをパネルに貼り付けて実験しています。

うまく動かない時に何が間違っているのかが一目で分かるので結構重宝しています。


3/24京都で会いましょう👋

まとまりのない文章ですが、近況報告でした。


3/23に予選・3/24に準決勝・決勝があり、私たちのチームは3/24に参加する予定です。

当日まで非常に忙しくなりますが、ラストスパート頑張ります🏃🔥


ROCK5のNPUで遊ぶ(Ubuntu22・rknn・YOLOX)

先週から今週にかけてAIに関するニュース(Gemini Pro・Chat with RTX・Sora)が飛び込んできて、再びLLM・生成AIの話題が沸騰中みたいです。

別方面ではありますが、まだまだAIへの投資と進化は止まらなさそうです。手元のPCで動く日が来るかもしれないと思うと楽しみですね✨


エッジAIだとラズパイ5の日本上陸も重大トピックの1つでしょう。

3倍速いと言われるCPUとPCIeのコネクタ実装によって新しい使い方ができるようですね。


今回は このRaspberryPi ROCK5内蔵のNPUで遊ぼう思います🙃(おい


ROCK5とは?

ROCK5はシングルボードコンピュータを開発・製造しているRadxaのボードです。AとBがあり、私が使っているのはRaspberryPi Bに形状が似たAタイプです。

RaspberryPi 5 ModelBと形状が似ており、他の製品についてもほとんどRaspberryPiのCPU以外は全部パクリと言ってもいいでしょう。

ROCK5にはARM-CPU(Cortex-A76とCortex-A55のbig.LITTLE構成)が搭載されており、m.2が差せるところもあります。また、ラズパイらしい配置のUSBコネクタやGPIO・カメラコネクタも備えているので、もう実質RaspberryPi5と行ったところでしょう。


実は1ヶ月ほど前に入手して、CPU性能まわりを軽く調べていました。

Ubuntu-Desktopのリッチなグラフィックスも余裕で動かすくらいのGPU性能とCPU8コアの物量があるので、CPU性能だけに目を向ければラズパイはおろか、周辺のミニPCともいい勝負ができるでしょう。

ar-ray.hatenablog.com


内蔵AIアクセラレーション(NPU)は?

CPUは別にROCK5 (RK3588) 以外にもいくらでも選択肢があるわけで、ここまで読む限りではRaspberryPiでもよくね?となるかもしれません。

ここからはハードウェアアクセラレーションも軽く試してみることにします。

RockchipのRK3588には、最大6TOPsのAI推論用のチップ(NPU)が搭載されています。

AI推論といえばGPU (NVIDIA-CUDA・cuDNN) の使用が浮かびますが、NPUはAI推論に必要な機能に絞っているため、小型・低消費電力でありながら高速に処理することができます。とにかく小型・省電力なので、最近ではスマートフォンやノートPCにNPUを搭載するモデルも増えているようです。

外付けデバイス無し・2万弱でこの性能は嬉しいですね。


YOLOXのアクセラレーション

Rockchipのnpu (rknpu)を使用したAI推論例はrknn_model_zooに揃っています。

github.com

私が公開しているリポジトリにYOLOX-ROSというものがありますが、現時点ではx86前提のものが多いので、新たにrknpu向けに機能を追加したいなと思っています。

なお、今回の記事で紹介する実装については既にGitHubに上げています。

2種類以上同時に動かすと(多分設定の不具合で)プロセスが落ちる場合があるので、API操作が間違っているなどあればissue・PRお待ちしています🙇

github.com


モデル変換

Rockchipのnpuでモデルを動かす場合はNPU向けの量子化(拡張子:.rknn)が必要です

airockchip/rknn_model_zooのyolox/python/convert.py でonnxモデルを変換します。

モデル構造がNPU向けに最適化されているので Megvii-BaseDetection/YOLOX で配布されているonnxは使用しないでください。


x86-64環境にAI用変換ツール(rknn-tookit2)の環境を構築した上でonnxを変換スクリプトで変換します。

python3 convert.py <path to yolox_s.onnx> rk3588


ROS 2との統合

とりあえずROS 2と統合していろいろなデバイスでお試しできるようにしました。

github.com

YOLOXのrknn実装はC言語で書かれておりrknn_model_zooにもOpenCVのC実装が入っていますが、これを使うとなぜかうまく実行できなかったので、毎度OpenCVのMat型からimage_buffer型に変換しています。

該当箇所

cv::Mat3b YOLOX::image_buffer_to_mat3b(image_buffer_t* image_buffer)
{
    cv::Mat3b mat(image_buffer->height, image_buffer->width);
    memcpy(mat.data, image_buffer->virt_addr, image_buffer->size);
    return mat;
}

image_buffer_t YOLOX::mat3b_to_image_buffer(cv::Mat3b* mat)
{
    image_buffer_t image_buffer;
    memset(&image_buffer, 0, sizeof(image_buffer_t));
    image_buffer.width = mat->cols;
    image_buffer.height = mat->rows;
    image_buffer.width_stride = mat->cols;
    image_buffer.height_stride = mat->rows;
    image_buffer.format = IMAGE_FORMAT_RGB888;
    image_buffer.size = mat->cols * mat->rows * 3;
    image_buffer.virt_addr = (unsigned char*)malloc(image_buffer.size);
    memcpy(image_buffer.virt_addr, mat->data, image_buffer.size);
    return image_buffer;
}

パフォーマンスを大きく落としてはいないので今のところはこれでよしとしています。


依存環境

OSはこちらを使用しました。

github.com

使用するボードを確認してimgを選択してください。SDカードやemmc、SSDなどに焼きます。

emmcやSSDだと設定を色々いじる必要がありそうです。

「SDカード不安定」と言われていますが、私は気にせずに使ってます。


Ubuntu22.04をインストールしたら ros-humble-desktopをインストールします。

Ubuntu (Debian packages) — ROS 2 Documentation: Humble documentation


librealsenseを使いたい場合は、Ar-Ray-code/installerのREADME_Raspbian内にある 2.54.2:v4l2debパッケージをダウンロードしてインストールします。

cd
wget https://s3.ap-northeast-1.wasabisys.com/download-raw/dpkg/librealsense/debian/bookworm/librealsense-v4l2-backend-app-bookworm-2-54-2-arm64.deb -O ./librealsense.deb # 2.54.2 (v4l2) / bookworm
sudo apt install ./librealsense.deb

sudo curl https://raw.githubusercontent.com/IntelRealSense/librealsense/master/config/99-realsense-libusb.rules --output /etc/udev/rules.d/99-realsense-libusb.rules
sudo udevadm control --reload-rules
sudo udevadm trigger

realsense_rosを使用する場合はlibrealsenseに対応したバージョンのブランチを切って後述の yolox_rk3588_ros と一緒にビルドします。


ビルド方法

mkdir -p ~/ros2_ws/src
cd  ~/ros2_ws/src
git clone https://github.com/Ar-Ray-code/yolox_rk3588_ros.git
bash yolox_rk3588_cpp/install.sh # パスワード入力

cd ..
colcon build

install.shlibrknnrt.solibrga.so/usr/local/lib にコピーするためのコマンドです。


実行方法

事前にimage_publisher など画像送信トピックを起動します。

モデルは yolox_s.rknn とします。

export TARGET_RKNN=./yolox_s.rknn
source ~/ros2_ws/install/setup.bash
taskset -c 4,5,6,7 ros2 run yolox_rk3588_ros yolox_rk3588_ros_node --ros-args -p model_path:=${TARGET_RKNN}

ros2 run の前に付いてる taskset -c 4,5,6,7 は、タスクを指定したCPUコア番号で使用することを指定しています。

0~3番目はCortex-A55、4~7番目がCortex-A76に割り当てられているため、後者の方がちょっとスピードが速いです。

あと、pub-subどちらも同じコアに割り当ててください。異なると動かなくなったりパフォーマンスが落ちることがあります。 (pub側が0~3のコアだったらsub側も0~3のコア)


以下、実行時の様子

yolox-m (INT8) まだまだ余裕ありそう

パフォーマンスはYOLOX-Mで12~14fps程度 (preprocess・postprocess含む) です。参考元のリポジトリの通りの性能が出ていることは確認できました。

量子化の影響か、tinyやnanoなど416x416の入力の推論だとガクッと精度が落ちてしまうので、sやm推奨です。

電力は測っていないのですが、RaspberryPi用の15WのACアダプタでも動いています。


まとめ

ビルドの過程でいろいろ試行錯誤したので、情報がまとまっておらず雑に書いていますが、省電力AIチップ何かないかなーと探している人には結構選択肢に入るのかなと思い書きました。

本当はハードウェアエンコードやカメラも試して1話完結させたかったですが、今後もちまちまと書いていこうと思います。

バスの降車ボタンで楽しいLチカライフ💡🚎(電子工作日記)

久々のほのぼの回(?)🙃


いつもの通りXを眺めていたら、日本AI界隈のインフルエンサー(裏の顔はからあげ帝国のトップであり闇のエンジニア)であるからあげ先生が秋葉原でなにかしら見つけたようで、話題になっています。

え、バスのボタンが売ってる…だと!?


秋葉原といったら電子部品のジャンク品も売っている電気街ですが、このようなジャンク品を見たのは初めてでした。(自転車やPCのジャンクは結構見かけますが…)

こんな楽しそうなパーツを見たのは久しぶりだったので次の日に買いに行くことにしました🏃


どこで売ってる?

秋葉原書泉ブックタワー5階にあります。

電子部品のジャンクコーナーかなと思ったら、鉄道・バスの書籍・ファン向けグッズの売り場の一角にあります。

他にも(本物の)吊り革や運転席にありそうな装置が置いてあったりと結構本格的なパーツ揃いです。

見た感じだとバスのボタンのみ電子工作に使えそうなので、これを2つ買うことにしました。

乗ってたバスから引きちぎってないですよ!!!

いつのタイミングで追加されるのかは分かりませんが、定期的に見に行こうと思います。

新たな楽しみができて嬉しいです。私も昔は鉄道にハマっていたので、その頃に行きたかったなぁと思いつつ書店をあとにしました。


とりあえず仕様確認

とりあえず分解しました。

売り場には「転売はしないでください」と書いてありましたが、「リバースエンジニアリングしないでください」とは書いていなかったので、申し訳なく思いながら分解することにしました(というか特殊ネジでもなかった)

タクトスイッチ側には51Ωの抵抗が入っており、LED側は1つのダイオードと5つのLED、1.5kΩの抵抗が入っていました。

ダイオードは1個あたり0.7Vくらい降下、LEDは1個あたり2Vくらい降下で10.7Vくらい降下するので、24Vくらいの電圧をかける必要があります。

ちなみに、何も知らずに12Vを入れましたが光りましたw(おい)🙃

配線は黒がGND、緑がスイッチ用の接点(単純なGNDへの接点)、白がLEDのアノードということになります。

XHコネクタを取り付けてLet's 電子工作!!


Arduinoで楽しい電子工作!

シンプルなLチカ回路を作成しました。

パーツは次の通り

これらのパーツで回路を作りました。

ArduinoのBlinkを動かします。

not回路になっているので、ArduinoのLEDが消えたタイミングで降車ボタンが光り、LEDが点いた時に消えます。

これまでのどのLチカよりも楽しかったですね。

こういう面白いパーツがあればどんどん買っていきたいですね😀

ラズピコWではじめるROS 2(micro-ROS・RaspberryPi Pico W)

クリスマスプレゼントにぴったり?なメカナムロボットを買った(電子工作日記) - えいあーるれいの技術日記の続きです。

今回は、Wi-Fiに繋がるRaspberryPi PicoWにmicro-ROSを載せちゃおうという試みです。


RaspberryPi Pico

RaspberryPi PicoはRaspberryPi財団が開発したマイコンチップ「RP2040」を搭載したボードです。

チップ自体はCortex-M0+という低価格・省電力重視仕様ですが、デュアルコアでベースクロック133MHzからさらにスピードを上げることができます。

突き詰めれば色々と遊べますね。

(実際、1GHzまでOCする強者も…🔥)

www.raspberrypi.com

ちなみに、「RaspberryPi(ラズパイ)」はシングルボードコンピュータを指すため、区別してラズピコと呼んでいます。


Pico W

RaspberryPi Pico W (ラズピコW)は、ラズピコに無線チップ「CYW43439」を外付けしたモデルです。

Wi-Fi (2.4GHz) とBluetoothに繋げられるモデルですが、1200円くらいするので、ESP32チップ単体と比べるとなかなか悩ましい価格です。

プラットフォームや消費電力で比較することになりそうです。


micro-ROSとは?

micro-ROSとは、ROS2ノードとマイコンを接続するプロジェクトです。

他のROS2↔︎マイコンのプロジェクトと比較すると、幅広くプラットフォーム・デバイスをサポートしており比較的構築が簡単です。

ROS2との接続には、ホストPC上にmicro-ros-agentというROS2ノードを立ち上げる必要があります。

micro.ros.org

micro-ROS自体はプラットフォーム非依存のライブラリなので、ArduinoだけでなくESP-idfやRaspberryPi-Pico SDKでも使えます。


ラズピコ自体はmicro-ROSでサポートされていますが、UARTのみとなっていました。

github.com

Wi-Fiは自分でサポートしないといけないのかなと思ってフォーク先を漁っていたら、ありました!ラズピコW用のリポジトリ🤩

github.com

これだと少々使いにくかったので、コードを整理してUARTとWi-Fiを切り替えられるようにしました↓

github.com

これで、rpi-pico-de-hajimeru-ros2ができますね😉


使い方(4輪メカナムロボットの場合)

リポジトリは以下のURLより

github.com

TwistでデータをsubscribeしてTimerを回してデータが来ていない場合は速度をゼロにするだけの簡単なプログラムです。

analogWriteで全てを解決してきた自分としては、クロックからPWM生成とか訳わからんすぎでしたね。(PWMの部分(自分用)


ちなみに、動作確認についてですが、動きはしたもののモータの回転速度が全然違ったり唐突に接続が切れたりでちょっとキレそうになっていました…

フィードバックがない上に制御よわよわなのでちょっと今の状態では厳しいかも‥と思い、一旦諦めです😖

もしかしたらXに動画上げるかも

進捗(特になしw)

モータをDynamixelに変更して再挑戦ですね‥(原型留めていないのでは?


RaspberryPi4でRealSenseを2台接続する方法(RealSense・ROCK5・RaspberryPi4・v4l2-backend)

RaspberryPi 4でRealSense viewerは動きます🍓📷 (Bookworm・RealSense) - えいあーるれいの技術日記 の続きです。

おそらくこれで暫くのRealSenseネタは出し切ったと思います。


過去のRealSense芸


今回の内容、簡単に言えば

「新しめのLinuxは元からv4l2バックエンドのRealSenseに対応しているから、性能が足りればARM64でもlibrealsenseを使えるよ!」

というものです。

これは他のARM64デバイスでも通用するのでぜひご覧ください!


RealSenseの動作モードについて

RealSenseはUSB3.0経由でデータの送受信を行いますが、Linuxで扱う場合、RealSenseではlibuvcとv4l2の異なるバックエンドを使用することができます。

libuvcはマルチプラットフォームサポートを重視しているため、v4l2の方が効率的にリソースを割り振ることができます。

そのため、マルチカメラを使用するためにはv4l2バックエンドを使用する必要があります。

元々LinuxではRealSenseのv4l2サポートはされていなかったので、カーネルパッチを自分で当てにいく必要があったのですが、これはIntel CPU限定のサポートでした(RealSenseがIntelに入っているのでそれはそう)

ゆえに、複数カメラを使う場合はIntelCPUが搭載されているx86-64マシンを使用する必要があります。


RaspberryPi Bullseye世代のLinuxカーネルではv4l2バックエンドでは動かなかったのですが、Bookwormではその機能が統合されたようで動くようになっていました。


インストール方法

前回同様、RaspberryPi Bookwormを使用します。

  • librealsense 2.54.2
  • v4l2 backend
cd
wget https://s3.ap-northeast-1.wasabisys.com/download-raw/dpkg/librealsense/debian/bookworm/librealsense-v4l2-backend-app-bookworm-2-54-2-arm64.deb -O ./librealsense.deb # 2.54.2 (v4l2) / bookworm
sudo apt install ./librealsense.deb

sudo curl https://raw.githubusercontent.com/IntelRealSense/librealsense/master/config/99-realsense-libusb.rules --output /etc/udev/rules.d/99-realsense-libusb.rules
sudo udevadm control --reload-rules
sudo udevadm trigger

sudo ldconfig

Ar-Ray-code/installer で定期的にメンテしています。


使用方法

RealSenseの型番によりますが、外部からUSB給電した方がいい場合もあります。

realsense-viewer

1280x720x30fpsできました!(30fpsで回っているとは言っていない)

CPU使用率が常時200%を超えてフレームがドロップしまくっているのでスペックが少し厳しめという判断です。

RealSense芸としては十分ですが、実用上は厳しめでした🙃

CPUスピードが3倍と言われているRaspberryPi5に期待ですね🍓


ROCK5なら?

ここ5年の爆発的なIoTブームを背景にシングルボードコンピュータも多種多様になっていますが、RaspberryPi以外にも安価で高性能なボードがあります。

それがRockChip CPUです。

今回は、現行最も高性能で安価な「ROCK 5 Model A (4GB RAM)」を使用します。

ROCK5 Aとは

ROCK5 Aはシングルボードコンピュータを開発・製造しているRadxaのボードです。

RaspberryPi 5 ModelBと形状が似ており、他の製品についてもほとんどラズパイのCPU以外は全部パクリと言ってもいいでしょう。

これらのボードのほとんどにRockchip社のCPUが搭載されています。

ROCK5シリーズには4GB〜16GBのRAM構成が選べたり、M.2が挿せたりします。Wi-Fi Bluetoothはありませんが、M.2で補完できるしそもそも技適の心配をする必要がないのはいいですね。

RK3588のスペック

RK3588にはCortex-A76とCortex-A55が4コアずつ入っているbig.LITTLE構成のCPUが搭載されています。

big.LITTLE構成は、それほど処理性能を必要としていない処理を低消費電力コアで、パフォーマンスが必要な処理を高速コアで処理させることで、省電力ハイパフォーマンスを実現するアーキテクチャです。

スマートフォンでよく使われる構成らしいですが、IntelのCore-i 12世代〜14世代もこれと類似する機能を持っています。

今回の記事では、省電力ハイパフォーマンスとかは無視で、そもそも物理的に8個あるのスゲーという扱いです。


AIアクセラレーションはどうなのかというと、8K出力できる程度のGPU (Mali-G610) と専用のNPUを搭載しているそうです。

GPUは610GFLOPS (FP32)と最近の低価格帯のノートPCといい勝負ができるくらいのスペックはありそうです。

NPUはYOLOv5-sが40fpsで6TOPSの性能があるそうです。

Google Coral USBアクセラレータが4 TOPS (INT8) なので、それに近い性能が内蔵されているみたいです。

何も追加せずとも十分強い。


動作確認🪨

早速動作確認します。

使用したOSはUbuntu22.04 Desktopです。

8コアちゃんと認識されています。

ちなみに、シングルボードコンピュータならでは?のグラフィックスのもたつきもないです。すごい進化。


先ほどのRaspberryPi OSで使用したRealSenseのインストールコマンドをそのままUbuntuで実行します。(バイナリが同じで動的リンクも同じなので本当にそのまま動いちゃいますw🙃)

先ほどのRaspberryPi4とは打って変わってサクサクです。CPU使用率もまだ余裕ありそうです!

RaspberryPi5が技適通る前にRK3588をしばき倒して周りと差をつけちゃいましょう🏃


おまけ

rochchipではじめるROS 2!?

ROS2をチュートリアルページと同じ要領でインストールしてRviz2を起動させてみました。

しっかりと動作しました。

30fps超えなので、Jetson CUDA抜きが欲しい人には朗報ですね。

…そして、私のrpi-bullseye-ros2はもうサ終ですね(しません)😮


rpi-bullseye-ros2とは?(GitHubリポジトリ)↓

github.com


あの使いやすそうなディスプレイは何!?と思われた方へ

Amazonのタイムセールで買ったハイコスパモバイルディスプレイです。

ar-ray.hatenablog.com


誰だよこのつよつよは!?と思われた方へ

週1ペースでゆるーく手を動かして得られた知見を発信している闇(?)のよわよわエンジニア見習いです😉

↓ぜひスポンサーしてね♡

Sponsor @Ar-Ray-code on GitHub Sponsors · GitHub