2025年11月25日火曜日

第4回新ROBO-剣参加

11/16に行われた 第4回新ROBO-剣に参加しました。ロボットは去年と同じ「逡巡」です。

結果は本戦トーナメント2勝1敗、敗者トーナメント(本戦で早めに負けたチームによる別リーグ)第2位でした。新ルールでは、今回初めて有効な攻撃で勝利を挙げることができました。勝利した試合はすべてストレートの2本先取となっており(1本取った後に電源が落ちてタイムを取得したことによる反則のみ1回あり)、安定した動作ができるようになってきたと思います。

今回の変更点としては、システムの信頼性を向上させ、また開発途中だった部分を完成させ、前回できなかった動作をできるようにしたということになります。

特に、「移動しつつアームの動作を開始して、アームの届かない範囲から攻撃を行う」という動作も部分的に実現し、試合のアルゴリズムにも組み込んで実際に有効打突を取ることができました。「部分的に」というのは、予め進む距離を固定値(25cm)で与えてあり、この分アーム原点をずらして打撃成功する軌道が作れたら採用する、となっている点です。本来は踏み込む距離も逆運動学の変数に入れて解くのが綺麗なのではないかと思います。

試合のアルゴリズムは大まかには、次の3つを常に行います。

1. 相手の方を向く
2. 相手との距離を保つ
3. 有効打突部位が打てそうな状態であれば打つ

またこれらと並行して、フィールド外周から落ちないように、縁に近づいたらその近さに応じて中央方向に戻す速度ベクトルも加算しています。現在位置の認識はIMUと独立計数輪で測った移動距離をスタート地点から積算するのみとなっています。ROBO-剣のルールであれば試合時間の3分程度は誤差も許容範囲に収まると読んで設計した方法でしたが、今回実際にそれが証明されました。

特に敗者トーナメントの決勝戦では、相手ロボットはアームの届く距離まで接近しようと近づいてくる一方で逡巡は踏み込んでの打撃に適した距離を保とうとし、結果的にフィールドの周りを回りながら3分間ずっと追いかけっこ(後ずさりで逃げる側)しつつの攻防が繰り広げられる、という格好になりました。次第に誤差によりリング縁に寄っていき最後は車輪のうち1つがリングから脱輪したもののそのまま復帰し、時間一杯まで動作を続けました。

上記のような刺激反応系のreactiveな部分しかできていないため、この例もそうですが、相手によっては膠着状態になってしまうことがあります。せっかくマップ上での自己位置という大局的な情報が使えていてこれは優勝ロボットにもないものなので、次はこれを活かして相手の横に回り込む、追い詰める、等といった戦略的な部分も実装したいと思います。

また、基礎となる制御的な面で改善点というかまだ実現していない点になりますが、次は移動している標的にも当てられるようにしたいと思います。

これは、現在は相手が止まっているものとして動いているため、動き回り続ける相手にはなかなか当たらない、というよりも原理的に当たらない、という状態になっています。テーブルホッケーロボットと同様に対象物体の移動履歴からの外挿による行き先予測を使えばひとまずできるのではないかと考えています。

実はこの逡巡でも既に一度作ったことがあったのですが、当時は固定型アームだったため、相手も直線的な予測しやすい軌道では動かない上、外挿はノイズを増幅するため誤差も出やすい、ということで保留していました。移動型の新ROBO-剣では効果の方が勝るかもしれません。

十分な効果を得るには対象物の位置計測の精度と、全体的な処理速度の向上も必要となります。3次元点群を入力とする処理をしているので処理量が多くなりがちで、現状では毎秒7〜15回ぐらいとなっていました。これを改善するのが次の課題となります。

優勝した「メタリックファイター」は毎秒30回のビデオフレームレート内で処理が終わるようにという縛りをソフトウェア設計に入れており、単純なラスタ画像(深度)の処理で相手の認識を行っている、処理対象データもなるべく減らしている、とのことでした。逡巡ではガードをかわしての打突(防がれるような打ち方はしない)ということも目指しているので3次元点群を対象とする処理という方式は変えないと思いますが、この30fpsを目安として少しでも近づけるように今後処理の方法を考えていくことにします。

2025年10月25日土曜日

超音波浮揚実験装置 version 3

スイッチサイエンスの委託販売で「超音波浮揚実験装置 version 3」を販売開始しました。

旧バージョンの「超音波浮揚実験装置」を2年ぐらい前から同じく委託販売していました。これは好評で何回か追加納品を行い合計で48台売り上げました。その後この新版準備を始めてからしばらく品切れ状態になっていました。この新バージョンは、今後より安定して多くの人の手にとってもらえるように、設計を一新したものです。超音波を出力する部分の機能はMCUも同一で同じですが、装置全体や基板の形も変わったので別商品として登録、旧商品は販売終了としました。


見た目通り、基板に2個のスピーカーを向かい合わせて直接固定する方式になり、ネジとスペーサーによる組立が不要になりました。代わりに、基板を立てるスタンドも付けました。

また、回路設計の変更点としては次のものがあります。

「一般的なUSB-Cが使用可能」: 旧バージョンは電源供給用のUSB Type-CコネクタVBUSの5Vを使っていたため、USB-AからUSB-Cへの変換ケーブルを使う等する必要があり、スマートフォンの充電器等をそのまま使うことができなくなっていました。新バージョンでは抵抗を使ってsink側であることを識別させるport configuration processに対応したので、供給元が何であっても動作できます。

「改造用に3V~5Vで動作可能」: コイルを用いたスイッチング昇圧回路を搭載しており、入力電源から12Vまで昇圧して超音波スピーカー駆動の電源としています。また、制御用の5Vもこの12Vから降圧して供給するため、電源が5Vより低くても動作可能です。これは、乾電池2~3本での動作を想定しています。旧バージョンでは昇圧回路にチャージポンプ方式のMAX662を使っていたため入力がほぼ5Vに限定されており、またVBUSの5Vを直接MCUの電源としていたためこれができませんでした。

なお、製品名が超音波浮揚実験装置「version 3」、基板のバージョンが「3.2.1」となっています。

version 1はもちろん旧バージョンの「超音波浮揚実験装置」ですが、version 2 が一応存在するということです。version 3と同じスイッチング昇圧回路を入れた、形状はversion 1と同じ、というものでした。

また、version 3.2.0は基板の色違い(緑)で、スタンドを組み合わせるスリット部分のサイズが0.3mm前後違う(少し緩かった)、というものでした。こちらはMaker Faire Tokyo 2025で販売し、7台完売となりました。

更に遡ると、3.0.0はLEDの向きが上向き(眩しい)かつスピーカー間のギャップがもう少し広かった、3.1は回路パターンの引き方が違った、等といろいろ細かい改善を重ねています。

途中までバージョンをA、B、…としていたのでその名残で2.0.0はD、1.0.2はC、という文字がバージョン番号に含まれています。

2025年7月19日土曜日

GS2 LiDAR

知能ロボコン出場にあたり、LiDARユニットGS2を使いました。

競技台の特定箇所で壁との相対姿勢を計測し、ロボットが移動するの際の位置と向きの基準をリセットするために使用しました。


RGB-Dカメラがあるのでこの使い方は本来不要かもしれませんが、元々新ROBO-剣に向けて床面検出用にと購入していたもので、昨年・一昨年の時点では結局使っていなかったのでこの際使ってみました。

YDLIDARの提供するROSパッケージを使うと、ROSで類似したセンサーを扱う際に一般的なsensor_msgs/LaserScan型のメッセージとして受け取ることができます。LiDARから得られる情報は、方向角それぞれに応じて反射した物体との距離および反射強度(更に信頼度合いconfidenceがある場合も)、となるのでそれを表す型になります。但しGS2の場合は2つのイメージングセンサーを持っており、それら各々の画像で独立して三角測量を行えるため、視野の重複部分は1つの角度に対して複数の点があることになります。そのため、このROS用ライブラリでは適当に結果を統合して1つのセンサーをエミュレートしているのではないかと考えられます。(実際、別の専用アプリを使うとその前のデータを確認することができます。)

LaserScanのデータから線分を構成する点群を探し出すためには、仮説(線分の位置と回転)の生成・フィッティング・最適化等の処理が必要になりますが、それらはlaser_line_extractionというそのものずばりのパッケージがあったのでこれを使用しました。
図: GS2によるlaserscanとlaser_line_extractionで線分として検出した部分の可視化。GS2と知能ロボコンでの使用に合わせてパラメータは調整した。

なお余談ですが、LiDARといえばレーザー光を回転させて様々な角度でToFの原理による距離測定を行うものと思っていたのですが、"light detection and ranging"または"laser imaging, detection, and ranging"の短縮語とされて(https://en.wikipedia.org/wiki/Lidar)いるので、仮にラインレーザーのように同時に複数点を照らす光切断法のような計測方法でも広い意味でレーザー光と検出器を使った距離測定ではあるのでありなのか、ということに気づきました。ソフトウェア上ではデータフォーマットとしては上記のように同一視して扱いますが、アーティファクト(現実と違う意図しない計測結果)の出方等で異なる特性があるかもしれません。

2025年6月30日月曜日

知能ロボコン2025参加

6月14、15日、知能ロボットコンテスト2025にロボット「逡巡」で出場しました。

昨年同様、新ROBO-剣用のロボットを最小限の改造で流用、基礎的なプログラムの開発を進めるとともに実運用して問題点を洗い出すという目的でした。

結果は決勝戦まで進出、チャレンジ技術賞を受賞しました。ロボットを1つのロボコンで終わらせず工夫して活用しているということが、技術的チャレンジとして評価されました。

新ROBO-剣参加時と異なる点は以下の通りです:

  • 竹刀を吸引装置と交換(剣の刀身部分も交換、本来は柔軟な竹ひご)
  • 足元のボールが見えるようにカメラの取り付け方を変更
  • スタートスイッチとして使っている無線ゲームコントローラーをロボットに搭載
    (知能ロボコンルール上はロボットのパーツの一部、よって単独型)
  • プログラムの一部 (ボール認識、アームの動き、知能ロボコン競技のための動作シーケンス等)
結果として、アームが不必要に長い上に本来ないはずの大きな質量を先端に増やしてしまっており、ロボットの性能としては良くない状態なのですが、その反面動きも見た目も「本来の用途と違うロボットを改造した」という感じがして特徴的になったのではないかと思います。

決勝戦の映像です

昨年より主にソフトウェアの開発を進め、またセンサーを追加して一応の完成といえる状態まで進めることができました。しかしながら、対象物エリアの全面を探索するための最終的なアプリケーション部分が完成しなかったため、エリア半分ぐらいまでのところでプログラムとしてはシーケンス終了となり、時間を残して競技終了となりました。満点を狙える程にするためには個別の動作、特に対象物探索をシームレスに行うなどしなければならないので、単純に探索範囲を追加するだけでは難しかったと思います。

知能ロボコン参加ロボットとしての昨年からの実質的な改良点は以下のような事項があります:

  • アームのモーション
ボールをゴールへ投入する際、昨年は後方に投げるようにしていました(去年の動画参照)。この動きは実はとても速いのですが、ボールを地面に跳ねさせるため若干不確実性があると考え、今回はゴール前まで持っていき、地面の高さまで下げてから落とすようにしました。このとき、ボールを上に保持する姿勢から下げた姿勢へと単に各々の関節角度を遷移すると、肘と肩が同時に伸展した状態を経由するためにゴールネットに接触してしまいます。そのため、キーフレームをいくつか追加して先に肘を下げるような動きとしました。(映像で見てください)
また、ボールを拾う際にも、吸い付けたボールが更に前方にある壁やボールと干渉しないように、少し引き付けながら持ち上げているのも注意深く見るとわかると思います。
  • LiDARによる自己位置補正
LiDARのYDLIDAR GS2を車体下部前方に追加しました。これはもともと(2年前から)ROBO-剣で相手または床を検出するようにと用意していたものでしたが、今回ようやくロボットに取り付けられた形です。スキャン面は水平面内に向けて、LiDARの最大距離まで壁を検出できるようにしました。
  • 3色のゴールに運搬する処理を実装
昨年は移動制御がちゃんとしておらず、長い距離を移動するとどうせ失敗するだろう、ということで常に最も近い赤ゴールに投げていました。上記、自己位置補正が入ったことで半永久的に動き続けることが可能となったので、色分けして捨てる機能を実装しました。色の認識は、実はボールを拾う際にカメラで位置と同時に色も認識しているため、昨年から変更ありませんでした。
  • 目標地点への移動制御

昨年時点では、PID制御すらフルに実装されておらず、ほぼP制御(本来は目的地から遠いときに速度ベクトル方向を与えるための処理の流用)しかなく、かつ駆動輪モーターのバックラッシによる発振を抑制するために、停止位置誤差も数cm許容していたような状態でした。そのため対象物の拾い上げもよく失敗していました。今回、目標地点付近では位置を目標位置にする普通のPID制御(但しx,y方向独立)を導入し、パラメータ調整をちゃんとすることで、目的地に正確に停止できるようにしました。移動終了判定の誤差が1cm以内となっています。映像でも、一旦止まったように見えてその後じわっと微速で動き出して調整する様子が見えると思いますが、これがPIDの積分項が効いている効果です。

画像をもとにボールを拾う位置に移動するときも同様のことを行っています。これにより確実にボールを拾えるようになりました。やはり自動制御ロボットでは基本的な動作を順に積み上げていかないといけないという好例ではないかと思います。

その他の写真:

今年は、競技中に自分で写真を撮るぐらいの余裕がありました。(動画記録用デジカメはまた別にあり)


今年初めて、パンフレット用のロボット紹介写真とデータがポスターとして掲示されていました。とてもわかりやすくて良かったと思います。


2025年6月29日日曜日

KONDOのロボット用シリアルサーボのためのUSB-ICS変換基板

KONDOのICSとは、 KONDOのロボット用サーボシリーズ(KRS-2500番台、4000、5000番台など)等に採用されている半二重調歩同調・CMOSレベルのシリアル通信規格です。技術資料が公開されています。1本の信号線で送受信を行い、同一バス上に複数のデバイス(主としてサーボ)を接続できます。IDを指定してサーボに目標位置の指令を送る他、現在位置や電流などの状態を取得したり、速度や電流のリミット等の動作パラメータを設定、更にはIDや通信速度等の設定をサーボ内の不揮発記憶に書き込む等の操作が行えます。

この通信はKONDOのロボット用マイコンボードRCB-4やKCB-5等が行う他、PCからシリアルポートとして認識させて直接通信を行うため専用のUSBインターフェースアダプタも市販されています。(KONDO Dual USBアダプター。ICS USBアダプター(No.02043)は販売終了)

今まで、「銀雲雀」「逡巡」「テーブルホッケーロボット」「インタラクティブ・ペンプロッタ」等のロボットでPCから少数のサーボを制御するため使用してきました。

KONDO純正のUSBアダプタはコネクタがUSB-Aで限定されること、RCB用のシリアルとの切り替え式となっていること、また価格もそれなりにする、などの理由でロボットに搭載するには不便なところもあるため、最近になって自作しました。


秋月のFT234X 超小型USBシリアル変換モジュール を使用しました。これにより難しいはんだ付けをすることなくUSBのmicroBコネクタを使うことができます。このモジュールには4本のピンに加えて、基板裏面のパッドにもう一つ、FT234のCBUS0端子が出ています。このCBUS0端子はI/Oであり、機能を選択して使えます。工場出荷時にはTXDENとなっています。

TXDENはRS485等のバスでの送信を許可するタイミングを出力する機能で、送信データのスタートビットの1ビット前からストップビットまでの間ONになる、となっています。ICSの半二重シリアル通信も「送信時のみ出力をONにする」という点で同じなので、スリーステートバッファの74HC126をこの信号で制御して使います。ブレッドボード上で確認して最大速(1.25Mbps)の通信速度でも動いたので、採用しました。


この基板はFT234Xモジュール基板とぴったり2枚重ねにして接続して使用します。ピンヘッダ接続用の4本のピンはそのまま上下に導線を通してはんだ付けできるのですが、CB0端子は表面にパッドがあるのみなので、ここははんだごての先が入る程の大きめのスルーホール穴を開けておいて基板同士を直接はんだ付けするようにしました。
なお本来このように基板に基板を直接ハンダ付けするような場合はM5Stampのように端面スルーホールにするとよりはんだ付け作業がしやすくはんだ付け状態も確認しやすいので確実なのですが、端面スルーホールは基板製造を注文する際に追加料金が発生するため、このような方法を採用しました。

上の回路は信号線とGNDのみを接続するものなので、実際にサーボに接続するにはサーボの電源を別途接続する必要があります。「逡巡」などのロボットではサーボハブ基板を作り、これにその機能を持たせています。(但し2025知能ロボコン時点では動作実績の確認が不十分だったため、このICS変換基板の採用は見送り、純正のUSB DUALアダプターを載せていました。)


(緑の基板左にある1個だけ離れた3ピンコネクタが信号線用で、左のUSB変換基板と接続する。残りのピンヘッダはサーボ、白いコネクタはサーボ電源)

2025年6月13日金曜日

VSCodeで[Enter]キーが単語補完機能に横取りされないようにする

Visual Studio Codeの単語補完機能は有用ですが、エディタの使い方によってはかえって文字入力の妨げになるケースもあります。

例として、新しい入力行の末に

len

と入力するとき、"len"が候補になく"length"が第一候補にある場合、最後に改行のenterを入力すると"length"に補完されてしまい、かつ改行文字の入力が1回無効化される形になります。これをさせず単に文字入力をするには、[Enter]入力の前にEscキーを押す等の追加の操作が必要となります。

これは [Accept Suggestion On Enter] という設定項目で制御されています。(control+[,]設定タブでacceptSuggestionOnEnterを検索)

この項目はデフォルトでonになっていますが補完を入力するキーには他に[Tab]があるため、こちらを使う場合は上記設定をoffにしてもよく、私はこの設定で使うことにしました。

第4回新ROBO-剣参加

11/16に行われた 第4回新ROBO-剣 に参加しました。ロボットは去年と同じ「 逡巡 」です。 結果は 本戦トーナメント 2勝1敗、 敗者トーナメント (本戦で早めに負けたチームによる別リーグ)第2位でした。新ルールでは、今回初めて有効な攻撃で勝利を挙げることができました。勝...