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

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

リード線付き表面実装LEDを自作してみた

 小さいものの工作をするときに便利な部品の一つにLEDがあります。LEDは、取り付けるだけでアクセントとなるので重宝します。また、鉄道模型などを作成するときにLEDが必要な場合があります。

 秋月電子などの電子部品の取り扱い店では表面実装LED(1608等)をリード線に取り付けたものが売られています。(参考→https://akizukidenshi.com/catalog/g/gI-09957/)質はいいとは思いますが、値段は1つ30~40円と壊れるリスクを考えると少々お高めです。また、リード線は見た感じ曲げにくい形状をしています。

 最初から用途ががっちりと決まっていれば、迷わず購入するところですが、私のようにお金のない学生にとっては送料を含めて少し痛い出費になるので、手持ちの表面実装LEDとリボンケーブルを使ってリード線付き表面実装LEDを作りました。

1回目

f:id:Ray_ar:20210326120518p:plain

 1回目の試作は、卒研発表会前日に作成しました(馬鹿か)。

 少し太めの線で作りました。リボンケーブル側にはんだを盛ってからLEDとはんだ付けするようにするとそこそこうまくいきます。しかし、接触があまりよくなかったみたいで、場合によっては通電しないことがありました。また、線が太かったので曲げにくく、線が目立ちました。

2回目

f:id:Ray_ar:20210326120548p:plain

 2回目は、1回目の反省を踏まえてより細いリボンケーブルを採用しました。また、導線を露出することで、さらに細くしました。絶縁については、片方のケーブルをセロハンテープで包むことにしました。(ショートしても、抵抗があるので大丈夫です)

 また、LEDと導線のはんだ付けについても少し改良しました。これまでは、線の先とLEDの極をはんだ付けしていましたが、線の腹の部分とLEDの端子をはんだ付けして線をカットしました。「見た目くっついているけど実はくっついていない」事故を回避するためです。

ライトセーバー風にアレンジ

 2回目で製作したリード付LEDをライトセーバー風にアレンジしました。

f:id:Ray_ar:20210326120607p:plain

剣については、ダイソーで購入したお弁当用のピックを加工して作りました。LEDとピックはホットボンドで接着しました。

おわりに

 既製品よりもフレキシブルなリード付LEDを自作することができました。さらに細さを突き詰めていけば布への組み込みも可能になるかもしれません。難易度は高いですが、次はフルカラーLEDをリード付きにしたいですねー。

ROS2-Foxyで動画をPublishするシンプルなプログラムの作成

 https://ar-ray.hatenablog.com/entry/2021/03/26/180000の実装時の話です。

 ROS2の動画をパブリッシュする公式パッケージってどこなんですかーー

ということで、ROS-Melodicの時によく使っていたmovie_publisherをROS2仕様にしました。自分で使うようなので、特にパラメータを渡すということはしていません。いずれ実装するとは思いますが…

 プログラムはGitHubにupしています。

https://github.com/Ar-Ray-code/movie_publisher/blob/foxy/src/movie_publisher.cpp

実装

パブリッシュしている部分を抜粋して簡単な解説をします。

movie_pub(const std::string &name_space, rclcpp::NodeOptions options):rclcpp::Node(name_space, options)
{
// 1で解説
    name = "/home/ubuntu/Desktop/video.mp4";
    cv::Mat image;
    cv::VideoCapture camera(name.c_str());

    if (!camera.isOpened()) {
        std::cout << name << " failed to open camera." << std::endl;
        exit(1);
    }
// 2で解説    
    rclcpp::Rate looprate (camera.get(cv::CAP_PROP_FPS));

    image_pub = this->create_publisher<sensor_msgs::msg::Image>("image_raw",1);
// 3で解説
    while(rclcpp::ok())
    {
        camera >> image;
                
        header.stamp = system_clock.now();
        header.frame_id = "/map";

        msg = cv_bridge::CvImage(header, "bgr8", image).toImageMsg();
        image_pub->publish(*msg);
        looprate.sleep();
    }
}

1. 動画ファイルのオープン

 動画ファイルの名前を指定してVideoCaptureクラスのcameraを作成する。cameraが開けない場合はエラーとなります。

2.パブリッシャ用の宣言

rclcpp::Rateは、While処理中のROSが周期的にトピックを公開し続けるために必要です。レートは動画のフレームレートを参考に取得します。

create_publisherはトピックの公開を行うために必要です。

3.ループ処理

 whileからは動画を1フレームごとに送信してきます。sensor_msgs::msg::Image型はheaderとimageで構成されています。header.stampには時間、header.frame_idには座標系、imageにはcv_bridgeで変換した後の画像データが格納されます。

 データを全て格納したら、image_pub->publish(*msg)で公開します。

 全てのフレームを切り出したら、勝手にノードが終了します。

気になるところ・追加したい機能

  • frame_idはどのように宣言すべきか:適当なフレーム名だとエラーになってしまったので/mapとしたが、本来はどうあるべきなのか。Parameterで指定したほうがよさそう。

  • ループ再生や逆再生・早送りを実装したい:Qtで実装すればよさそう。その場合は、フレームをカウントする必要がありそう。

単眼YOLOトラッキングを可能にするdarknet_trackingの解説

 motpyのサンプルをROS2に実装してみた(motpy_ros) - えいあーる・れいの技術日記の続きです。

 前回のプログラムでは、motpyを使用したサンプルプログラムを動かしただけですが、これをROS2に移植して終わりだと、作者の考える本来の使い方を無視しているなーと感じ、プラグインのような感覚で使用できるようにしたいと考えました。

 私がよく使用しているリアルタイム物体検出はDarknet(darknet_ros)ですが、darknetは単眼カメラ追跡はできていない(気がします)。そこで、darknet_rosの出力を使用してオブジェクトトラッキングを実装しようと思いました。

 ソースコードは以下のリポジトリにあります。ROS-Foxyでの動作を確認しています。

github.com

f:id:Ray_ar:20210325093710p:plain

遷移図

 次に遷移図を示します。

f:id:Ray_ar:20210325104159p:plain

 darknet_rosは画像を入力し、BoundingBoxesメッセージを出力します。motpyはボックスの情報をもとにトラッキングデータを返却するので、darknet_trackingプログラムはBoundingBoxesと入力画像に対してコールバック関数を呼び出す必要があります。motpyはボックスのデータを使用してidを割り振ります。(このプログラムを作成するまで気づかなかったのですが、motpy自体は画像処理を一切してないです。)

 id振り分け後はBoundingBoxesのフォーマットに直して再パブリッシュします。また、表示用に描画を行い、Imshowで画像を表示します。

 入力と出力はどちらもdarknet_ros_msgsのBoundingBoxesなので、darknet_rosと互換性のあるプログラムならプラグイン感覚で使用することができます。Webカメラでこれが実現してしまうのすごい!

デモ(ツイートを参照)

 動画はニコニ・コモンズの素材を使用しています。

おわりに

 この記事ではmotpyをdarknet_rosに対応させました。単眼物体追跡をここまでシンプルな入力で実現してしまうことを知り、ソフトウェアの力ってすげーと改めて感じました。設定項目をパラメータ化したりする作業があるので、まだまだ改良していきます。

超自由なラズパイを入手!CM4のeMMCセットアップの方法まとめ(画像)

 Compute Module4(CM4)を入手しました。

f:id:Ray_ar:20210324082424j:plain

 本来は2020年10月19日発売の商品ですが、switch-scienceでは2020年2月24日から取り扱いとなり、かなり待ちました。(switch-science様ありがとうございます。)CM4は産業用のモジュールであるため、組み込みを見据えた研究に使用する予定でもありますが、このモジュールにかなり可能性を感じているため、ほかの用途でも使用したいと考えています。そのために、基板の製作も考えています。

CM4の構成

 購入したものは、CM4単体とIOボードです。CM4は32種類あるそうですが、今回は無線無し+eMMC32GB+RAM2GBの構成です。

www.switch-science.com

www.switch-science.com

セットアップ(eMMC型)

 セットアップの方法はFlashing the Compute Module eMMC - Raspberry Pi Documentationにあります。ここでは画像を使って詳説します。

 まず、eMMCセットアップのために配線を行います。配線は、J2の(disable eMMC Boot)を短絡し、SlaveポートにUSB microBを接続し、Windows10 PCと接続し、ボード右下の電源に5~12Vの15W電源を投入します。(図では示していませんが、右下のDCジャックに電源の配線をしてください)

f:id:Ray_ar:20210324084840p:plain
配線

 次に、Windows側のブート環境を整えます。(最初は、CM4を認識しません)以下のリンクからrpiboot_setup.exeをダウンロードします。

 そして、ダウンロードディレクトリから起動します。全てデフォルトの状態で進めていいです。この後に起動するrpiboot.exeはデフォルトではC:\Program Files (x86)\Raspberry Piにインストールされます。

f:id:Ray_ar:20210324090505p:plain

 インストールが完了したら、次はrpiboot.exeを起動します。この時にCM4 IOボードにはeMMCブート無効で電源が入っている状態でWindows10 PCと接続されていることを確認してください。

 プログラムは自動実行されます。成功すると、「USBドライブ」という名前でCM4が認識されます。

f:id:Ray_ar:20210324090925p:plain

 あとは、SDカードにイメージを焼くような感覚で書き込みます。ここでは、Raspberry Pi Imagerを使用して書き込みます。

f:id:Ray_ar:20210324091319p:plain
RPI_imagerの画面

 書き込みが終わったら、J2の短絡を解除して再起動させます。SSH接続が成功すれば、普通のUbuntu Serverとして動きます。

f:id:Ray_ar:20210324091552j:plain
Tera Termの画面

まとめ

 CM4(eMMCタイプ)のセットアップをまとめました。SDカードの取り出しやクローンが必要ない場合にはSDカードのスペースがない分有利ですし、セットアップに手間や専門的な知識はそれほど要求されないのでeMMCタイプもありだなとは思いました。

 CM4のIOボードは12Vのファンをデフォルトでつけられたり、最初からRTCを実装できたり、PCIEx1のスロットを使用できたりとかなり自由度の高い構成となっています。産業用のRPIではありますが、ロボコンRaspberry Piを使用しているところや検討しているところにこそお勧めできるモジュールかもしれないと個人的には思いました。

f:id:Ray_ar:20210324092646p:plain
自由度の高いRaspberry Pi!?

USBポートの有効化

 デフォルトでは低消費電力モードでUSBポートが有効化されていない。

 そのため、config.txtにdtoverlay=dwc2,dr_mode=hostを27行目付近に追記します。これでUSBポートが有効になります。

f:id:Ray_ar:20210426234750p:plain

motpyのサンプルをROS2に実装してみた(motpy_ros)

 きっかけは、PINTO氏のツイートです。

 単眼の映像で高速オブジェクトトラッキングをしているのを見て驚きました。そして次に、「ROSでこのライブラリを使いたい!」と思いました。

 今回は、motpyのサンプルプログラムをROS2に移植したので、その説明をします。


motpyとは?

 motpyとは、通常の物体検出プログラムを物体追跡プログラムにしたい人のためのライブラリです。余計な手間をかけずに複数の物体追跡が可能です。また、シンプルな物体検出ならRaspberry Piで動くほど軽量です。

github.com

 YOLO v5での活用例もあるみたいです。

github.com

darknet_ros_msgsとは?

 ここで、darknet_ros_msgsについて説明します。今回作成したリポジトリでは、バウンディングボックスのパブリッシュにdarknet_ros_msgsを使用しました。

 darknet_ros_msgsは、ROS界隈では有名な物体検出リポジトリであるdarknet_rosで使用されているメッセージです。詳細は以下のリンク(GitHub)から確認してください。

github.com

インストール

 作成したリポジトリは以下のリポジトリにあります。

github.com

 ROS2 Foxyを前提とします。

$ sudo apt install ros-foxy-v4l2-camera
$ pip3 install opencv-python motpy

$ source /opt/ros/foxy/setup.bash
$ cd ~
$ mkdir -p ros2_ws/src
$ cd ros2_ws/src
$ git clone https://github.com/Ar-Ray-code/motpy_ros.git
$ cd motpy_ros
$ git checkout motpy_ros
$ cd ~/ros2_ws
$ colcon build

デモ

 ウェブカメラを接続します。初回実行時は、${HOME}/.cache/motpy/にウェイトファイルがダウンロードされます。

$ source /opt/ros/foxy/setup.bash
$ source ~/ros2_ws/install/local_setup.bash
$ ros2 launch motpy_ros face_tracking.launch.py

f:id:Ray_ar:20210321191308j:plain
実行結果

 motpyはとても高速で便利なライブラリなので使いこなしたいと思いました。成果があれば、プログラムの種類も増やしていく予定です。