まずは機体
名前を付けてなかったんで特に呼び名はないんですけど、私はIKEAのサメが好きなので「ゴルフサメサメ」とでも呼んでおきます。
うーん、カッコイイですよね。見た目はこだわりました!(動くかどうかは別問題……)
簡単に説明すると、このロボットでゴルフボールを自動でゴールに入れます。もちろんボールの認識もゴールの認識も自動です。なのでそれなりに良い(良さをどう定義するかによるが)センサが載ってます。パソコンも載ってます。右側に見えるボタンは緊急停止用のボタンですね。

ルール&大会紹介
大会としては山梨県で行われてるローカルロボコンの「ロボコンやまなし」と呼ばれるものです。毎年11月くらいに大会が開催されています。この大会、ホームページが年に数カ月しか開設されてなかったりして結構マイナー大会なんですよね。基本大会参加チームは県内の学校だけです(東京○○大学って言うと驚かれる)

参加した競技は「自律型ゴルフロボット競技」と呼ばれるもの。一般人でも参加できるらしいですよ。
ルールとして「ロボットは完全自律型」「ロボットと外部の通信は禁止」あたりが重要。つまりコントローラ等を用いての操縦は禁止です。結構難易度が高いですね。
ハードウェア
アクチュエータとしてはロボット移動用の車輪(2輪)、ボールを打つクラブを動かす用のサーボモータ(1個)だけです。

足回り
能動2輪+受動1輪の三輪移動体です。ちなみに車輪は全て自作(3Dプリンター+アルミ)です。
能動輪の駆動にはステッピングモータを用いて速度制御を行います。制御用にL6470を使ってます(ちなみにこれ一個1500円なのにリフローで2個破壊しました…)あ、もちろん駆動回路は自作です。秋月とストロベリーリナックスのL6470の評価ボードの回路図を(パクって)参考にして作ってます。初のArduinoハット基板、設計たのしーい!
ハード的には結構速度出せるはずなんですけど、いろいろあって(後々出てくる)大会当日は亀より遅いんじゃないかくらいの速度でしか走れませんでした。
受動輪は自作オムニホイール。樽はTPUで作って、スポークにあたる部分はアルミです。あんまり重くしたくなかったので樽の回転部分はPOMスペーサーとPTFE切ったやつで摺動性を確保してます。3~4キロ程度の重さなのでこれで十分ですね。
クラブ揺動機構
ここはボールを打つ強さを任意に変化させられる必要があったのでサーボモータで直接揺動しています。
サーボモータは秋月のfeetech sts3215。RS485で動くやつです。まあまあトルク出るはずなんですけど、ゴルフで必要なのはトルクじゃなくて速度なんですよね~。なんでリーチの長さが重要(フラグ)
で、このサーボ、Arduinoで動かすときにsoftwareserialで動くかと思ったらなぜか動かずhardwareserialでしか動きませんでした(なんでだろうね)パソコンとの通信でArduinoのhardwareserialを使いたかったので手持ちのArduino Uno R3では機能的に不十分(!)ということで中華Arduino Uno R4を買ってきました。R4はhardwareserialが2チャンネルあるのでこれならUSB通信しながらサーボを動かせます。
その他
バッテリーはAmazonとかで売ってる強めの(12V3A以上出せるやつ)モバイルバッテリーを使ってます。というのも、LiPoとかLiFeは管理がめんどくさいし、下手すると火吹く。ということでいい感じに充放電管理がされてるモバイルバッテリーを買ってきました。やっぱりこれの方が気にすることが少なくていいですね~。
一応このロボット、7インチのタッチディスプレイが付いてます。必要だったかといわれると……。どのみちSSHで繋いでたので。見た目Good、処理能力Bad、ですね。

↑初めて作ったArduino HAT (こいつはチップ破壊したやつなんで配線が汚いのはご愛嬌)
ソフトウェア
「ROSを使いたい!」ただそれだけがモチベーションだと言っても過言ではない。
なので、ROS2使いました。便利でしたね。
LiDAR
上に載ってる円筒形のやつが2DLiDARです。最近秋月で同じような奴が売ってますけどこれはYDLiDAR T-mini Proってやつですね。購入当時12kくらいしました。意外と検出距離が長くて6mくらいなら余裕で見れます。ただ、点群密度は荒いです(点群数は少ないほうが処理的には軽くていいんですけどね)
このLiDARで見てるのはゴールのポールです。このゴルフ競技ではゴールの部分から赤外線が出てるんで普通は(?)その赤外線を見てゴール検出するんですけど、私はそういう甘いことはしたくないのでゴールの部分のポールを見ることにしました。
結構これがいい作戦だった(?)らしくほかのチームが会場で外乱の影響を受けてた誤作動してたのに対してこのロボットは特にそういうことはなかったですね。
YDLiDARはROS用のドライバがあるのでこれ使えば楽勝ですね(なおそんなに楽勝ではなかった模様)
カメラ
Webカメラが付いてます。このカメラでゴルフボールを検出しています。
ボールの検出には今流行りのAIを使いました。昨年の学ロボでも使ってるチーム(なお弊学)があったYOLOってやつです。大量に色を塗ったゴルフボールの写真を撮ってアノテーションしてデータ作りました。大変でしたね~。
これも他のチームはHSVマスクとかを使って色でボールを認識するのがメジャーらしいんですけど私はそんな甘いことはしたくないので(2回目)YOLOです。
ボール検出についてもほかのチームが外乱の影響で誤作動してたのに対して、このロボットの検出は安定していました。
ボールが検出できればあとはカメラ上でのボールの座標を平面上の座標に変換するだけです。適当にやりましょう。ここで得られた平面座標は適当なパブリッシャーを作ってROSで流してあげます。そこの説明はしません!
大問題
え、ここまでできれば普通に動きそうじゃないですか。
そうも甘くはないんですよ。
ラズパイがカス
ラズパイは素晴らしいです。それは間違いないですが、今回のタスク的には向いてなかったです。
そもそもラズパイでUbuntuを動かさないで下さい。しかもデスクトップです。もうすでに重い。私の使っているラズパイは4の4GBバージョンですよ。
グラフィックが重い。調子乗ってディスプレイ付けたからさらに処理が重い。必要なかったですね。他のチームがラズパイ3でディスプレイなしだったので如何にいかれたことをしていたことか。
YOLO重すぎ
ただでさえ処理の重いラズパイでYOLOを動かそうとするからとてつもなく処理が遅いです。重すぎで、ROSでパブリッシされるデータはおおよそ3秒前のボールの位置です。つまりロボットを早く動かしすぎるとボールの位置が送られてくるときには明後日の位置にロボットが移動しており、ボールの検出位置がまともに使えません。なので亀みたいな速度でロボットが動きます。
YOLOの軽量化か何とかするべきでしたね。ほかのチームがHSVマスク使う理由も分かります。
ボールの飛距離がカス
さっきも言いましたが、ゴルフではモータのトルクより速度が重要です。でも、私には見た目の方が重要でした。特に何も考えず「これでええやろ」って設計したクラブをロボットに取り付けました。
使い物になりませんでした。(それはそう)
もう全部設計しちゃっていたので今から変更するのも無理だな~と思って大会当日もそのままで突っ込んでご想像の通り全然ボールが飛びませんでした。
リーチを長くしましょう!
結果&総括
結局順位は4/5位でした。まあ、ROSを使えたので私は満足です。
流石に今年も同じ間違いはしたくないのでYOLOを使います(学習してない)いや、変えるのはそこじゃなくてプロセッサですね。もっと強いシングルボードコンピュータ買います(買いました)
クラブのリーチは長くします。
新しい技術も取り入れたいので今年は複眼にしてデプスを読めるようにしたいな、とか思いつつ……。

↑ IKEAのサメの乗った「ゴルフサメサメ-サメサメ」