2023年の振り返り
1月
OAK-D ProとFEMTOのポイントクラウドの比較動画を作成
OAK-D ProとFEMTOというデプスセンサーを買ったので、OKA-D LiteやRealSense, Azure Kinectなどと合わせてポイントクラウドの比較動画を作りました。ちなみにZED Miniで深層学習ベースの深度推定モードと思われるNeural Modeもついでに試しました。https://t.co/RJRFETc7jm pic.twitter.com/c0abnoRo9L
— higradom (@EL2031watson) 2023年1月2日
詳細3次元点群処理を読み終える
詳細3次元点群処理を一通り読み終えた。点群処理はほとんど勉強したことがなかったので、一回読むくらいではとても消化しきれないほどの情報量だった。個人的には最近傍探索に使うkd-treeが一番印象に残った。
— higradom (@EL2031watson) 2023年1月6日
色々使えそうな情報が多かったから今後何か作る際に実践して身につけていきたい。 pic.twitter.com/h3luyD75OL
OpenParallelGripperのプロモーション用動画を作成
自作していた平行グリッパーの紹介ムービーをYouTubeで公開しました。
— higradom (@EL2031watson) 2023年1月8日
Kickstarterでよくみられる見るだけで欲しくなり次の瞬間にはバックしている魔法のようなプロモーションビデオは作れませんでしたが、最低限はまとめられたかなと思います。https://t.co/VdkDdUHJrm
ML-Agentsで深層強化学習にトライ。Google論文にあるタスク複数について成功
ML-Agentsで、Googleの論文に出てた白い円柱を動かして赤と緑ブロックの仕分けタスクを強化学習。
— higradom (@EL2031watson) 2023年1月11日
動画下のように斜め上からのRGB画像と円柱の座標のみから行動を生成。
序盤は模倣学習でデモを真似させ段々自動で最適化される。RTX3090を1枚使い6並列で約1日学習の結果。中々上手く出来て驚き。 pic.twitter.com/N0F9suiZxw
ML-Agentsで強化学習使った赤・緑ブロックの仕分けタスク、さらに12時間ぐらい学習させたら少し効率が上がった。このレベルだとキーボードでやる自分のデモだとほぼ正確さとスピードでかなわない。そろそろさらに高難易度のタスクに移行しよう。 pic.twitter.com/Dq43eO7crc
— higradom (@EL2031watson) 2023年1月12日
ML-AgentsでGoogle論文の(c)のタスクに挑戦しているがなかなか学習が進まない。黄色いブロックを「コ」の字の部分に入れるタスクだが、角に引っかかりやすく、細かい調整が必要でなかなか報酬にありつけない。最初に試した2色のブロックを仕分けるタスクよりはるかに難易度が高い。 https://t.co/4KYs8X1RwQ pic.twitter.com/20p7NGgSUa
— higradom (@EL2031watson) 2023年1月13日
ブロック挿入タスク、報酬のバグを直したら遂にかなりの確率でブロックを「コ」の字の部分に入れることができるようになった。
— higradom (@EL2031watson) 2023年1月14日
タスク成功には結構正確な円柱操作が必要だが、エージェントは下の様な斜めから見た128x128画像と位置座標のみでタスクをこなしている。強化学習の凄さを実感。 https://t.co/IPSdjR1MVU pic.twitter.com/5EdTh1Zpvv
ML-Agentsで試していたブロック挿入タスク、カメラの位置・角度・FOVと照明をランダム化して(入力画像は下側)さらに45時間ぐらい学習してタスクの成功率が95.2%(476/500)になった。
— higradom (@EL2031watson) 2023年1月19日
カメラの厳密な取付が不要というのを現実のカメラ・ロボットのシステムで適用出来たらありがたそう。 pic.twitter.com/vlah0g3Ubh
自作グリッパーをUR3に対応させる実験
自作平行グリッパー、UFACTORY Lite 6やxArmに続き、Universal RobotsのUR3でもTool I/O経由で開閉できた。手持ちのCBシリーズではRS485の線が手先に来てないようで、開閉ぐらいしか指示出来なさそうだが、e-seriesならRS485が手先のコネクタ経由で使えるので、開閉ストロークを細かく指示できそう。 pic.twitter.com/gxlEKSZnVh
— higradom (@EL2031watson) 2023年1月31日
2月
Unity ML-Agents実践ゲームプログラミングを読み終える
Unity ML-Agents実践ゲームプログラミングを一通り読み終えた。
— higradom (@EL2031watson) 2023年2月5日
4年前に初期版も買っていたが、利用先が思い付かず途中で放置してた。
今回は強化学習で手軽にロボット動かす実験したいと思い新版(v2.2対応版)を購入。
今回は電子版。ML-Agents自体も改良され使い易くなった印象を受けた。 pic.twitter.com/0vmXmYVKMO
やや出遅れたがChatGPTを試し、その性能の高さに感動する
ChatGPT遅れたが試した。簡単なGUIツールとか素早く作れて便利。
— higradom (@EL2031watson) 2023年2月11日
これは試しに作ってもらったPythonでフォルダ内の画像を一括で指定サイズに変換してくれるアプリ。要件が適切に指示できてない時等は何回か修正を指示する必要があるが、十分使える。VBAとかWebアプリも行けたので活用範囲は広そう。 pic.twitter.com/KHsNbYZ0xe
ML-Agentsで黄・青球入り容器から青を取り出すタスクを深層強化学習で行う
黄・青球入り容器から青を取り出すタスクの深層強化学習、3週間ぐらい試行錯誤して多少拾えるようになった。成功率75%程度。
— higradom (@EL2031watson) 2023年2月19日
入力はスプーンのx,y,z,rx,ry,rzとRGB画像(下)の直近6フレーム分で、出力はスプーンの次の変位という構成。貫通とか問題設定にも難ありだったが、学習も高難易度。 pic.twitter.com/nsWBfG0oMi
3月
WhisperとGPT-3.5のAPIとVOICEVOXを組み合わせて音声会話できるエージェントを実装して遊ぶ
流行に乗ってWhisper+ ChatGPT+VOICEVOX
— higradom (@EL2031watson) 2023年3月5日
でChatGPT同士に「産業用ロボットを使った遊びの提案」という題で議論してもらった。「お菓子のつかみ取りゲーム」を提案された。反射神経が要求されるゲームらしく、なかなか難しそうだが、アイデアの発掘に使えそう。https://t.co/60HXuWKvGo pic.twitter.com/GGoEjr2xdA
4年ほど使用していたCLOVA Friendsがサービス終了で使用できなくなった
朝起きてCLOVA Friendsが使えなくなっていた。昨日までに必要なBluetoothスピーカーとしての設定を忘れてたから、もう使え無さそう。分解するか。
— higradom (@EL2031watson) 2023年3月30日
2018年末あたりから使い始めて4年。
今ならWhisper+ChatGPTのAPIで自作スマートスピーカーは作れそう。4年前と比べて時代の変化を感じる。 pic.twitter.com/mK0E1VEw0j
4月
DOBOT MG400を入手
DOBOT MG400をついに入手。
— higradom (@EL2031watson) 2023年4月23日
リーチ440mmペイロード750g、4自由度。
DOBOT Magicianと迷ったけどリーチ、高速移動時の安定感等でMG400が良さそうだったので選択。
Lite 6と比べて先端が下向きしか向けられないが、重心が1軸付近かつ手先が軽いので素早く動かした時もあまり怖さがないのがよい。 pic.twitter.com/AiEUtkJMmA
5月
OpenParallelGripperを改良し、Dynamixel XL-330を採用と共に薄型・軽量化を行う
LITE 6につける自作グリッパーのサーボをDynamixelに交換するついでに薄型版も作成。掴む方向と垂直な向きの厚みが57mmから41mmに減少、重量もCNC部品点数を減らす方向に改良し250g以下に出来そう。小型化でDOBOT MG400への取付も視野に。
— higradom (@EL2031watson) 2023年5月8日
ストロークは少し減って現在は40mm程度。伸ばすことは可能。 pic.twitter.com/bhAlc5WcPF
Kickstarterで低価格7軸ロボットのLucid ONEをバック
1年前ぐらいに届いた7軸ロボAmber B1の小型廉価版Lucid ONEおよびPro版がKickstarter に出ていたので安い無印の方をバックした。
— higradom (@EL2031watson) 2023年5月10日
現在はリーチ443mmの7軸が1199ドル。ハーモニックと自社製のサイクロイド減速機のハイブリッドでコスト下げているようだ。https://t.co/EcFjy1CRMK
7月
OpenParallelGripperの内部で使用するボードをOpenRB-150に変更し内部がシンプルになった
自作グリッパー結局Atom LiteやめてOpenRB-150に変えたから、RS485→UART変換ユニットとOpenRB-150にDynamixelサーボを繋ぐだけのシンプルな構成になった。電流制御で把持力をうまく調整できるサーボなのは有り難い。
— higradom (@EL2031watson) 2023年7月11日
Pick and placeのデモ:https://t.co/RLoCLkX5lI pic.twitter.com/O9p1nTI1Cm
8月
PyBulletに入門し、UFACTORY Lite 6の動作をシミュレーションした
PyBullet入門したので、試しにLite 6で正方形のパスをなぞらせてみた。
— higradom (@EL2031watson) 2023年8月20日
上部の移動時、特異姿勢に近いのでパスがなぞれなかった。実機だとジョイント速度が高くなったことによる異常停止が起きそう。結局こういうパスにならないようにロボットを使うか速度を落とすしか解決策はないのかな。 pic.twitter.com/5dMMlZASpz
逆運動学解法のSR-Inverseを自分で実装しPyBulletでシミュレーションに使用し理解を深める
PyBulletのLite 6の逆運動学のテスト、特異点付近でパスが外れてしまっていたので、紹介いただいたSR-inverseという逆運動学プログラムを実装してPyBulletの標準のIKと比較した。SR-inverseの方が滑らかに、しかもパスをより正確に描けている。 pic.twitter.com/iPlOGvdWzI
— higradom (@EL2031watson) 2023年8月21日
PyBullet上でKUKA LBR iiwaの動作シミュレーションを試す
PyBulletでKUKA LBR iiwaのシミュレーションでうまくパスを追従しなかった問題、単に速度が速すぎただけかもしれない。ゆっくりにしたら綺麗にパスに追従してくれた。
— higradom (@EL2031watson) 2023年8月27日
あと四角形の頂点は丸めないと加減速がロボットには厳しいかも。 pic.twitter.com/hfM7WN9SEk
PyBullet上のシミュレーション動作とUFACTORY Lite 6実機を同時に動かす
Lite 6のPyBulletシミュレーションと実機を自前実装のIKで同時に動かせた。 pic.twitter.com/EsCAbJ9vtW
— higradom (@EL2031watson) 2023年8月30日
Lite 6の4軸目と6軸目が平行になったいわゆるWrist Singularityの状態で本来は力が出せない方向に動作指示しても少しの経路乖離でなんとか動かせた。どうしても方向変更時のジョイントのスピードは上がってしまうが、パラメータ調整しても結局経路乖離の度合いとのトレードオフになりそうだった。 pic.twitter.com/nQ8ph0qEGu
— higradom (@EL2031watson) 2023年8月31日
9月
雲行きが怪しいと噂されたFranka Emikaのシミュレーションをなんとなく試す
Franka Emikaの雲行きが怪しくなっているが、とりあえずPyBulletに出してみた。
— higradom (@EL2031watson) 2023年9月3日
xArmと同じで5軸目と7軸目が一致しないようになっていてWrist Singularityを気にする必要がなくて扱いやすいからなのか、各軸にトルクセンサー搭載なのがいいのか理由はよくわかっていないが、論文でよく見るロボット。 pic.twitter.com/4s0MhfuVhR
RealSense T265でUFACTORY Lite 6のTCPをシミュレーション上及び実機で操作する
RealSense T265を使ってPuBullet上でLite 6のTCPを操作するテスト。pyrealsenseの最新版ではT265が認識されなくなっていて先行き不安。USB差しただけでトラッキングできる気楽さは良い。未発売のViveの新型トラッカーがPCと直接通信可なら良いが、現状T265が6DoFトラッカーとしては一番手軽か。 pic.twitter.com/SGKj02UUSZ
— higradom (@EL2031watson) 2023年9月8日
RealSense T265でUFACTORY Lite 6を操作する実機版のテストも成功。
— higradom (@EL2031watson) 2023年9月8日
最後の方で、手首特異姿勢付近で4軸が大きく動いてしまった。IKは色々調整して特異姿勢付近の挙動はだいぶ安定したと思ってたが現実はなかなか厳しかった。やっぱxArmみたいな手首特異姿勢を気にしなくていいアームの方が気が楽だ。 pic.twitter.com/eG1UOwrCWg
RealSenseのRGB画像とロボットの姿勢から模倣学習でスプーンで緑の豆のみを拾うタスクを学習させる
RealSenseのRGB画像とロボットの姿勢から模倣学習でスプーンで緑の豆のみを拾うタスクを学習させてみた。ランダムに拾っているようにも見えるが、緑を拾うと反応が変わる気がした。1視点画像ではきついタスクかも。モデルは以下の論文参考に、流行りのTransformerを使用。https://t.co/5sI9CPVZvw pic.twitter.com/EqXJ693CXV
— higradom (@EL2031watson) 2023年9月25日
自前実装のPythonの逆運動学コードが遅いのでChatGPTを使ってC++に移植し、爆速になった
自前実装のPythonの逆運動学の計算に10ms~程度かかっていてやや長いなと思い、逆運動学部分だけC++に書き換えてpythonから呼び出す方式にしたら1msと爆速になった。ChatGPTで気軽にC++へ書き替え出来て助かる。
— higradom (@EL2031watson) 2023年9月28日
10月
Meta Quest 3を購入
最近VRとかMRからは遠ざかってたが、Meta Quest 3を購入。最後に買ったのは初代Oculus Questだったので進化をだいぶ感じた。パススルー使ってHoloLens見たいに現実空間上でメニュー操作するUIが日常使いには良さそう。あと今更かもしれないが、両手組んでもハンドトラッキング破綻しないのに感動。 pic.twitter.com/He84AzyUJ2
— higradom (@EL2031watson) 2023年10月15日
11月
OpenParallelGripperのXL-330版を公開
Lite 6などの小ペイロードのアームロボ用グリッパーOpenParallelGripperのアップデートをしました。
— higradom (@EL2031watson) 2023年11月4日
新版では柔らかい物体でも掴めるように電流制御対応のDynamixel XL330-M288-Tを採用しました。剛性は犠牲になりますが、3Dプリント部品を増やし薄型化・軽量化を進めました。https://t.co/kbv3em5g4M pic.twitter.com/vLsiOIRZ00
Bambu Lab X1-Carbon Comboを購入
3Dプリンタ結局Bambu Lab X1-Carbon Comboを購入。ただ初期不良を引いてしまったようで、初期設定付近でディスプレイが付かなくなる。中の基板交換品を送ってもらって自分で交換予定。
— higradom (@EL2031watson) 2023年11月10日
20万超えのプリンタを自分で修理するのはやや緊張するが新品交換だと向こうの検品後に新品発送らしく時間がかかる。 pic.twitter.com/uJObtuD1LJ
Bambu LabのX1Cがついに稼働開始。初期不良は基板交換で治った。取り敢えずBenchyを印刷。かなり印刷は早いが、音はうるさい。少し速度落とそうかなと思った。
— higradom (@EL2031watson) 2023年11月14日
完成品のクオリティは前使ってたものよりも遥かに良さそう。AMS非対応らしいがTPUを試したい。 pic.twitter.com/wEGzP9oDeL
前から気になっていたOSSの4指ハンドLEAP Handを作成
公開後から気になってたDynamixel を16個使った4手ハンドのLEAP Hand を作成。XC330を使用した通常版は高いのでXL330使用したLite版にした。
— higradom (@EL2031watson) 2023年11月17日
結構大きい。重量的にUFACTORY Lite 6には付けられなさそう。
(Kenneth Shaw, Ananye Agarwal, Deepak Pathak, BY-NC-SA 4.0)https://t.co/OsFF6V98o2 pic.twitter.com/pTKU0lmgFM
ソフトグリッパーをOpenParallelGripperに取り付けて実験
自作グリッパー先端にTPUで作ったソフトグリッパー爪を搭載してみた。特に何も考えずにフィーリングで設計したが、少し内側に曲がってくれた。このグリッパー爪はFESTO社のHPでFin Ray Effectで登録商標のマークついているが、構造自体は特許化されてないのか気になる。 pic.twitter.com/GGmIXRfTUP
— higradom (@EL2031watson) 2023年11月21日
第42回ロボティクス勉強会で「RealSense T265とD415とUFACTORY Lite 6で模倣学習の実験」というタイトルで発表
本日の第42回ロボティクス勉強会の資料はこちらです。
— higradom (@EL2031watson) 2023年11月24日
発表タイトルは「RealSense T265とD415とUFACTORY Lite 6で模倣学習の実験」でした。https://t.co/glrfe4KO65
SUNLUのフィラメントドライヤーFila Dryer S2を購入
https://x.com/EL2031watson/status/1729841895973470270?s=20
SUNLUのフィラメントドライヤー Fila Dryer S2を購入。TPUとかカーボン配合フィラメントとかの印刷成功率を高められるに違いない。Kickstarterで次世代バージョンのS4が先月まで受付してたみたいだが、サイズが大きくなってるのと消費電力がかなり高くなっていたのでS2でいいかなと思った。 pic.twitter.com/NDPXUSvdj3
— higradom (@EL2031watson) 2023年11月26日
Dynamixelをリーダー、Lite 6をフォロワーとするリーダーフォロワーシステㇺを自作
Dynamixelをジョイントの角度指示用のセンサーとして使用したリーダーフォロワーシステムが出来た。
— higradom (@EL2031watson) 2023年11月29日
既にGELLOという同じ仕組みのものがあるが、UFACTORY Lite 6用のものが無かったので自作。T265と違って特異姿勢をあまり気にしなくていいので気楽に模倣学習データ収集に使える。 pic.twitter.com/TkuevWDIBj
12月
Jetson Orin Nanoを購入
iREX2023見てきた。大体全部見れたと思うがやっぱりいつも見て回ると面白い。
— higradom (@EL2031watson) 2023年12月1日
以前AliExpressで見かけた謎のロボットとかアクチュエータの会社が結構出てて驚いた。
そしてNVIDIAのブースでJETSON ORIN NANOを買ってしまった。
以前も同じようにJETSONをイベント会場で衝動買いした気がする。 pic.twitter.com/DgjAXUGPUj
自作リーダーフォロワーシステムのグリッパーも連動させて、色々なタスクを試す
DynamixelとLite 6のリーダーフォロワーシステム、グリッパーの連動も無事うまく行った。公式のグリッパーは開閉の2値のみだが、自作版はModbus RTUでグリッパーの開閉の中間値を細かく扱える。ソフトグリッパーだと衝突が恐怖にならず気楽。iREXにインスパイアされてボルトのピックアンドプレイス。 pic.twitter.com/jvyTW3xIIW
— higradom (@EL2031watson) 2023年12月2日
自作グリッパーの先端をソフトグリッパーにしたバージョンで将棋の駒の成りが出来た。
— higradom (@EL2031watson) 2023年12月3日
ボルトもそうだったが、結構色々掴めて面白い。 pic.twitter.com/KYMhCOOtwP
同じグリッパーでトランプと100円玉もひっくり返せる。トランプは机との間にわずかに隙間ないときついが、中々汎用性ありそう。
— higradom (@EL2031watson) 2023年12月3日
グリッパーのOpen-Closeの中間を細かく扱えるとこういう難易度の比較的高そうなものもひっくり返せておもろしい。 pic.twitter.com/QCvHyGcnMs
ロボットアームに自作グリッパーつけて狭くて硬い箱の中に乱雑に入ってる木製の将棋の駒の取り出し、雑だけどソフトグリッパーで結構うまくいく。操作側の指の向きをグリッパーと合わせて、指で掴んでいる感覚に近づけて操作性を高めた。 pic.twitter.com/YJJEHtgQwJ
— higradom (@EL2031watson) 2023年12月4日
PLA-CFを使用してグリッパー爪を印刷
Bambu LabのX1C買った時についてきたPLA-CFでグリッパーの爪を印刷してみたが、中々綺麗な仕上がり。エンプラ系フィラメント他のも試してみたくなる。 pic.twitter.com/i9sbTqRXP4
— higradom (@EL2031watson) 2023年12月6日
PLA-CFで金属パーツを置き換えて40mmストローク版のLite 6用の自作グリッパーは200gに迫る勢い。
— higradom (@EL2031watson) 2023年12月6日
そしてとっくの昔にLite 6公式のグリッパー295gよりはるかに軽くなっていた。 https://t.co/hzan2cFt9h pic.twitter.com/FIrklx5pYY
リーダーフォロワーシステムを双腕化
Lite 6の双腕構成のリーダーフォロワーシステムで箱の中の包装されたチョコレートを、箱から出し、包装からも取り出すことに成功。5分以上かかった。アームロボットとグリッパーは想定通りの動作だが、爪の摩擦が低いせいか滑ってしまい時間がかかった。
— higradom (@EL2031watson) 2023年12月13日
動画は10倍速。(1倍速動画はYouTubeを参照) pic.twitter.com/4nklgoFOr3
Lite 6と自作グリッパーの双腕構成でスライダー付き袋の開封になんとか成功。
— higradom (@EL2031watson) 2023年12月15日
硬い部分がほとんどない中でスライダーを動かすのがかなり難しい。あとそもそもテーブルに置いてある袋を掴んで開ける体制に持っていくまでもなかなか苦労する。 pic.twitter.com/jWmdxskCGY
双腕ロボットハンドの操作、爪を改良して摩擦が結構効くようになった。
— higradom (@EL2031watson) 2023年12月17日
Amazon で買ったボルトセットの箱を開けて、M6ボルトを取り出すデモ。
65mmストロークではそのまま箱を掴めず、傾けないと箱が掴めない。そして青色のロックも狭い空間に少し力を加えないと開けることが出来ず面倒なタスク。 pic.twitter.com/8GnSNhVQ9N
双腕ロボット操作でトランプのカードを1枚箱から取り出し。改造したグリッパー爪のおかげで指先が滑りづらくなったから、比較的簡単にできるようになった。
— higradom (@EL2031watson) 2023年12月17日
しかし65mmストロークのグリッパーだと意外と幅が足りなくてそのまま掴めないものが多く、わざわざ回転させたり工夫が必要。 pic.twitter.com/aaYd4P4jEJ
ルービックキューブを双腕ロボットで回す。
— higradom (@EL2031watson) 2023年12月23日
ソフトグリッパーだと結構落とすので、PA6-CFで作った爪に滑り止め付けた構成。しかし55mmのキューブだと5mm-10mm程度しか余裕がない。
ROBOTIQの2F-85がよく論文で使われる理由はストローク85mmが結構現実世界で多くのものを掴めるという理由もありそう。 pic.twitter.com/SwrQ9tPiIE
東明テックの食品乾燥機プチマレンギminiが80℃まで出せてフィラメント2つ入れられることを発見しフィラメントドライヤーとして購入
フィラメントドライヤー、SUNLU S2を買ったがPA6-CFとかカーボン配合系フィラメントが80℃で8時間の乾燥が推奨と書いてあるので80℃出せるもの探した。
— higradom (@EL2031watson) 2023年12月19日
東明テックのプチマレンギminiが35-80℃で24時間まで乾燥できて、サイズがちょうどフィラメント二つ分だから購入。無駄がなく丁度よさそう。 pic.twitter.com/yyd5tRMbJn
PA6-CFの印刷にチャレンジ
X1CでPA6-CFのプリントにチャレンジ。
— higradom (@EL2031watson) 2023年12月20日
食品乾燥機で80℃で10時間乾燥させて印刷。
1枚目の左がPA6-CFで右はPLA-CF。
PA6-CFの方が黒が薄い気がする。強度は触った限り差を感じなかった。
2枚目は自作グリッパーの材料の一部をPA6-CFでプリントしたもの。密度はPLAより低く軽量化が期待できそう。 pic.twitter.com/UM87aOiX0U
リーダーフォロワーシステムのプログラムを改良及び机を耐荷重200kgのものに差し替えて操作が滑らかになる
双腕ロボシステム、机が揺れるので頑丈なものに交換したがそれでも揺れたので、別の理由を考えてたら単純にDynamixelの通信のbaud rateが57600bpsのままで角度取得する周期が遅くてロボットアームが加減速を繰り返してたのが原因そうだったので1Mbpsまで上げたら滑らかになり振動もかなり減った。 pic.twitter.com/29OHG0PlZC
— higradom (@EL2031watson) 2023年12月25日
双腕ロボットアームのリーダーフォロワーシステムが滑らかに動くようになったところでスライダー付き袋内の豆を皿に移すタスクに再度チャレンジ。
— higradom (@EL2031watson) 2023年12月25日
前より操作が上手くなったというのはあるがまあまあスムーズ。ファスナー開けるより開けた後の袋の口をうまい具合に開くのが難しい。 pic.twitter.com/WAdvAOLGy8
総括
- 相変わらずガジェットにつぎ込んだ。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を購入。
Tipron届いたけどデカすぎて玄関で詰まった… pic.twitter.com/nIhF0uzQ9N
— higrademe (@EL2031watson) 2022年1月7日
長年使っている3DプリンタCR-10Sのマザーボードを取り換え、静音化を実現。
3DプリンタCR-10Sの静音版のマザーボード(V2.2)が届いたので交換したら印刷時にかなり響いていたステッピングモータの稼働音がほぼ消えた。静かなので逆にエラーとかで止まってても気づきづらいかも。
— higrademe (@EL2031watson) 2022年1月8日
動画の音は部屋のファンの音が入っててわかりづらいが本当に聞こえない。これで24時間稼働できる。 pic.twitter.com/ecbI5HJGIB
2月
3月
Kickstarterでバックしていた7軸アームロボAmber B1が到着。
Kickstarterでバックしてた7軸アームロボのAmber B1がついに届いた。
— higrademe (@EL2031watson) 2022年3月8日
茶色の部分は磁石でくっついてるだけで普通に外れた…
動かすまでが結構苦労しそうだから遊ぶのは取り敢えず週末までお預けの予定。 pic.twitter.com/uU4GMpCaEc
7軸アームロボのAmber B1、無事ティーティングモードで動作の記録、再生ができた。固定がやや不安定で台が揺れているが、アームの動作音はかなり静か。
— higrademe (@EL2031watson) 2022年3月12日
現在はWebアプリから操作をしているが、軽くコードを見た感じだとどうやら中身はROS 2で動いているみたいだ。 pic.twitter.com/lXycI8VVDb
RealSense D405を入手。
RealSense D405が届いた。先週注文してから1週間経たずに届いた。かなり早い。 pic.twitter.com/VLf0hn0Nxb
— higrademe (@EL2031watson) 2022年3月23日
4月
ロードセルで遊んだ。
Amazonで買ったロードセルトランスミッターを使ってxArmのコントロールボックスのAnalog Input経由でロードセルにかかる荷重変化を電圧として出力できた。
— higrademe (@EL2031watson) 2022年4月10日
固定台の剛性が低くフルスケール10kgのロードセルにそこまで強い負荷かけられなかったが、0-10V範囲で2Vから3Vへの変動は見れた。 pic.twitter.com/ERKWxWgmwr
5月
ロードセルをxArm先端に取り付け、荷重計測をテストした。
xArm先端にロードセルとアナログ入力への変換基板を固定して荷重計測出来た。
— higrademe (@EL2031watson) 2022年5月31日
材料費は1万円ちょっとで、1軸で十分なら30万超えの6軸センサーは買わなくて済む。
さらにロボット手先の端子で電源供給とアナログ入力ができているので手先がコンパクト。もっともRealSenseのUSBは手先経由では難しいが。 pic.twitter.com/puyRvnFFnb
6月
MakerFaireの出展期限を勘違いし、応募に失敗。
7月
xArmの先端に取り付けたロードセルを使って背中マッサージロボットの試作を行った。
ロボットアーム(xArm)の先端にロードセルを付けてマッサージロボット化しました。負荷かけすぎると異常停止するので強い刺激は出せませんが多少のリラックス効果は得られそうです。
— higrademe (@EL2031watson) 2022年7月1日
YouTubeに解説動画アップしましたので良ければご覧ください。https://t.co/ak2ZPFD8CK pic.twitter.com/TCONCL7sBT
LIPSedge DLを入手
ToF方式のデプスカメラのLIPSedge DLを入手したので試してみたが、L515やAzure Kinectと比べるとやっぱり物足りなさを感じた。
— higrademe (@EL2031watson) 2022年7月13日
L515はディスコンになったし、Azure Kinectはややでかくて重たいので、なんかコンパクトないい競合品がもっと出てほしいところ。 pic.twitter.com/G3R71RJB96
羽田空港近くのai_scapeに行ってきた。
週末ai_scapeに行ってきた。結構面白い体験だった。
— higrademe (@EL2031watson) 2022年7月20日
7軸リーチ902mmのKINOVA Gen3と思われるが、停止時に結構ブレるのがやっぱ細いアームだから剛性がきつめだからなのだと思った。しかしリーチ長いのはいい。
あとこのアーム、ブレーキが非搭載だった気がするのだが、異常停止時の挙動は気になる。 pic.twitter.com/5nDkB3H0cW
CCDIKをUnityで試してみる。
逆運動学の勉強ついでにCCDIKという先端側のジョイント側から順に目標に向きを合わせていくのを繰り返すという単純かつ高速なアルゴリズムのUnity向け実装をみつけたので7軸アームOPTI 7で試してみた。ソース見る限り、実質この20行もない実装でIKが実現できるのはすごい。https://t.co/qHJt5Qh1HS pic.twitter.com/WLFQ9tw7L7
— higrademe (@EL2031watson) 2022年7月31日
8月
CNC加工を始めて海外業者に発注。以後頻繁に使うようになる。
ボール盤しか手元になく、ドーナツ形状みたいな大きな穴のアルミ加工ができなかったので、始めて中国業者に加工を頼んだ。ちなみに用途はアーム先端につけるアダプタ。
— higrademe (@EL2031watson) 2022年8月15日
1週間ぐらいで到着。二つで送料入れて100ドルくらいだが、自分でやる手間、リスク、仕上がり品のクオリティを考えると悪くない。 pic.twitter.com/JsAgorROef
深度カメラ9種類のポイントクラウドの比較動画を公開。
夏休みの自由研究として9個の深度カメラの比較をしました。研究といってもD405, D415, D435, D455, L515, SR305, Azure Kinect, OAK-D-Lite, ZED Miniでポイントクラウドを取得して並べただけですが。https://t.co/7snCtwfTsj pic.twitter.com/f4cdmGIUNl
— higrademe (@EL2031watson) 2022年8月16日
6軸力覚センサーのFT300を入手。Python用のライブラリを作成してpypiで公開。
ロードセルで自作力センサーをやってたけど結局6軸トルクセンサーのFT300を入手した。
— higrademe (@EL2031watson) 2022年8月19日
Pythonでデータ取得するライブラリがGPLのしか無かったので新規にMITライセンスのライブラリを作ってpypiに登録した。ROSではなく直接しかもUR以外で使う人はかなり限られるとは思うが…https://t.co/mhfK5mAu0q pic.twitter.com/EvEZqYs7b5
MetaCatを入手
metaCat頂いたので開封。
— higrademe (@EL2031watson) 2022年8月20日
外見の作りはなかなかリアル。動作はパンチルトと尻尾の3自由度で動きは比較的単純。いいと思ったのは目の表示。かなり生きてる感が出せてると思った。
猫飼ってる知り合い曰くこの猫ロボは不気味らしいが、アレルギーでリアル猫に近づけないからこういうロボは嬉しい。 pic.twitter.com/nDwVblrfpy
サイボーグハンドを組み立てた
「サイボーグハンド」というのを発見して水圧駆動が気になり、買って組み立てた。水を自分で注入して水圧ポンプ作るところも自分で組み立て。
— higrademe (@EL2031watson) 2022年8月21日
水圧のところ出来て動かしてみたがなかなか面白い。
水圧は温度とか難点もあるみたいだが、なんかこれを改造してエンドエフェクターつくれないかな。 pic.twitter.com/oMvEjx4TZL
深度カメラ9種のポイントクラウド比較動画(高難易度な物体の点群比較)を公開。
デプスカメラの比較動画の続編を公開しました。今回はテクスチャーの有無、反射性の物体、黒い物体など、厄介なものに対する各センサーの特性の違いが結構出ています。
— higrademe (@EL2031watson) 2022年8月26日
比較したのはD405, D415, D435, D455, L515, SR305, Azure Kinect, OAK-D-Lite, ZED Miniです。https://t.co/CXG379EVVt pic.twitter.com/1DH6tn6JGz
Stable Diffusionをテスト
流行りのStable Diffusionをテスト。VRAMを15GBぐらい使い、持っててよかったRTX3090。
— higrademe (@EL2031watson) 2022年8月27日
主語側が優先されるようで似た意味の二つで出力が結構変化したが、レイアウトは一部似てて面白い。
"7-axis arm robot is playing table tennis"
"A man is playing table tennis with 7-axis arm robot" pic.twitter.com/WTB1ZeQNdu
9月
Orbbecの深度カメラFEMTOを入手
OrbbecのFEMTOというToFのデプスカメラが届いた。
— higrademe (@EL2031watson) 2022年9月13日
Azure Kinectの小さい版みたいな見た目。接続端子はセンサー側はType-Cが1つだが、ケーブルが2分岐してUSB Type-AをPC側、もう1つのType-Cを電源に繋ぐ必要がある。
注文中のもう1つ別のセンサーが届いたらまた比較動画でも作るかな。 pic.twitter.com/PnzBW5ybjU
27インチ4Kモニターを入手
画面1枚だと少し不便に感じることが多くなったのと、4Kモニター気になってたので、27インチ4Kモニターを購入してデュアル構成にした。
— higrademe (@EL2031watson) 2022年9月19日
モニターサイズが大きくなったのもあるけど、論文とかの文字はたしかにくっきり見えるようになった感じはした。 pic.twitter.com/dgJF6DFYZq
OAK-D Proを入手
OAK-D Proが届いた。Liteと比較すると少し大きい。特に背面のフィンが長くなっている。RealSense D435みたいにドットプロジェクターが搭載されているactive stereo方式。 pic.twitter.com/R81ckaCRqw
— higrademe (@EL2031watson) 2022年9月25日
10月
KickstarterでバックしていたUFACTORY LITE 6を入手。
UFACTORY Lite 6がついに到着。
— higrademe (@EL2031watson) 2022年10月18日
xArm と比較すると小型だが、xArmみたいにしっかりとした作りに見える。
リーチは440mm。
このサイズなら卓上でも色々遊べそう。 pic.twitter.com/IRw20rvF4m
早速UFACTORY Lite 6でドミノを並べるデモをサクッと作った。グリッパーが空気圧ポンプで駆動しているようで音が少し気になるが、とりあえずそれっぽいものができた。https://t.co/6YWVtqGOIA
— higrademe (@EL2031watson) 2022年10月18日
11月
LITE 6用の平行グリッパー作成(バージョン1)。ストロークは50mmと純正のグリッパーの3倍以上を達成。
UFACTORY LITE 6用に平行グリッパーを試作。
— higrademe (@EL2031watson) 2022年11月15日
元からついているグリッパーは16mmストローク幅とやや使いずらいので、
50mmストローク目標で作成。
重量も309gに抑えた。
今はほぼ3Dプリント部品なので限界があるが取り敢えず開閉は出来た。カバーのせいで45mm程度の開閉。
あとは切削部品の到着待ち。 pic.twitter.com/vFEeYQIXDy
DYNAMIXELに入門
取り敢えず念のためDYNAMIXELのサーボ を購入。なかなかお高いが、ドキュメントはかなり充実してそう。
— higrademe (@EL2031watson) 2022年11月23日
ちゃんと調べておけばよかったが、セレーションが20Tっぽいので、既存のパーツが使え無さそうで困った。付属のサーボホーンに適合するようにパーツを作るしかないか。 pic.twitter.com/JLWQ3ZfYo1
REALFORCE を入手
今までキーボード安い物を使ってたけど、REALFORCEについにデビュー。有線・無線両対応。
— higrademe (@EL2031watson) 2022年11月26日
打ち心地よく、キーボードを押す喜びを感じる。
癖で左のtabキーに指を乗せたまま画面見てたりするとキーの反発力が低いせいかたまにtabが連射されてしまうという悩みはあるが、概ね満足。 pic.twitter.com/eYmK1QQN8x
ATOM Liteと拡張モジュールを買い集める
ATOM Liteシリーズを色々と買い集めた。左下の小さいデバイス(24mmx24mmx10mm)が本体のようで他は装備品とか、本体内蔵してるものとか色々。
— higrademe (@EL2031watson) 2022年11月27日
このサイズで装備品を少しつけただけで気軽に色々拡張できるのはなかなか夢が膨らむ。 pic.twitter.com/X6DY4FT1Dr
12月
金属3Dプリントに初トライ。
無事金属プリント品が届いた。素材はステンレス。サーボのセレーションみたいな細かい部分もそれなりに出来ている。
— higrademe (@EL2031watson) 2022年12月1日
ギアのかみ合いがややきつめな感じがした。 pic.twitter.com/jvCVfUmi6Q
LITE 6用の平行グリッパーをアップデート(バージョン2)
UFACTORY LITE 6用グリッパーver2を作成。サーボを軽いのに変え、アームから来るModbusの信号をマイコンで受け付けてサーボ指示を行うようにした。重量は目標の300g未満にはできなかったのがやや残念。
— higrademe (@EL2031watson) 2022年12月14日
このグリッパー使ったPick and placeの試し動画:https://t.co/naO4XW3FqN pic.twitter.com/1xotd7zWhy
ATOM S3を入手
取り敢えず流行り物のATOM S3を入手。
— higrademe (@EL2031watson) 2022年12月28日
サイズは24mm x 24mm x 13mmとやっぱ小さい。 pic.twitter.com/N3Ky0ZN8fs
LITE 6用の平行グリッパーをオープンソースとして公開
UFACTORY LITE 6用に開発していた電動平行グリッパーをオープンソースとして公開しました。
— higrademe (@EL2031watson) 2022年12月30日
設計など色々課題ある点あるかと思いますが、何か気づいたことあれば教えていただけると助かります。https://t.co/kbv3em5NUk pic.twitter.com/4IPDYtYDqi
総括
相変わらずガジェットにつぎ込んだ。今年は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の運用を開始
セールで買ったAnycubic Mega Proをサブ機として運用を開始。かなり組み立ても簡単で音も小さめで良い。 pic.twitter.com/Eq7lxouKtr
— higrademe (@EL2031watson) 2021年1月1日
第四級アマチュア無線技士試験合格
第一級アマチュア無線技士試験も受けるので、免許の申請は保留。(12月に結局申請)
2月
myCobotのグリッパーを入手
myCobotのグリッパーが届いた。 pic.twitter.com/rOkgOlqfHX
— higrademe (@EL2031watson) 2021年2月12日
3月
RealSense F455とD415を入手。
F455も届いたがこの間安かったからついでに買ったD415も届いた。やっぱF455かなり小さいな。 pic.twitter.com/jeo03jLl2V
— higrademe (@EL2031watson) 2021年3月13日
第一級陸上特殊無線技士試験に合格し、免許証を入手。
第一級陸上特殊無線技士試験に合格して無事に免許証を取得。
— higrademe (@EL2031watson) 2021年3月31日
第二種電気工事士に続き自分の方向性が意味不明になってきたが、持ってると技適の例外申請とかドローン系の仕事に使えるとかメリットもあるのと、そもそも無線の勉強も色々面白かった。 pic.twitter.com/Q8ykXh8jPM
4月
第一級アマチュア無線技士試験不合格。
法規パートが及ばなかった。モールス信号を始めて学び、古いが自分の中では新鮮さを感じた。
週末に第一級アマチュア無線試験受けたので自己採点した。無線工学は合格ライン超えたが、法規で1問分及ばず不合格の公算大。
— higrademe (@EL2031watson) 2021年4月13日
電波法に違反した場合の罰金額が30万円か50万円か等を真面目に暗記しなかったところが敗因。
でも勉強の結果モールス信号が少し分かるようになったので収穫はあった。
KickstarterでBackしていたPetoi Bittleを組み立てた。
Petoi Bittleの組み立てが何とか終わり、動かしてみた。赤外線リモコンで簡単な事前に入ってる動作をさせられる。Steppingというのを押したら予想してた以上に激しく動いた。なんか間違ってる気もするが他は良さそう。 pic.twitter.com/8Hc8hIYBEZ
— higrademe (@EL2031watson) 2021年4月14日
5月
UnityとROSでカメラ画像から深層学習でつかむ対象の姿勢を予測してPick and Placeを行うチュートリアルを試す。
Unity公式のROSでpick and placeするチュートリアル終了。
— higrademe (@EL2031watson) 2021年5月7日
位置・姿勢・光源などをランダム化して得た30000枚の単眼カメラの画像を使って深層学習モデルを作成しCubeの位置・姿勢を推定。推定結果をMoveItに飛ばして、Goalまで運ぶ軌道を生成するというもの。たまに失敗するが、単眼にしてはなかなか。 pic.twitter.com/cBRbe6mLRR
KickstarterでbackしていたLooking Glass Portraitを入手
Looking Glass初代も買ってる人にとってはfirstじゃなくてsecondなのかなw pic.twitter.com/UwqAdiHUzx
— higrademe (@EL2031watson) 2021年5月12日
6月
Unitree Go1が気になったが、予算の問題で購入できず。
Unitree Go1 公式サイト見た感じ頭部4か所、腹部に前後それぞれ2か所、左右にそれぞれ4か所カメラか何かのセンサーらしきものが搭載されている。結構多いな。$2700がセンサー込みの値段ではない気はするが、センサー抜きでも前買った犬ロボと同サイズ同価格でかなり安い。https://t.co/p3V9GUn5f5 https://t.co/Q8rCKFTvbd
— higrademe (@EL2031watson) 2021年6月8日
7月
Maker Faire Tokyo 2021の出展が不可という連絡を受け取る。
来年再挑戦する予定。
Maker Faire Tokyo 2021今年は出展叶わず。今年は有料化したのに変わらず出展希望者多いのか。
— higrademe (@EL2031watson) 2021年7月13日
また来年。
xArm用のSuction Cupを入手
xArm用のSuction Cupがちょうど届いた。吸着カップ3種類を選べて、最大5個まで付けられるようだ。
— higrademe (@EL2031watson) 2021年7月19日
ということで、久々にxArmを部屋に設置。 pic.twitter.com/sQS10XNwQr
ROS 2の本を揃え、勉強をする決意をする。
取り敢えずROS 2の本5冊を揃えた。
— higrademe (@EL2031watson) 2021年7月23日
まだ1冊終わって2冊目始めたところだが…
現段階だと先にROS1やった方がいい気もしてきた。
そしてScamperは多分TurtleBot3よりも高いのだろう…
ROS 2でできるかはさておき、現状アームロボは結局myCobotが一番入門機として安いのかな。 pic.twitter.com/BY6S2DreHN
8月
Kickstarterでbackして入手したxArm 5 をアップデートしてxArm 6にした。
xArm 6をゲット。xArm 5からアップデートした。
— higrademe (@EL2031watson) 2021年8月24日
ということで新しく動くようになった軸を回してみた。 pic.twitter.com/urDRjJo0I3
休日会員だったDMM.make AKIBAが8月で終了ということで最後の加工を行った。
DMM.make AKIBA 休日会員だったので、実質最終日となる日曜に行ってきた。
— higrademe (@EL2031watson) 2021年8月31日
アルミ板が70%オフだったので買い込み、xArmのカメラ取り付け部品無くしたので作った。
ボール盤とバンドソーとCNCフライスが使えなくなるのはきつい。ボール盤は買う予定。バンドソーはうるさいからきつい。CNCはそのうち。 pic.twitter.com/vo7Uqrquzo
9月
OAK-D-LiteをKickstarterでback
OpenCV AI Kit - Liteとりあえず安いから2つバックしたが、もう一つくらいあってもいいかなと思って変更しようとしたらもうSuper Early Birdは無くなっていた。なかなかの人気だ。
— higrademe (@EL2031watson) 2021年9月15日
ROS 2の入門として「ScamperとRaspberry Piで学ぶROS 2プログラミング入門」を読んだ。
ScamperとRaspberry Piで学ぶROS 2プログラミング入門をなんとか終えた。
— higrademe (@EL2031watson) 2021年9月23日
C++でROS 2の基礎が学べるのと、OpenCV使ってwebカメラの画像をpublish,subscribeして処理を加えるところまでが全てC++で書かれてるのが特に良かった。しかしOpenCVをC++で使いこなすのはPythonに比べるとなかなか大変そうだ。 pic.twitter.com/ervMbcSyMC
Mini PupperをKickstarterでback
出遅れましたが、念のためMini Pupperをbackしました。
— higrademe (@EL2031watson) 2021年9月30日
10月
ROS 2(Foxy)でカルタ取りロボットシステムを作る最初のステップとして、RealSense D435の画像、深度からカルタの位置推定・札認識を実装した。
ROS 2とC++の勉強として、RealSenseのRGB画像からカード認識、深度を使い位置・向きを計算してRVizで可視化した。カードを傾けるとカード面の法線が追従してくれる。
— higrademe (@EL2031watson) 2021年10月17日
法線からQuaternionの計算は自前で作ったが、なんかライブラリ化されていないのかな。まあクオータニオンの勉強にはなったけど。 pic.twitter.com/tuOuqxVWs7
UFACTORY Lite 6をKickstarterでback
UFACTORY Lite 6を無事Kickstarterでバック。
— higrademe (@EL2031watson) 2021年10月26日
以前バックした7DoFの方は来てないが、UFACTORYならほぼ間違えなく届くだろうし、安いから取り敢えずバックした。
11月
百人一首カルタ取りロボの音声認識部分もシステムに接続し、「読み上げ音声を認識→該当の札を取る」を自動でできるようになった。
百人一首の読み上げ音声を認識して、並べた札を画像認識で識別してロボットが該当するものを取るところまでできた。
— higrademe (@EL2031watson) 2021年11月19日
これでロボットと人の対戦ができる。一部は上の句読み上げ中に動くから多分私より強い。なお対戦時の安全性は… pic.twitter.com/2uGqxaloBi
12月
ZED Miniを入手
StereolabsのZED Miniを入手。今使っているRealSense D435と比較したいと思い。
— higrademe (@EL2031watson) 2021年12月1日
基本VRヘッドセットにつけることを想定して作られてるようだけど、小さいからアームに付けるのも良さそう。レンズ間の中心が本体中心とずれてるからxArmに取り付けるためのマウントもずらして作らないといけないのかも。 pic.twitter.com/dH3z9Fx8IZ
クオータニオン学習用のおもちゃを試作したがいまいちだった。
クオータニオンの回転を感覚的に試したいと思い任意の軸周りに物体(写真では座標軸)を回転させる物を作ったが微妙だった。空間の干渉を回避しないといけないのがつらい。
— higrademe (@EL2031watson) 2021年12月17日
こういうのはXRで作った方がよさそう。
ちなみにxyz座標の原点をボールジョイントの中心にオフセットしたから座標も変な形。 pic.twitter.com/EOv4o80Kl6
ロボセミで「百人一首カルタ取りロボでROS 2に入門」のタイトルで発表
先ほどロボセミで発表した「百人一首カルタ取りロボでROS 2に入門」のスライドを公開しました。https://t.co/rMQlfPrdmT#robosemi
— higrademe (@EL2031watson) 2021年12月17日
OAK-D-Liteが届く
無事OAK-D-Liteが到着。本体は言うまでもなくパッケージもRealSenseと比べて思ったよりかなり小さく驚いた。まあ本体以外も入ってる箱と比べてもしょうがないかもしれないが。 pic.twitter.com/wGPV0MYVYW
— higrademe (@EL2031watson) 2021年12月29日
総括
- 相変わらずガジェットにつぎ込んだ。特に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++で記述されているものもありそうなので、念の為PythonとC++の両方の実装を行いました。 なおパッケージ名や関数名などはできるだけ両言語で同じようになるようにしましたが、両言語のパッケージをそれぞれ試される場合は重複を避けるためパッケージ名を変更してください。
Componentに興味のある方はこちらを参考にしてください。 docs.ros.org
事前に以下のサイトの手順に従ってrealsense-rosパッケージをビルドしてください。
また今回つまずきのポイントになったQoSに関する説明はこちらにあります。やり取りすデータに欠損などが発生した際のデータの扱いに関するルールを事前に定義しておける機能と理解しましたが、今回はその中のReliabilityPolicyというものがRELIABLEになっていると、RealSenseの画像データがsubscribeされないという問題が発生したので設定を変更してBEST_EFFORTにしています。
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>
PythonとC++共通
こちらをコンパイルする。
$ 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が新規に表示されると思います)
なお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を起動する。
なかなか起動しなかったRTX2080搭載のノートUbuntu PCがついに起動。
— higrademe (@EL2031watson) 2020年1月23日
自分の自作PCみたいにWindows Ubuntuを同じSSDに入れてデュアルブートしてたらいつの間にかUbuntuが起動しなくなってしまってたので、今回はNVMeのSSDを外付けUSB-C化してそこに入れた。これならWindows Updateでも大丈夫? pic.twitter.com/dZe3aIujtz
2月
xArmにステーキを焼いてもらう芸を仕込む。
xArm芸その1:本物の肉をひっくり返してもらって裏面を焼く。
— higrademe (@EL2031watson) 2020年2月9日
投資額は国産牛390円。 pic.twitter.com/P9tvmjZYnf
xArm芸その2:焼けた肉をお皿に移動。
— higrademe (@EL2031watson) 2020年2月9日
最後が少し惜しかったが、なんとか皿には入ってるからよし。
なお肉の位置がさっきと違うじゃないかというクレームはなしで... pic.twitter.com/PW2k3Imge4
xArmでクッキング。なんか写真が気に入った pic.twitter.com/Z4sYJqnAlL
— higrademe (@EL2031watson) 2020年2月9日
ロボットに調理とかさせる展示等をすることを見越し、食品衛生責任者の講習を受け資格取得。
ロボットに調理とかさせ始めたので念の為、食品衛生責任者の資格を取得。飲食店に一人必要なやつ。6時間の講習で取れる。食中毒など勉強になった。 pic.twitter.com/9H15dASpmk
— higrademe (@EL2031watson) 2020年2月10日
Universal Robots UR3を入手。Maker Faireへの出展きっかけとなる
UR3でピックアンドプレイスが一応できた。
— higrademe (@EL2031watson) 2020年2月19日
下にキューブはめる溝作れば回すこともできるかも。 pic.twitter.com/K1c1de71lU
3月
2d lidarをいくつか買う。
Lidar用の取り外し可能なマウントを作った。取り外しできないと犬用バッグに入らなくなってしまうという前回の教訓を活かして。 pic.twitter.com/msoS3WD2ti
— higrademe (@EL2031watson) 2020年3月4日
2d lidarのA2M6でスキャンしながら某場所を歩き回ってみた結果(x,yの単位はmm)。
— higrademe (@EL2031watson) 2020年3月6日
動いていることがそれっぽくわかる。
そしてさすが所々10m以上のスキャンができている。 pic.twitter.com/y3RSX1e803
Spot Microに障害物回避歩行機能を実装。
単眼カメラから障害物回避するモデルをJetBotを参考に、組み込んでみた。
— higrademe (@EL2031watson) 2020年3月21日
毎周期ごとにカメラから取得した画像から深層学習モデルで障害物有無を判定、障害物ありならその場旋回で回避。モデルは本家に習いAlexNetを200枚ぐらいのアノテーションデータでチューニング。判定は良好だが、駆動に難あり。 pic.twitter.com/CszBxrmay3
Windows MRでUniversal Robotsを遠隔操作する。
Windows MRのコントローラー経由でロボットアームを遠隔操作。
— higrademe (@EL2031watson) 2020年3月22日
取り敢えず少し値をいじっただけだからか、遅延が結構ある。 pic.twitter.com/Sz1VfgKOQq
やはり本家に習い前面にD435をつけられるようにしようと思い、Noseパーツに穴を開ける。縦L字型TypeCケーブルとかでギリギリ収まるかというレベル。 pic.twitter.com/yPk4BxS3nW
— higrademe (@EL2031watson) 2020年3月28日
ちなみにロボットアームの遠隔操作は操作者からVRヘッドセットからみるとこんな感じ。アームが伸び切るあたりで特異点を通っているように思われるが、それ以外は角度を制限してだいぶ安定化させたつもり。最新版にはUSBカメラの映像を見えるようにしたが、画角等の問題で、結局あまり使えなかった。 pic.twitter.com/zkADbBzcdK
— higrademe (@EL2031watson) 2020年3月23日
Spot Microの頭にD435をつける。
d435のRGBと深度それぞれの垂直視野角を可視化して見た。足が伸びると240mmぐらいだったから、その想定。センサー部から373mm水平に離れた地点から深度センサーで地面が検出可能に。中心の水平方向に関しては、深度は200mm以上からで近場が検出できないので、障害物回避はRGBで対応するのが良いか。 pic.twitter.com/XXAlN2krIf
— higrademe (@EL2031watson) 2020年3月28日
D435取り付け用Noseが印刷できたのでつけた。
— higrademe (@EL2031watson) 2020年3月29日
D435が思った以上に目立って不気味な感じが増す。新型iPadみたいに視野角の異なるRGBカメラ2つに加えて深度カメラ(方式はどちらかというとフロントの深度カメラに近いと思うが)という構成になった。ぼかし入れた記念撮影が出来るに違いない。 pic.twitter.com/zo83m4ZCUG
4月
Jetson Xavier NXのModuleが届く。
Jetson Xavier NXが届いた!
— higrademe (@EL2031watson) 2020年4月22日
Jetson Nano(右)との比較。B01ならボードがNXと互換性あるとのことで、サイズは同じ。しかし放熱用のヒートシンクの固定穴位置が異なり、要調達だ。あとMicroSDポートないからm2スロットかUSBにストレージ確保しないといけなさそう。キャリアボード買った方がいいかも。 pic.twitter.com/9QryPXe8gr
5月
Jetson Xavier NX Developer Kitが届く。
Jetson Xavier NX2種類。
— higrademe (@EL2031watson) 2020年5月17日
Xavier NX Developer KitとXavier NX Moduleを載せたNanoのキャリアボード。ボードサイズは同じだが、背面にWiFiのアンテナを埋め込む分DeveloperKitは少し長い。MicroSDカードスロットあるのは非常に助かる。Module版とは違い、Ubuntuマシンなしでセットアップできる。 pic.twitter.com/3xkSgK6ZjG
6月
Realsense L515が届く。
RealSense L515 早速Viewerで確認。なかなか境界がきれい。壁も結構まっすぐ。 pic.twitter.com/tEhLssFrQd
— higrademe (@EL2031watson) 2020年6月14日
Spot Microをブラウザで操作できる用にvue.js+Flaskでコントローラーを簡易Webアプリケーションとして実装。
4足歩行ロボットのコントローラーをWebアプリとして実装し、スマホからJetson上に立てたwebサーバーにアクセスしてコントローラーを取得、操作に成功。肝心の歩行はバランスがおかしくてうまく行ってないが、操作がかなりやりやすくなった。 pic.twitter.com/HLr1wSzgZk
— higrademe (@EL2031watson) 2020年6月15日
驚異の1万円という低価格の二足歩行ロボットPLEN.Dを購入。
PLEN.Dにローラースケート装着。台に傾斜があるのもあるが滑ってる感があって面白い。 pic.twitter.com/wvM8LuaSC8
— higrademe (@EL2031watson) 2020年6月18日
7月
KickstarterでバックしていたxArmのGripperがついに届く。
KickstarterでバックしてたxArmのGripperがアーム本体到着から6ヶ月以上の時を経てついに到着。
— higrademe (@EL2031watson) 2020年7月31日
遅れたお詫びとしてRealSense D435もついてきた。D435が更に増えた... pic.twitter.com/EVOV4GSXOl
書籍「予算1万円でつくる二足歩行ロボット」の通りに二足歩行ロボットを作る。表面実装に初トライ。
二足歩行に成功!
— higrademe (@EL2031watson) 2020年7月18日
背中のバッテリーの重みがあるから少し前に倒した状態を基本姿勢にする必要があった。 pic.twitter.com/2lkgCeBKJY
8月
RealSense D455が届く。
やっとRealSense D455が届いた。結構大きい。
— higrademe (@EL2031watson) 2020年8月28日
ここ2年でRealSenseシリーズが結構増えた。 pic.twitter.com/8hI0Zh2bjP
Spot Microの改良版として自作四足歩行ロボットの足をカーボンで作る。
初めてのCNCフライスによるカーボンの切削。意外とアルミより素直に行けた。粉は最新の注意を払ったが。そしてやっぱ圧倒的に軽い。 pic.twitter.com/1RYhyBoORc
— higrademe (@EL2031watson) 2020年8月1日
自作4足歩行ロボットの太ももの部分をアルミからカーボンに変えて、20gぐらい減らせた。 pic.twitter.com/TNp4kWf5ev
— higrademe (@EL2031watson) 2020年8月2日
9月
dogotix-MIC-01Bを注文。
10月
MakerFaire出展、またその出展内容についてロボティクス勉強会で発表する。
Maker Faire Tokyo無事終わりました。沢山の方にブース見ていただき、ありがとうございます。
— higrademe (@EL2031watson) 2020年10月4日
チーム名もう少しひねったほうが良かった気もしますが名前の通りの展示に一応なったので、これで良かったかなと。 pic.twitter.com/QX3kGvgCiG
Maker Faire Tokyo 2020に自動卓球返球ロボットを出展します。先人が既に数多くいますが、特徴は人間と同じような目線の高さに設置したステレオカメラ、協働ロボットを使っていることです。
— higrademe (@EL2031watson) 2020年9月27日
共同出展者の@chang_ban と本日調整を行いだいぶラリーが続くようになりました。https://t.co/JLTmPT0dnh pic.twitter.com/VQ0xbV50hr
ソフトグリッパーに興味を持ち、3Dプリンターやシリコンゴムで制作する。
2つで挟むとこんな感じか。確かに形状に沿ってうまいこと変形している。 pic.twitter.com/2QXVoA7R6u
— higrademe (@EL2031watson) 2020年10月9日
ソフトロボティクスの例のグリッパー、TPUで直接印刷してたが、今度は型を作ってシリコンゴムを流し込んで作った。かなり柔らかくなって把持面の摩擦力もかなり上がった。ここらへんでそろそろロボットアーム先端につけてものつかめるかを実験してみたいところ。 pic.twitter.com/vChAQqXvox
— higrademe (@EL2031watson) 2020年10月16日
ソフトロボティクスのグリッバー。2つ合わせて紙コップを掴む実験。
— higrademe (@EL2031watson) 2020年10月19日
握りつぶさず掴めた。 pic.twitter.com/ScIrrfYhMR
Pico Flexxを購入して試す。
動画では分かりづらいが、取り敢えず近づいてデプス取れるかの検証。かなり近くまで寄れる。 pic.twitter.com/ivX9xcB2fO
— higrademe (@EL2031watson) 2020年10月16日
Nintedo Switchのマリオカート ライブ ホームサーキット のレースにJetRacerを妨害キャラとして投入し吹っ飛ばす。
NSXを被ったJetRacerを1年ぶりに蘇らせ、マリオカートに妨害キャラとして投入。車高的にゲートを潜れないので、ゲートを避けるように学習させ自動運転。本気で走ったらマリオたちを破壊する可能性あるので、スピードは合わせた。
— higrademe (@EL2031watson) 2020年10月25日
従来は紙コップで進路分かりやすくしていたが、無しでも走れた。 pic.twitter.com/qNFgYLncGe
11月
M8 Lidarを入手する。
世間ではlidar付きスマホが話題ですが、私は3d lidarを入手しました。DHCPサーバーをPCで立ち上げてIPをlidar側に配布しないといけないとか慣れない作業で手こずりましたがなんとか動くことを確認しました。 pic.twitter.com/VjROR4bh7P
— higrademe (@EL2031watson) 2020年11月1日
16Lineの3D Lidarがあきらめきれず、Velodyne Lidar VLP-16-HiResのジャンク品を修理して使用可能にする。
動作不可品として入手したVelodyne VLP-16-HiResを修理してなんと復活!
— higrademe (@EL2031watson) 2020年11月15日
電源周りが何故か切断された状態だったのでDCジャック調達して半田したら普通に起動した。 pic.twitter.com/nMZTcEj8rI
Velodyne Lidar VLP-16を入手する。
Velodyne Lidarで皆さんがよく使っていらっしゃるのはやっぱ垂直角20度のVLP-16-Hi-Resじゃなくて30度のVLP-16ということで、こちらも入手。というかHi-Resが動いたのが予想外だったから図らずもこうなった。
— higrademe (@EL2031watson) 2020年11月16日
なんかロゴ違うけど偽物?3D Lidarだから取りあえずは動けば良し。 pic.twitter.com/JVZ6Ojlc6h
ROSでVLP-16で取った自前スキャンデータを使って3次元のSLAMを試す。
DockerでROS入りUbuntuイメージを量産出来る様になったので、LeGO-LOAMだけでなくてhdl_graph_slam用イメージも作った。
— higrademe (@EL2031watson) 2020年11月24日
性能比較として某コワーキングスペース内をVelodyne VLP-16で取ったデータで比較。
IMU無し。何回か試したがこの地形だとhld_graph_slamが良い。IMUあるとLeGO-LOAMも良くなるか。 pic.twitter.com/o0Fs4erfQQ
12月
myCobotを入手。
myCobotを早速入手。思ったより小さくて軽い。バックに入れて持ち歩けるレベル。本体は848gで6自由度。8.4V-5AのDCで動くみたいなので移動体に乗っけて使うとかできそう。 pic.twitter.com/njTjuFxVQv
— higrademe (@EL2031watson) 2020年12月1日
何らかの先行事例にインスパイアされて、myCobotに茶せん持たせて抹茶をたててもらった。
— higrademe (@EL2031watson) 2020年12月12日
取りあえずかき混ぜはできるが、スピード不足が理由なのか、美味しく見えるとされる泡がほとんど立たなかった。 pic.twitter.com/dAxDgNfkUZ
犬型ロボット dogotix-MIC-01Bが2か月以上の期間を経てついに届く。
その他
自作PCのグラフィックボードをGTX1080 からRTX3090に変更。
- 暖かいが暖房器具としてはもう少しパワーが欲しい。計算資源としてはなかなか。
iPhone XからiPhone 12 Proに機種変更。
総括
- 相変わらず色々ガジェットを買った。
- 給付金を見越して Jetson Xavier NXを2種類購入したが、サイズはJetson Nanoとほぼ同じ割に性能がかなり高く今後もっと活用していきたいと思った。
- CNCフライスでアルミとカーボン切削に挑戦。パラメータの調整がなかなか大変なことを知る。来年余裕あればCNCフライス購入したい。
- MakerFaireに出展。展示の難しさを知ったがかなり面白かった。
- 3D Lidar面白い。もう少し有効活用していきたい。
- 購入した犬ロボは思ったより大きくパワーもあった。試すスペースがなかなかなく、扱いの難しさを感じたが大きな四足歩行ロボットの可能性を感じた。
2019の振り返り
1月
Looking Glass 到着
やっとLooking Glass受け取った。さて何を出すか。 pic.twitter.com/dPzqOGz6SD
— higrademe (@EL2031watson) January 10, 2019
Cluster, VRChat初体験
- VRChatのすごさに感動するが、すぐにVR酔いしてしまう。
例のグラボ買う
Windows MR購入
- NorthStarMeetupで安いという情報を得たのでその場でポチる。
echo spot 導入
- カメラがついていて、アプリから遠隔監視ができるので、3Dプリンタの印刷状態を遠隔監視する用途に多用するように。
2月
NorthStarMeetup参加で刺激を受け3Dプリンターを購入(CR-10S)
3Dプリンターの進行状況を遠隔で確認出来るようにEcho Spotをプリンター前に置き、Alexaアプリで外出先から確認できるようにした。
— higrademe (@EL2031watson) February 9, 2019
単純だけどなかなか役に立つ。
プリント終了後にクールダウンして電源落とすところもなんとかしたい。 pic.twitter.com/8KyI21UKJH
3月
HoloLens 2の実寸大モックを作成
- 来日していたHoloLens 2の発表プレゼンをしていたMSの方からも賞賛の言葉を得る。
トルクヒンジを取り付けて、HoloLens 2のモックがフリップアップに完全対応。任意の角度で固定できて便利。 pic.twitter.com/nGVdLyHerb
— higrademe (@EL2031watson) August 10, 2019
Project North Star作成
- 3Dプリンターを使った初の大掛かりな製作作業。電源供給等でかなり手こずったが、なんとか動かせた。
今年の1月にアップデートされたProject North Star Update 3を製作した過程をまとめました。(と言ってもメモ書きみたいな感じ)
— higrademe (@EL2031watson) April 19, 2019
このやり方だとゼロから(と言っても3Dプリンター、工具は購入済みとする)作ると総額は5万近くになると思います。https://t.co/avPpcEmKZX#projectnorthstar
Davinci Color Mini購入
- 安くなってたのでカラープリンターに手を出してしまう。しかし狭い部屋に3Dプリンター二台はやりすぎだったことにあとで気づく(CNCフライスにしておけばよかったか)
4月
JetsonNano購入
Jetson Nano 入手 pic.twitter.com/kha4lZYgmz
— higrademe (@EL2031watson) April 6, 2019
xRTechで令和ことブルームと平成の手話で対応する文字を表示するアプリを展示
- 平成最後のxR Tech Tokyo
本日多くの方にNorthStar体験していただきました。ありがとうございます。
— higrademe (@EL2031watson) April 20, 2019
ちなみにどうでもいいですが、展示直前に改造してジェスチャーで額縁が上がって新元号が発表される仕様に変更しました。官房長官をセットにするところまでは間に合いませんでした...#xRTech pic.twitter.com/s2Zxe8ZpHe
Project North StarをT265で6DoF化
NorthStarにT265つけたら簡単に6DoF化した。アタッチメントの設計ミスってT265のカメラの下の方が少しLeapMotionで遮られるが、それでも位置トラッキングは結構良さそう。
— higrademe (@EL2031watson) April 23, 2019
あとはMapping...#projectnorthstar pic.twitter.com/NPDyHxP50X
5月
Jetson Xavierを購入。現在はxArmの制御用に使用。
やってしまった...
— higrademe (@EL2031watson) May 24, 2019
これでJetson TX2, Nano, Xavierの3つが揃ってしまった。
そして帰ったら不在票が3つも...
多分全部なんかのガジェット。1つしか心当たりがないのだが... pic.twitter.com/Izt36BrMKB
Oculus Questを購入
新しいガジェットを手に入れた喜びを昨日から味わいまくっている。
— higrademe (@EL2031watson) May 25, 2019
Oculus Quest pic.twitter.com/fjC4u1fsxA
6月
Structure Coreを購入
Structure CoreサンプルアプリをAndroid向けにビルドしてPixel3とCoreの直接接続でdepthとRGB表示出来た。
— higrademe (@EL2031watson) June 24, 2019
Mac向けにもビルドできて、少しソースいじったらrgbとかdepth mapとply形式の点群も保存できていたので、色々試せそう。 pic.twitter.com/KxdZInJB06
7月
ZEDを購入
Jetson Nano x ZEDモバイル点群メッシュ収集セットが完成した。
— higrademe (@EL2031watson) July 7, 2019
電力が結構ギリギリで、ZEDはセルフパワーUSB HUBにつなぎ、モバイルバッテリーで電力補助してJetsonNanoに入れている。ZEDそのままNanoにつなぐとアプリ起動時に落ちる。まあメモリもかなり厳しめのようだが、とりあえずZEDfuは使える。 pic.twitter.com/Vf3QZlc23k
Xtion Pro Liveを購入
Xtion pro Live がJetson Nanoで動いた。こちらもおそらく電力不足で直接つなぐと落ちたから、セルフパワーののUSBHubで電力を供給。 pic.twitter.com/9qM2oRHQKl
— higrademe (@EL2031watson) July 25, 2019
SR305を購入
とりあえずMacでlibrealsenseがビルドできたのでSR305を繋いでviewer起動したらSR300として認識された。やっぱ中身は... pic.twitter.com/cXIhA2aMok
— higrademe (@EL2031watson) August 1, 2019
8月
例のグラボで自作PCを作成、TensorflowをGPU使用で動かす
例のグラボ、例のマザボで2つ目の自作PC完成。取りあえずtensorflowいれてMNISTが動いた。マザボにPCIe 3.0が一つしかないため、PCIe 2.0につないでいる2つ目のグラボはROCmで使えず、意味なさそう。
— higrademe (@EL2031watson) July 31, 2019
グラボ一枚としてパーツ代は4-5万かな。諸事情により、CPUはPentiumでケースもまだ買ってないが... pic.twitter.com/TqiHvbaBpo
M5Stick VとCを購入
自作アイトラッキング装置を作成、xRTechで展示
自作アイトラッキングシステム、キャリブレーションして、なんとかそれっぽくアイトラッキングできるようになってきた。アプリケーションを作る時間がほぼなくなってしまった...
— higrademe (@EL2031watson) August 17, 2019
明日展示します。#xRTech pic.twitter.com/xWGwGvtYYz
第二種電気工事士に合格
第二種電気工事士に無事合格。初の業務独占資格だ。
— higrademe (@EL2031watson) August 19, 2019
これでIoT系の作業とかできることの幅が増えるはず。
Mediapipeのハンドトラッキングを試し性能の高さにびっくりする
Googleから公開されたmediapipeのハンドトラッキングをPixel3で早速試してみた。一部トラッキング失敗してるが、単眼でリアルタイムでかなりオクルージョンにも強く驚き。 pic.twitter.com/28ssCDOjqf
— higrademe (@EL2031watson) August 20, 2019
JetRacerを作成
NVIDIAの公開している #JetRacer 、ついに紙コップ(別名パイロン)で作られた円形のコースを自動走行成功。一箇所コップをふっとばすが、2周目そこをうまく避けるという技を披露して感心(そして彼走るの早い)。もっともコースが簡単でこれは難易度は低いかもしれないから、複雑な場所で試したい。 pic.twitter.com/umn7c6gWPC
— higrademe (@EL2031watson) August 25, 2019
Coral Dev Boardを購入
Edge TPUのボード、Coral Dev Boardのサンプルの顔認識プログラムををCoral Camera使って実行できた。120fps超えのようだ。 pic.twitter.com/J5yys7v8Yu
— higrademe (@EL2031watson) September 4, 2019
9月
JetBotを作成するが壊れる
JetBotの障害物避け、Nvidiaの公開している学習済みモデル使っただけでも結構うまく柱とか壁とか避けてて、良いなと思い、調子に乗って狭いテーブルで試してみたらこうなった...
— higrademe (@EL2031watson) September 14, 2019
被害総額はカメラ部分の破損により6000円くらい... pic.twitter.com/QVckNYKdQx
JetRacer作成記事を投稿
NvidiaのJetson Nanoを使ってラジコンを自動走行させるJetRacerの作成過程を以下の記事にまとめました。なかなか物品調達や3Dプリントや加工やらハードルは高いですが、参考までに。https://t.co/RWSPwK0KU7
— higrademe (@EL2031watson) September 11, 2019
Spot MiniにインスパイアされたSpot Microというオープンソースの四足歩行ロボの作成に着手(色は青白)
ついに自作4足歩行ロボットが歩行っぽい動作かできるようになった。と言っても色々問題があって右によってしまう...
— higrademe (@EL2031watson) October 5, 2019
PWMのサーボ12個、Jetson Nano。SpotMicroという某社ロボの小さい版のOSSプロジェクト。ソフトは取りあえず自作。IKの座標とかを間違えまくってかなり時間掛かった。 pic.twitter.com/3MzJIEbRgd
10月
回路Cadに入門、作成した基盤を実際に海外に発注
海外に発注した自作基板ついに到着。値段も安く到着までも1週間ちょっと。
— higrademe (@EL2031watson) October 28, 2019
届いた基板、設計通りだが初心者が作りました感に溢れる見た目... これでpca9685の制約を超えて6V以上、一応10Aまでサーボに電流流せるはず、なにか勘違いなければ... 全部同時にストールトルクに達するとまずいが... pic.twitter.com/jxg8hGQJhS
四足歩行ロボ第二世代を作成(色は青黒)
自作4足歩行ロボット、サーボをハイトルクに交換して、歩行パターンも改造してほんの少しマシになった。でもバランス崩すことも多くまだ安定して動くとは言えない。
— higrademe (@EL2031watson) October 21, 2019
4足歩行の歩容の情報が検索しても最近の論文ばかりで気軽に試せるのが見つからない... なにかいいのあったら教えて下さい。 pic.twitter.com/IcFcO4rEJL
11月
xArmをいじる。自動水やりを試しにやってみる。
少し前に届いてたxArmやっと動かす時間取れたので、取り合えずじょうごをテープでつけて水やりをさせてみた。
— higrademe (@EL2031watson) November 3, 2019
個人でロボットアームで遊べる時代?になったのはありがたい。 pic.twitter.com/mSYdWjSUuO
ラズパイ4を購入
とりあえずラズパイ4の起動からメニュー画面出るまでの温度計測をしてみた。
— higrademe (@EL2031watson) December 2, 2019
8倍速。よくわからないが、起動させるだけならこんなところか。
ちなみにCPUには反射しないようラズパイのケースについてきたテープを貼った。 pic.twitter.com/2AWLXNH587
12月
AI Carのアドベントカレンダーに投稿。初アドベントカレンダー参加。
「JetRacerの自動走行の仕組み」という題でAI RC Car Advent Calendar 2019の12/8の記事として投稿しました。
— higrademe (@EL2031watson) December 8, 2019
初めてのアドベントカレンダー参加で、しかも前日にJetRacerの調子が悪くなるという事件もありましたがなんとか1日で投稿まで持って行けたのでとりあえず一安心。https://t.co/Iir9PKjMAb
四足歩行ロボの骨折を機に足回りの改造、trot歩行に成功
4足歩行ロボット、予備で作ってた足に取り替え再度チャレンジ。
— higrademe (@EL2031watson) December 30, 2019
高速で歩くのに向くトロット歩行に成功。
驚異の時速0.67km/hを達成w
足のジョイント部をプラスチックから金属に変えて足位置がしっかり決まるようになったのが良かったと思われる。 pic.twitter.com/VoGKOy1kMo
総括
- 相変わらず色々ガジェットを買った。
- 3DプリンタでNorthStar, HoloLens 2のモック, JetRacer, JetBot, SpotMicroなどを作成し、3Dプリンターに大変お世話になった。
- 第二種電気工事士試験に合格、また回路cadでサーボモーターの電源供給用の自作基盤を制作し総じて電気系の知識が結構増えた。
- 去年まで継続して出していたアプリは今年作らなかったが、ハード制作系に初チャレンジ。色々難しさを知る。
- xArmをいじり初のロボットハンド操作を体験。購入したセンサー類などと組み合わせ、今後様々なタスクにチャレンジしたい。
- 四足歩行ロボットはやっと前進ができるようになった。今後深度カメラ or LidarとSLAM、深層学習等を組み合わせ自動で動くペットのような動きをさせたい。
JetRacerの自動走行の仕組み
JetRacerとは
Nvidiaが公開しているJetsonNanoを用いた自動走行カープロジェクトがあります。 github.com
前回の記事ではこちらの作り方を説明しました。
作った当時はとりあえずサンプルのJupyter Notebookをただ実行するだけで動かしていただけでした。 今回こちらで自動走行ができる仕組みについて少し調べてみました。
基本的なラジコンの仕組み
まず自動走行する以前に、JetRacerの改造前のラジコンについて考えてみます。
車本体の位置を制御することに関して、ラジコンのコントローラー(プロポ)からステアリング(Steering、進行方向)・スロットル(Throttle、進行速度)の2つの信号が車側の受信機に届き、値に応じて車に取り付けられている2つのモーターの動きを制御しています。
ラジコンの自動走行
ラジコンを自動走行させるには基本的には人間に変わり、何らかのセンサーを使い状況を認識し、判断を行いステアリング・スロットルを適切に制御することで自動走行を実現します。
現在の標準のJetRacerではスロットルはあらかじめ指定した固定値を常に維持し、車正面に搭載のカメラから得られた情報を元にステアリングの値を変化させることでコースに沿った走行が実現しています。
ちなみにJetRacerでスロットルを状況に応じて自動で操作するということは可能で、方法はいくつか考えられます(前に参加した大会ではステアリング角に応じた速度の値を決めることでコーナーでは低速、直線では高速にする改良を行い、タイムを大幅に縮めることができました)
スロットル制御については以下の記事でもmasato-kaさんが触れられていますので、興味のある方は参考にしてください。 masato-ka.hatenablog.com
カメラ画像からからステアリング角を決める仕組み
上で述べたように、自動走行には人間の目に変わりコースの形状・車の位置などを認識し、それに応じた制御をする必要があります。
こちらは実際の自動車の自動運転では車両前方につけたカメラで白線認識を行ったり、奥行きまで認識できるセンサー(Lidar、ステレオカメラ、ミリ波レーダー)などを用い、車の空間における位置関係を把握しステアリング・スロットルの判断を行うということが行われていると思われます。白線認識を行ったり、LidarなどのセンサーをJetRacerに搭載することも可能ですが、システムが複雑になったり、重量・価格などがネックになってしまいます。
もっともシンプルに自動走行を実現するには通常のWebカメラのようなカメラ1つ(単眼カメラと呼ばれる)からステアリングを直接推定することです。 そんなこと可能なのかと思われるかもしれませんが、近年人気のディープラーニングを使って、「画像を入力->ステアリング角を出力」を行ったという論文をNvidiaが数年前に発表しました。
End to End Learning for Self-Driving Cars (2016) https://images.nvidia.com/content/tegra/automotive/images/2016/solutions/pdf/end-to-end-dl-using-px.pdf
詳細は省きますが、内容としては「道路を走行中の画像」と「その画像を撮影した時点での車のステアリング角」のペアのデータを大量に収集し、CNNというニューラルネットワークにその関係を学習させ、走行中にその時点での画像から直ちにその時点で取るべきステアリング角を推定し実際にステアリング角を変化させるということを行っています。
JetRacerの自動走行もこの論文と同様の原理で自動走行しています。 唯一異なる点は論文のように実際の走行時のステアリング角を学習のターゲットとせず、各画像に付与した車が向かうべきターゲットピクセル座標(x,y)を使って正しいステアリング角を擬似的に作り出している点です。
具体的に見ていきましょう。
上記のレポジトリ内の jetracer/notebooks/interactive_regression.ipynb を順に実行することでデータ収集、学習を行うことができますが、実行して画像を収集していく過程で、TASKという変数名で指定した名前から始まるフォルダが、jetracer/notebooks内に作成されています。 そのフォルダ内のapex内に画像ファイルが以下のようなファイル名で保存されていると思います。 99_109_xxxxxxxxxxxx.jpg
このファイル名先頭の2つの数字が画像を保存する際にクリックしたピクセル座標x,yに対応しています。
なおこのファイルの保存の処理はnotebooks/xy_dataset.py内のXYDatasetクラスのsave_entry関数で行われています。
class XYDataset(torch.utils.data.Dataset): (中略) def save_entry(self, category, image, x, y): category_dir = os.path.join(self.directory, category) if not os.path.exists(category_dir): subprocess.call(['mkdir', '-p', category_dir]) filename = '%d_%d_%s.jpg' % (x, y, str(uuid.uuid1())) image_path = os.path.join(category_dir, filename) cv2.imwrite(image_path, image) self.refresh()
filenameを x_y_uuid.jpgという形式にしてフォルダに保存していることがわかります。 jupyter notebook上のカメラ画像の座標をクリックするごとにこの関数が呼ばれ、画像とターゲットのピクセル座標をファイル名内に入れて保持します。
ネットワークをトレーニングする際にこの画像とファイル名を読み込んで学習を行います。 なお実際にネットワークから出力するx,yの値はピクセル座標ではなく、画像サイズを元の値から割って得られる -1 から1の値です。
なおこの処理は上の画像を保存する処理が入っているnotebooks/xy_dataset.py内に記述されており、
class XYDataset(torch.utils.data.Dataset): (中略) def __getitem__(self, idx): ann = self.annotations[idx] image = cv2.imread(ann['image_path'], cv2.IMREAD_COLOR) image = PIL.Image.fromarray(image) width = image.width height = image.height if self.transform is not None: image = self.transform(image) x = 2.0 * (ann['x'] / width - 0.5) # -1 left, +1 right y = 2.0 * (ann['y'] / height - 0.5) # -1 top, +1 bottom if self.random_hflip and float(np.random.random(1)) > 0.5: image = torch.from_numpy(image.numpy()[..., ::-1].copy()) x = -x return image, ann['category_index'], torch.Tensor([x, y])
の中の
x = 2.0 * (ann['x'] / width - 0.5) # -1 left, +1 right y = 2.0 * (ann['y'] / height - 0.5) # -1 top, +1 bottom
でターゲットのピクセル座標ann['x']、ann['y'] がそれぞれ-1 ~ 1 に変換された x,yになっていることがわかるかと思います。
お気づきかもしれませんが、このターゲットのピクセル座標を予測しても、実際のステアリング角とは異なるので、通常は予測結果をそのままラジコンのステアリング角には使用できません。
JetRacerではこの予測したピクセル座標(-1~1に正規化)のxの値をそのままステアリング角とみなします。ステアリング角も-1~1の範囲に正規化されているため、例えばもっとも左にステアリング角を取るとき(steering = -1)はx=-1となり、もっとも右にステアリング角を取るとき(steering = 1)はx=1となります。
このxの値をそのままステアリング角とみなすというのはやや極端かと思いますが、カメラが車体進行方向に対してまっすぐに取り付けられているとするならば、画像の真ん中を境にマークの位置に応じて左右のステアリング値に直接変換するというのはもっとも簡単で手軽な方法の1つだと思います。
実際の画像を見ていただくとわかりますが、真ん中から左側をクリックするときはステアリングは左、右側をクリックするときはステアリングは右になっていそうなことがわかると思います。
ピクセル座標の値をステアリング角とみなして、実際にラジコンにステアリング指示を行う処理はjetracer/notebooks/road_following.ipynbの最後のセルに記述されています。
import numpy as np STEERING_GAIN = 0.75 STEERING_BIAS = 0.00 car.throttle = 0.15 while True: image = camera.read() image = preprocess(image).half() output = model_trt(image).detach().cpu().numpy().flatten() x = float(output[0]) car.steering = x * STEERING_GAIN + STEERING_BIAS
の中の
x = float(output[0]) car.steering = x * STEERING_GAIN + STEERING_BIAS
の部分が、学習済みモデルに画像を入れて出力されたピクセル座標のxの値を取り出し、ステアリング角(car.steering)に変換している部分です。 実際の処理ではSTEERING_GAINという値をかけることで、ステアリングの値を多少小さめに指示する操作を行っています。こちらの値は使用するラジコンの最大ステアリング角等を見て調整することでより性能の良い自動走行を実現できると思われます。 またSTEERING_BIASはステアリング値に一定値を常に加える処理ですので、カメラが車体本体から左右にずれていたり、重力の軸周りに回転してしまっている場合あるいはラジコンのステアリング機構自体の左右へのズレを補正するためのもので、そういうズレがなければ通常STEERING_BIAS=0.00で問題ないと思います。
ピクセル座標のyの値は標準のJetRacerでは使用しておりませんが、こちらは画像をクリックしてアノテーションを行うときのことを考えると、奥行き方向に関連する情報を持っている可能性があると思いますので(コース上をクリックするとするならば視界の先をどれだけ見渡せるかで速度を出せるかどうかの目安にできる?)、速度(throttle)に関する制御に使えるのではないかと考えられます。
以上で簡単ですが、JetRacerの自動走行の仕組みについて自分の理解の範囲で解説させていただきました。 勘違いや、JetRacerの自動走行の仕組みについてより詳しい背景等ご存知でしたら是非ご指摘願います。