2025年の振り返り

1月

ContactGlove2を入手、テスト

2月

自作ロボットハンド改良、15DoF化

バレル研磨機を購入、それに合うサイズの小型防音箱を作成

バレル研磨機で金属3Dプリントしたギアを研磨

ContacClove2と自作15DoFロボットハンドの連携テスト

自作ロボットハンドにPIP軸に連動するDIP軸を追加

第3回OpenArm勉強会でロボットハンド関連の調査結果を発表

自作ロボットハンドのDIP軸をPIP軸を弾性で連携させるように改良

3月

自作サイクロイド減速機(37:1)とRollerCAN-Liteによる自作アクチュエーターのテスト

ContactGlove2と自作ロボットハンドのリーダーフォロワー連携の最適化

4月

Teensy 4.1及び自前設計のPCBを使用し自作ハンドトラッキングバイスの改良

自作ハンドトラッキングバイスの動作確認とカバー追加

15DoFリーダーフォロワーハンドシステムの動作確認

5月

自作ハンドトラッキングバイス紹介動画をYouTubeに投稿

Feetech HLS3950Mサーボを入手

7-DoFアーム + 15-DoFハンドのテレオペレーションテスト

ルービックキューブ回転の初トライアル(双腕7-DoFアーム + 15-DoFハンド)

6月

自作ロボットハンドの指のカーバーを作成

形状ソーティング玩具のテレオペレーションテスト

SO-101アームの構築とテレオペレーションテスト

7月

Maker Faire Tokyo 2025出展承認(双腕7軸 + 15DoFハンドのテレオペレーションデモ)

XT30(2+2)のケーブル自作にチャレンジ

8月

DAMIAO高トルクモデル(DM-J6248P-2EC)入手

9月

MyActuator X2-7,X4-10,X4-36,X6-60入手

Maker Faire Tokyo 2025準備

10月

Maker Faire Tokyo 2025出展(テレオペ + VLAファインチューニング自律動作)

RTX PRO 6000 Blackwell Max-Qを入手

DAMIAOクロスローラーベアリング付きモデル(DM-J4310P-2EC))入手

11月

MyActuatorのEtherCAT制御初テスト

4チャンネル双方向制御(力覚フィードバック)テスト

DAMIAOクロスローラーベアリング付き48Vモデル(DM-J4310P-2EC, DM-J4340P-2EC)入手

12月

7-DoFロボットアームのアップデート(関節制限、安全カバー、配線内蔵)

総括

  • 自作ロボットハンドとアームの改良を行い、テレオペレーションデモをMakerFaire 2025に無事出展
  • EtherCAT対応MyActuatorでEtherCATに入門、バイラテラル制御に入門
  • VLAなどのテストやローカルLLMの検証などを目的としRTX PRO 6000 Max-Qを購入し多分人生で一番高額な買い物となった

2024年の振り返り

1月

UFACTORY Lite 6のリーダーフォロワーでサイコロ投げやUSB刺しタスクなどの実験

小型の安定化電源として話題になったDP100を購入

便利なのでリーダーフォロワーシステムのリーダ側のDynamixelへの電源供給で常用するようになった。

UFACTORY Lite 6用のリーダーフォロワーシステムのリーダー側グリッパーハンドルを改良

自作UFACTORY Lite 6用のリーダーフォロワーシステムをGELLOの論文著者の提案を受け、GELLOレポジトリに統合

github.com

サザエさんで登場した「自動大根おろし機」をUR3(6軸ロボットアーム)+2F-85(グリッパー) + FT300(トルクセンサ)で再現

2分で大根おろし64g(約1人前)の製造自動化に成功 youtu.be

自作平行グリッパーをPA6-CFで印刷し強度の強化を図る

フォースゲージを購入しRobotiqのグリッパー2F-85の端力を計測

2月

フォースゲージで自作グリッパーの端力を計測

63Nだったので2F-85の1/4程度の力しかないが自分の指の力も60N程度だったので、グリッパーとしてはこのぐらいあれば大体のタスクはこなせるという感想を得た

4月

ROBOTISからDYNAMIXEL-Yシリーズが発売されているのを発見したが、値段的に購入は断念

UFACTORY Lite 6用のリーダーフォロワーシステムのリーダー側に重力補償と摩擦補償を実装しテストした

上記過程でXL330-M288-Tを一つ破損

5月

Unitree G1というヒューマノイドロボットが発表され、16000ドル~という価格に驚いた

オプションを入れると結構値段が高くなりそうで買うのはまだまだ先になりそう

第45回ロボティクス勉強会でUFACTORY Lite 6のリーダーフォロワーシステム作成について発表

speakerdeck.com

CyberGearを2つ購入

サイクロイド減速機を3Dプリンタで自作

31:1から始まり37:1, 45:1, 77:1を作成。すべてバックドライブまで確認。高くなるがそのうち金属化したい。

youtu.be

6月

LKMTECHのブラシレスモーター+ドライバ+遊星ギア一体系のアクチュエータを購入

igusの低摩擦フィラメントi150-PFを購入

自作サイクロイド減速機の内部の摩擦を減らせるかなと期待したがそこまでPLAと差が無さそうという結論になった

アクチュエータのトルクのテスト自動化のため安定化電源の電流とフォースゲージの表示値をウェブカムで取得し、GPT-4oで読ませて集計の自動化

Maker Faire Tokyo 2024は再び落選

来年はよりオリジナリティのある内容で出展を狙う

アクチュエータのトルクテストで高負荷にも耐えられるようにレバーをPAHT-CFで印刷

40Nm程度のトルクテストでも耐えられるようになった

SteadyWinのデュアルエンコーダー+ブレーキ搭載版GIM6010-36をカスタムオーダーで入手

電磁ブレーキ開放時の発熱が大きく、かつ重量もかなり増え、ソフトウェアの使用感などもあり使用は断念

7月

LKMTechのアクチュエータで自作7軸ロボットアームを作成

ブラシレスモータの制御の勉強をしようと思い本を買う

ブラシレスモータの勉強用にmoteus-r4, c1を購入

OAK-D Short Range PoE with ToFを入手

8月

中空のアブソリュートエンコーダを入手

そのうち中空のアクチュエータを自作したい

Feetechの電流制御対応サーボモータのHLS3606Mを入手

自作7軸アームロボットのアクチュエータをDamiao製に変更し、リーダーフォロワーシステムの動作に成功

自作7軸アームロボットに1kg-2.1kgのおもりを付けて動作確認

自作7軸アームロボットの先端2軸を直交させるデザインに変更

9月

7軸アームの2つ目を作成し、双腕リーダーフォロワーシステム化

HLS3606Mを使って16DoFの自作ハンドを作成

1kgの把持をテスト

16DoFの自作ハンドの電流位置制御の性能をテスト

KiCadで自作ハンド用の簡単なPCBを作成

10月

自作ハンドを操作する外骨格デバイスを作成

自作ハンドのデバッグ用にOSSのハンド模型を印刷

RollerCAN、RollerCANLiteを入手

11月

GoPro Hero 13を購入、400fps撮影をテスト

自作16DoFハンドと外骨格デバイスを接続、リーダーフォロワー動作のテスト

12月

第2回OpenArm勉強会で16DoFハンドと外骨格デバイスを展示

BlackFridayのセールで購入したSpaceMouse Wireless Kit 2を開封

総括

  • 例年とは違い今年のガジェット支出はアクチュエータがメインとなった
  • アクチェータの低価格化が一気に進み手が出しやすくなった
  • いつかやりたいと思っていた自作多関節アームロボットを作ることができて満足
  • 自作ハンドもいつかやりたいとは思っていたので今年ある程度できたのは大きな進歩
  • 自作ハンドは強度・操作性等課題が多く来年もアップデートをしていきたい
  • 自作Lite 6用リーダーフォロワーシステムをGELLOへコミット出来て一定のユーザーに問い合わせ等もらい手ごたえを感じた

2023年の振り返り

1月

OAK-D ProとFEMTOのポイントクラウドの比較動画を作成

詳細3次元点群処理を読み終える

OpenParallelGripperのプロモーション用動画を作成

ML-Agentsで深層強化学習にトライ。Google論文にあるタスク複数について成功

自作グリッパーをUR3に対応させる実験

2月

Unity ML-Agents実践ゲームプログラミングを読み終える

やや出遅れたがChatGPTを試し、その性能の高さに感動する

ML-Agentsで黄・青球入り容器から青を取り出すタスクを深層強化学習で行う

3月

WhisperとGPT-3.5のAPIとVOICEVOXを組み合わせて音声会話できるエージェントを実装して遊ぶ

4年ほど使用していたCLOVA Friendsがサービス終了で使用できなくなった

4月

DOBOT MG400を入手

5月

OpenParallelGripperを改良し、Dynamixel XL-330を採用と共に薄型・軽量化を行う

Kickstarterで低価格7軸ロボットのLucid ONEをバック

7月

OpenParallelGripperの内部で使用するボードをOpenRB-150に変更し内部がシンプルになった

8月

PyBulletに入門し、UFACTORY Lite 6の動作をシミュレーションした

逆運動学解法のSR-Inverseを自分で実装しPyBulletでシミュレーションに使用し理解を深める

PyBullet上でKUKA LBR iiwaの動作シミュレーションを試す

PyBullet上のシミュレーション動作とUFACTORY Lite 6実機を同時に動かす

9月

雲行きが怪しいと噂されたFranka Emikaのシミュレーションをなんとなく試す

RealSense T265でUFACTORY Lite 6のTCPをシミュレーション上及び実機で操作する

RealSenseのRGB画像とロボットの姿勢から模倣学習でスプーンで緑の豆のみを拾うタスクを学習させる

自前実装のPythonの逆運動学コードが遅いのでChatGPTを使ってC++に移植し、爆速になった

10月

Meta Quest 3を購入

11月

OpenParallelGripperのXL-330版を公開

Bambu Lab X1-Carbon Comboを購入

前から気になっていたOSSの4指ハンドLEAP Handを作成

ソフトグリッパーをOpenParallelGripperに取り付けて実験

第42回ロボティクス勉強会で「RealSense T265とD415とUFACTORY Lite 6で模倣学習の実験」というタイトルで発表

SUNLUのフィラメントドライヤーFila Dryer S2を購入

https://x.com/EL2031watson/status/1729841895973470270?s=20

Dynamixelをリーダー、Lite 6をフォロワーとするリーダーフォロワーシステㇺを自作

12月

Jetson Orin Nanoを購入

自作リーダーフォロワーシステムのグリッパーも連動させて、色々なタスクを試す

PLA-CFを使用してグリッパー爪を印刷

リーダーフォロワーシステムを双腕化

東明テックの食品乾燥機プチマレンギminiが80℃まで出せてフィラメント2つ入れられることを発見しフィラメントドライヤーとして購入

PA6-CFの印刷にチャレンジ

リーダーフォロワーシステムのプログラムを改良及び机を耐荷重200kgのものに差し替えて操作が滑らかになる

総括

  • 相変わらずガジェットにつぎ込んだ。Bambu Lab X1-Carbon Comboは印刷スピード、印刷品質共に大幅に向上し満足。
  • ML-Agentsで深層強化学習に入門、自作タスクも学習させることができたが報酬設計の難しさを感じた。
  • 多関節ロボットの逆運動学の自前実装を行い、理解が深まった。
  • UFACTORY Lite 6をRGB画像を使って動作生成する模倣学習にチャレンジし、ロボット実機を機械学習を使って動かすことができた。Transformerへの理解も深まった。(実装方針に関してはALOHAの論文がかなり参考になった)
  • Gelloというリーダーフォロワーシステムの論文を見て面白いアイデアだと思い、UFACTORY Lite 6版を自作するに至った。T265を使ったリーダーフォロワーシステムと比べて特異姿勢に気を使う必要が減り、グリッパーも操作できるようにして利便性が大幅に向上した。
  • 突如出てきたGPT-3.5, GPT-4の驚異的な性能に日々世話になった。来年どうなるのか全く想像ができない。OpenAIのAPIを使ったロボット動作生成もそのうち試してみたい。

2022年の振り返り

1月

セールになっていたTipronを購入。

長年使っている3DプリンタCR-10Sのマザーボードを取り換え、静音化を実現。

2月

3月

Kickstarterでバックしていた7軸アームロボAmber B1が到着。

RealSense D405を入手。

4月

ロードセルで遊んだ。

5月

ロードセルをxArm先端に取り付け、荷重計測をテストした。

6月

MakerFaireの出展期限を勘違いし、応募に失敗。

7月

xArmの先端に取り付けたロードセルを使って背中マッサージロボットの試作を行った。

LIPSedge DLを入手

羽田空港近くのai_scapeに行ってきた。

CCDIKをUnityで試してみる。

8月

CNC加工を始めて海外業者に発注。以後頻繁に使うようになる。

深度カメラ9種類のポイントクラウドの比較動画を公開。

6軸力覚センサーのFT300を入手。Python用のライブラリを作成してpypiで公開。

pypi.org

github.com

MetaCatを入手

サイボーグハンドを組み立てた

深度カメラ9種のポイントクラウド比較動画(高難易度な物体の点群比較)を公開。

Stable Diffusionをテスト

9月

Orbbecの深度カメラFEMTOを入手

27インチ4Kモニターを入手

OAK-D Proを入手

10月

KickstarterでバックしていたUFACTORY LITE 6を入手。

11月

LITE 6用の平行グリッパー作成(バージョン1)。ストロークは50mmと純正のグリッパーの3倍以上を達成。

DYNAMIXELに入門

REALFORCE を入手

ATOM Liteと拡張モジュールを買い集める

12月

金属3Dプリントに初トライ。

LITE 6用の平行グリッパーをアップデート(バージョン2)

ATOM S3を入手

LITE 6用の平行グリッパーをオープンソースとして公開

github.com

総括

  • 相変わらずガジェットにつぎ込んだ。今年はAmber B1とUFACTORY LITE 6と2つの新しいアームを入手した。

  • Amber B1は待望の7軸アームだったが、エンコーダーが絶対位置を把握できない仕様のため、起動ごとにキャリブレーションが必要になり、かつ正確な位置合わせが難しく使い勝手の良くない状態だった。

  • UFACTORY LITE 6はxArm 6より小型、安価で作りは値段のわりによくできており、SDKもxArmと共通のものが使えてかなり使い勝手がよかった。付属の平行グリッパーのストロークが16mmととても短く、使い勝手が良くなかった。おかげで自分で平行グリッパーを作ろうという意欲がわき、色々な学びがあった。

  • CNC切削の海外サービスを利用し、比較的安価に金属部品を製造できることがわかった。今後も試作に積極的に利用する予定である。

  • YouTubeに初めてそれなりに動画編集をした動画をアップロードして、動画編集の大変さを身をもって感じた。しかし比較的反響を得られたのでやった甲斐はあった。

  • LITE 6用の平行グリッパープロジェクトに今年の最後の時間の多くを投入し、ほぼゼロからロボット用のグリッパーを作成することができた。Modbus-RTUへの理解が深まったり、部品の選定・軽量化・メンテナンス性・組み立てやすさ・取り付けやすさ等様々な設計上の制約を乗り越えてハードウェアを作成する困難さを感じた。

2021年の振り返り

1月

Anycubic Mega Proの運用を開始

第四級アマチュア無線技士試験合格

第一級アマチュア無線技士試験も受けるので、免許の申請は保留。(12月に結局申請)

2月

myCobotのグリッパーを入手

3月

RealSense F455とD415を入手。

第一級陸上特殊無線技士試験に合格し、免許証を入手。

4月

第一級アマチュア無線技士試験不合格。

法規パートが及ばなかった。モールス信号を始めて学び、古いが自分の中では新鮮さを感じた。

KickstarterでBackしていたPetoi Bittleを組み立てた。

5月

UnityとROSでカメラ画像から深層学習でつかむ対象の姿勢を予測してPick and Placeを行うチュートリアルを試す。

KickstarterでbackしていたLooking Glass Portraitを入手

6月

Unitree Go1が気になったが、予算の問題で購入できず。

7月

Maker Faire Tokyo 2021の出展が不可という連絡を受け取る。

来年再挑戦する予定。

xArm用のSuction Cupを入手

ROS 2の本を揃え、勉強をする決意をする。

8月

Kickstarterでbackして入手したxArm 5 をアップデートしてxArm 6にした。

休日会員だったDMM.make AKIBAが8月で終了ということで最後の加工を行った。

9月

OAK-D-LiteをKickstarterでback

ROS 2の入門として「ScamperとRaspberry Piで学ぶROS 2プログラミング入門」を読んだ。

Mini PupperをKickstarterでback

10月

ROS 2(Foxy)でカルタ取りロボットシステムを作る最初のステップとして、RealSense D435の画像、深度からカルタの位置推定・札認識を実装した。

UFACTORY Lite 6をKickstarterでback

11月

百人一首カルタ取りロボの音声認識部分もシステムに接続し、「読み上げ音声を認識→該当の札を取る」を自動でできるようになった。

12月

ZED Miniを入手

クオータニオン学習用のおもちゃを試作したがいまいちだった。

ロボセミで「百人一首カルタ取りロボでROS 2に入門」のタイトルで発表

OAK-D-Liteが届く

総括

  • 相変わらずガジェットにつぎ込んだ。特にKickstarter経由の比率が高かった。
  • 第一級アマチュア無線技士試験は不合格だったが、陸上特殊無線技士試験に合格して技適の例外申請などで役に立ちそうな期待をもった。
  • ROS 2の学習を始め、百人一首カルタ取りロボットシステムを試しに作ってみてROS 2への理解が深まった。

ROS 2 FoxyでRealSense D435の画像をsubscribeする(QoSの設定とPython、C++実装)

RealSenseをROS 2で利用するときに、少しつまずきがあったので、こちらに記録用にまとめておきます。

具体的には以下のrealsense-rosパッケージを使い、realsenseから得られるRGB画像及びDepth画像をImageトピックとしてpublishしたものを、自分でsubscribeするプログラムを 作成しましたが、ROS 2ではQoS(Quality of Service)の設定を適切にしないと画像がうまくsubscribeできないということを知りました。 重要なのはreliability settingをbest_effortに変更することなのですが、これを含めたrealsense画像をsubscribeするシンプルなプログラムをサンプルとして紹介します。

私の場合、普段はPythonを中心に使っていますが、画像などの重ためのデータを扱う際にノード間のデータのやり取りをプロセス内通信にして余計なメモリへのコピーをなくし、パフォーマンス低下を防げるcomponentの利用は現状C++が必須のようなのと、その他のパッケージでもサンプルがC++で記述されているものもありそうなので、念の為PythonC++の両方の実装を行いました。 なおパッケージ名や関数名などはできるだけ両言語で同じようになるようにしましたが、両言語のパッケージをそれぞれ試される場合は重複を避けるためパッケージ名を変更してください。

Componentに興味のある方はこちらを参考にしてください。 docs.ros.org

事前に以下のサイトの手順に従ってrealsense-rosパッケージをビルドしてください。

github.com

また今回つまずきのポイントになったQoSに関する説明はこちらにあります。やり取りすデータに欠損などが発生した際のデータの扱いに関するルールを事前に定義しておける機能と理解しましたが、今回はその中のReliabilityPolicyというものがRELIABLEになっていると、RealSenseの画像データがsubscribeされないという問題が発生したので設定を変更してBEST_EFFORTにしています。

docs.ros2.org

Python実装

パッケージを作成し、image_subscriber.pyを作成する。

$ cd ~/ros2_ws/src
$ ros2 pkg create --build-type ament_python realsense_subscriber
$ touch ~/ros2_ws/src/realsense_subscriber/src/realsense_subscriber/image_subscriber.py

image_subscriber.py

import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2


class RealSenseSubscriber(Node):
    def __init__(self):
        super().__init__("realsense_subscriber_python")
        self.declare_parameter('image_topic_name', '/camera/color/image_raw')
        image_topic_name = self.get_parameter('image_topic_name').get_parameter_value().string_value

        video_qos = rclpy.qos.QoSProfile(depth=10)
        video_qos.reliability = rclpy.qos.QoSReliabilityPolicy.BEST_EFFORT

        self.sub_img = self.create_subscription(
            Image,
            image_topic_name,
            self.on_image_subscribed,
            video_qos
        )
        self.sub_img
    
    def on_image_subscribed(self, img):
        img_np = CvBridge().imgmsg_to_cv2(img)
        img_np = cv2.cvtColor(img_np, cv2.COLOR_BGR2RGB)
        cv2.imshow("Image", img_np)
        cv2.waitKey(1)


def main(args=None):
    try:
        rclpy.init(args=args)
        rclpy.spin(RealSenseSubscriber())
    
    except KeyboardInterrupt:
        pass

    rclpy.shutdown()
        

if __name__ == "__main__":
    main()

setup.pyを編集し、entry_pointsにrealsense_subscriberを追記する。

from setuptools import setup

package_name = 'realsense_subscriber'

setup(
    name=package_name,
    version='0.0.0',
    packages=[package_name],
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='root',
    maintainer_email='root@todo.todo',
    description='TODO: Package description',
    license='TODO: License declaration',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
            "realsense_subscriber = realsense_subscriber.image_subscriber:main"
        ],
    },
)

package.xmlを編集し、rclpyとsensor_msgsを追記する。

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>realsense_subscriber</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="root@todo.todo">root</maintainer>
  <license>TODO: License declaration</license>

  <test_depend>ament_copyright</test_depend>
  <test_depend>ament_flake8</test_depend>
  <test_depend>ament_pep257</test_depend>
  <test_depend>python3-pytest</test_depend>

  <export>
    <build_type>ament_python</build_type>
    <exec_depend>rclpy</exec_depend>
    <exec_depend>sensor_msgs</exec_depend>
  </export>
</package>

C++実装

パッケージを作成し、image_subscriber.cppを作成する。

$ cd ~/ros2_ws/src
$ ros2 pkg create --build-type ament_cmake realsense_subscriber
$ touch ~/ros2_ws/src/realsense_subscriber/src/image_subscriber.cpp

image_subscriber.cpp

#include <rclcpp/rclcpp.hpp>
#include <rclcpp/qos.hpp>
#include <sensor_msgs/msg/image.hpp>
#include <cv_bridge/cv_bridge.h>
#include <opencv2/opencv.hpp>


using sensor_msgs::msg::Image;

class RealSenseSubscriber: public rclcpp::Node
{
    public:
        RealSenseSubscriber(rclcpp::NodeOptions options = rclcpp::NodeOptions());
        ~RealSenseSubscriber(){}
    
    private:
        void onImageSubscribed(Image::SharedPtr img);
        rclcpp::Subscription<Image>::SharedPtr sub_img;
        std::string image_topic_name;
};

RealSenseSubscriber::RealSenseSubscriber(rclcpp::NodeOptions options) : Node("realsense_subscriber", options)
{
    image_topic_name = this->declare_parameter<std::string>("image_topic_name", "/camera/color/image_raw");
    rclcpp::QoS video_qos(10);
    video_qos.best_effort();
    video_qos.durability_volatile();
    sub_img = this->create_subscription<Image>(image_topic_name, video_qos, std::bind(&RealSenseSubscriber::onImageSubscribed, this, std::placeholders::_1));
}

void RealSenseSubscriber::onImageSubscribed(Image::SharedPtr img)
{
    auto cv_img = cv_bridge::toCvShare(img, img->encoding);
    cv::cvtColor(cv_img->image, cv_img->image, cv::COLOR_RGB2BGR);
    cv::imshow("Image", cv_img->image);
    cv::waitKey(1);
}

int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);
    rclcpp::spin(std::make_shared<RealSenseSubscriber>());
    rclcpp::shutdown();
    return 0;
}

CMakeList.txtの記述を追加する。

cmake_minimum_required(VERSION 3.5)
project(realsense_subscriber)

# Default to C99
if(NOT CMAKE_C_STANDARD)
  set(CMAKE_C_STANDARD 99)
endif()

# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 14)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

set(ROS_LIBS rclcpp;cv_bridge;sensor_msgs)
find_package(ament_cmake REQUIRED)
foreach(lib IN LISTS ROS_LIBS)
  find_package(${lib} REQUIRED)
endforeach()

set(target image_subscriber)
add_executable(${target} src/${target}.cpp)
ament_target_dependencies(${target} rclcpp OpenCV cv_bridge sensor_msgs)
install(TARGETS ${target} DESTINATION lib/${PROJECT_NAME})

ament_package()

package.xmlに依存ライブラリとして、rclcppとlibopencv-devを追加する。

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>realsense_subscriber</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="root@todo.todo">root</maintainer>
  <license>TODO: License declaration</license>

  <buildtool_depend>ament_cmake</buildtool_depend>
  <depend>rclcpp</depend>
  <depend>libopencv-dev</depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

PythonC++共通

こちらをコンパイルする。

$ colcon build --symlink-install --packages-select realsense_subscriber
$ source install/setup.bash

コンパイル後にまずrealsense-rosパッケージにあるrs_launch.pyを立ち上げます。

$ ros2 launch realsense2_camera rs_launch.py

その後、別のターミナルで作成したノードを実行します。

$ ros2 run realsense_subscriber image_subscriber

正しく実行できれば、ウィンドウが表示され、RealSenseから取得した画像が表示されます。(筆者環境ではDocker使用のため、表示にXephyrを使用していますが、マシンにROS 2を直接インストールしている場合はWindowが新規に表示されると思います)

f:id:hygradme:20210925234738p:plain

なおsubscribeするトピック名をパラメータで定義しているので、ノード起動時に引数を指定することでDepth画像を表示したり、別のWebカメラの画像などをpublishするノードを立ててそのtopicを指定すれば、その画像を表示することも可能です。 参考にdepth画像をsubscribeする際の引数の設定がこちらになります。

$ ros2 run realsense_subscriber image_subscriber  --ros-args -p image_topic_name:=/camera/depth/image_rect_raw

なおDepth画像のピクセル値はmmで計測された深度情報が入っているので、そのまま表示しても0~255の値の範囲しか通常の画像表示では行えないので、25.5mm程度の距離までしか適切に表示できません。ピクセル値をそれぞれ一定の値で割って(1000など)、0~255の範囲に計測範囲の距離が収まるようにするとわかりやすく画像を表示することができるようになります。

参考

  • ScamperとRaspberry Piで学ぶROS2プログラミング入門(オーム社)
  • ロボットプログラミングROS2の実装・実践(科学情報出版株式会社)

2020の振り返り

1月

RTX2080搭載のノートPC(PT515-51-A76Y8)を購入。外付けのNVMeSSD経由でUbuntuを起動する。

2月

xArmにステーキを焼いてもらう芸を仕込む。

ロボットに調理とかさせる展示等をすることを見越し、食品衛生責任者の講習を受け資格取得。

Universal Robots UR3を入手。Maker Faireへの出展きっかけとなる

3月

2d lidarをいくつか買う。

Spot Microに障害物回避歩行機能を実装。

Windows MRでUniversal Robotsを遠隔操作する。

Spot Microの頭にD435をつける。

4月

Jetson Xavier NXのModuleが届く。

5月

Jetson Xavier NX Developer Kitが届く。

6月

Realsense L515が届く。

Spot Microをブラウザで操作できる用にvue.js+Flaskでコントローラーを簡易Webアプリケーションとして実装。

驚異の1万円という低価格の二足歩行ロボットPLEN.Dを購入。

7月

KickstarterでバックしていたxArmのGripperがついに届く。

書籍「予算1万円でつくる二足歩行ロボット」の通りに二足歩行ロボットを作る。表面実装に初トライ。

8月

RealSense D455が届く。

Spot Microの改良版として自作四足歩行ロボットの足をカーボンで作る。

9月

dogotix-MIC-01Bを注文。

10月

MakerFaire出展、またその出展内容についてロボティクス勉強会で発表する。

docs.google.com

ソフトグリッパーに興味を持ち、3Dプリンターやシリコンゴムで制作する。

Pico Flexxを購入して試す。

Nintedo Switchのマリオカート ライブ ホームサーキット のレースにJetRacerを妨害キャラとして投入し吹っ飛ばす。

11月

M8 Lidarを入手する。

16Lineの3D Lidarがあきらめきれず、Velodyne Lidar VLP-16-HiResのジャンク品を修理して使用可能にする。

Velodyne Lidar VLP-16を入手する。

ROSでVLP-16で取った自前スキャンデータを使って3次元のSLAMを試す。

12月

myCobotを入手。

犬型ロボット dogotix-MIC-01Bが2か月以上の期間を経てついに届く。

youtu.be

youtu.be

youtu.be

その他

自作PCのグラフィックボードをGTX1080 からRTX3090に変更。

  • 暖かいが暖房器具としてはもう少しパワーが欲しい。計算資源としてはなかなか。

iPhone XからiPhone 12 Proに機種変更。

  • Velodyne Lidar繋いでiPhoneで点群を見るアプリを作って「Velodyne Lidar付スマホ」できないか少し調べたが、作るの大変そうなのでとりあえずは諦めた。

総括

  • 相変わらず色々ガジェットを買った。
  • 給付金を見越して Jetson Xavier NXを2種類購入したが、サイズはJetson Nanoとほぼ同じ割に性能がかなり高く今後もっと活用していきたいと思った。
  • CNCフライスでアルミとカーボン切削に挑戦。パラメータの調整がなかなか大変なことを知る。来年余裕あればCNCフライス購入したい。
  • MakerFaireに出展。展示の難しさを知ったがかなり面白かった。
  • 3D Lidar面白い。もう少し有効活用していきたい。
  • 購入した犬ロボは思ったより大きくパワーもあった。試すスペースがなかなかなく、扱いの難しさを感じたが大きな四足歩行ロボットの可能性を感じた。