naokichiのブログ

しがないロボコニストの雑多なブログ

自己紹介

はじめに

過去の経歴を振り返りながら、自己紹介をさせていただきたく存じます。

中学時代

中学に「科学部」というものがあり、何となく入部。そこでロボコンと出会いました。ロボコンでは主にWRO(World Robot Olympiad)とロボカップジュニア(サッカー)に参加していました。

www.wroj.org

www.robocupjunior.jp

夏はWRO、冬はロボカップジュニアという感じで活動していました。ロボコン以外だと、たまに水ロケットを飛ばしたりもしてましたね。(この時期の写真とか何も残ってない…orz)

高校時代

中学に引き続き、科学部に所属しておりました。ロボカップジュニア(サッカー)に加えて、缶サット甲子園というものに参加していました。

www.space-koshien.com

高2の後半から受験勉強に専念し始めたので、高校でロボコンをしていた期間は比較的短かったように思います。(この時期の写真も何も残ってない…orz)

学部1年~2年

なんやかんやあって、関東の某大学に進学。たまたまロボコンサークルがあったので、入部しました。2021年夏にはF^3RC(エフキューブ)という大会がありそれに向けてロボットを製作していましたが、大学から対面参加の許可が下りなかったのでのちに同じルールで部内ロボコンとして開催しました。

f3rcontest.web.fc2.com

2022年春には関東春ロボコンに参加しました。対面参加の許可が下りなかったのでオンラインでの参加でした。4ステに取り組めて楽しかった(結局あまりうまく動かせなかったけど…)。

www.youtube.com

2022年夏には関東夏ロボコンに参加しました。優勝しました。

www.youtube.com

現在

NHK学生ロボコン2023に向けて活動中。

おわりに

ここまで読んでくださった方、ありがとうございました。今後とも当ブログをご覧いただけますと幸いです。

DCモータを回してみたい(制御編)

まえがき

ブラシ付きDCモータを回してみた(制御編)。とりあえず簡単な速度制御を行ってみました。制御器設計にはMATLAB/Simulinkを活用しました。

システム同定

ブラシ付きDCモータにおける、端子電圧から回転子の角速度への伝達関数は2次遅れ系。 モータのインダクタンスが非常に小さいとすると、1次遅れ系に近似できる。 今回はこの仮定の下に、ステップ応答を測定し曲線フィッティングにより1次遅れ系の時定数 Tとゲイン Kを求めました。

[システム同定の様子]

曲線フィッティングの様子。Excelのソルバーを使えばいい話ですが、イキリなのでPythonでやっている()。
脳筋システム同定()ですが、上手くいってしまうのでいつもこれでやってます()。

不感帯の測定

モータが起動する電圧を測定し、それ以下の電圧を不感帯としました。

シミュレーション(とゲインのチューニング)

Simulinkで遊んでいる瞬間が一番制を実感する!

Simulinkモデル

  • PID制御を用いました(今回は速度制御なので内部モデル原理によりPI制御)。
  • setMotorっていうのはデューティ比を千分率で表したものだと思ってください。
  • 左下のRampは入力をランプ状に変化させて台形加速させようとしたときのものです。
  • 上側の伝達関数は電流どれくらい流れるかな~と概算しようとしたものです。

(恐らく、多くの人を苦しめる)ゲインのチューニングですが、Control System Toolboxに入っているPID Tunerを使って行いました。

PID Tunerを使ってチューニングしている様子
判断基準:位相余裕85°近くあるしヨシ!(適当)
制御器の各種パラメータ

出来上がったSimulinkモデルの実行結果を以下に示します。

実行結果(ステップ入力のとき)
実行結果(ランプ入力のとき)

マイコンへ実装

上記の制御系をマイコンに実装します。今回はz領域で設計したのでオイラー法を用いました。以下はmain.cから抜粋。

/**
 * @brief PID制御器
 * @param input 入力値
 * @param target 目標値
 * @return 操作量
 */
float PID(float input, float target)
{
    const float K_p = 1.08717133443287f;
    const float K_i = 0.05749282f;
    const float K_d = 0.0f;

    static float error;
    static float ierror;
    static float derror;
    static float output;

    error = target - input;
    derror = error - derror;

    output = K_p * error + K_i * ierror + K_d * derror;

    ierror += error;
    derror = error;

    return output;
}

補足

マイコンで行っていることは、

  • ロータリーエンコーダの角度を読む
  • PID制御の計算
  • モータの駆動
  • メインの計算機(今回はマイPC)との通信

です。今回は全てLL APIを用いてみたのですが、ナイーブな実装でも1ステップあたり5usくらいで終わるようでした(コンパイラによる最適化は入れてるけどね)。以下に今回使用したSTM32CubeIDE用プロジェクトのリポジトリを載せました。 github.com

結果

[モータが回っている様子]

まぁ回りますよね()。本当はシミュレーションの結果と実際の応答とを比較検討するべきですが…メンドクサイのでやってない

あとがき

現代制御もやってみたい。最適レギュレータの設計とか面白そうだし。 www.mathworks.com ↑を見ると、LQRのほうが外乱特性が良いみたい。

DCモータを回してみたい(回路編)

まえがき

ブラシ付きDCモータを回してみた(回路編)。

写真

部品実装前
部品実装後
これはプロトタイプなので色々アレな部分がありますが…。

回路

(自分のような)初心者の設計した回路をネットの海に放流するのはあまり良くないとされていますが…ままええやろ(適当)。

回路図
選定理由など

  • マイコン:STM32F303K8
    • モータ制御に関する機能が豊富な、高機能タイマが大好きなので。
  • MOSFET:RJ1G12BGN
    • ロームから支援でいただいたやつ。ありがとうございます。
  • SBD:RBR5LAM60A
    • ロームから支援でいただいたやつ。ありがとうございます。
  • フォトカプラ:TLP152
  • レギュレータ:NJM7812
    • 部室に転がっていたもの。

仕様

  • モータ側電源:11V - 25V
  • 最大出力電流(連続):5A
  • 最大出力電流(瞬間):200A
  • ロジック側電源:5V
  • 通信方式:USB
  • PWM周波数:128kHz
  • 制御方式:SMB
  • 制御周期:10us
  • エンコーダ入力

結果・感想

735モータが(無負荷ではありますが)回った。負荷試験もしてみたい。 電流センシングは自分の技量では無理でした(泣)

あとがき

???「時代はブラシレスやで」

わい「はい・・・」

関東夏ロボコン2022の参加記録

概要

関東夏ロボコンは、NHK学生ロボコンに参加する団体向けの新人ロボコンです。

kantouharurobo.com

2022年大会にサークルのメンバーでチームを組んで出場しました。

戦績

優勝でした(ちなみに2年連続)。詳細な結果は以下。

優勝:横浜国立大学「常盤の森ねこねこカレッジ」

準優勝:東京農工大学「R.U.R」

技術賞:東京工科大学「ロボティオン」

イデア賞:東京工業大学「Maquinista A」

特別賞:東京工業大学「Maquinista B」

作ったロボットについて

マシン

製作したロボット。前方についているアームでキューブを把持する。

コンブとワカメが作ってくれました。足回りは4輪メカナムです。キューブを運ぶ/投げるためのアームにはエアシリンダを用いています。これ一本ですべての競技課題を遂行できるスグレモノ。他大と比べても小さいロボットなのが特徴的でした。

制御

STM32マイコンを用いてロボットを制御しました。開発環境はSTM32CubeIDEを用いていました。以下にGitのリポジトリを貼っておきます(誰も興味ないと思うけど…)。

github.com

関東春ロボコン2022の経験から、「高度なことをやろうとすると失敗する」と思ったので、競技課題遂行に最低限必要な機能のみを実装しました。具体的には、

  • コントローラとの無線通信
  • 4輪メカナムの逆運動学計算
  • オブジェクトを把持するアームの開閉

です。なんとびっくりYaw軸制御すら入っていない。

回路

モータードライバは先代のを使わせていただきました。その他の基板も春ロボのときのを使いまわしていました。

雑感

優勝できてよかった。あと久々のオフラインロボコンだったのですが、かなり楽しかった。

関東春ロボコン2022の参加記録

概要

関東春ロボコンは、NHK学生ロボコンに参加する団体向けの新人ロボコンです。

kantouharurobo.com

サークルのメンバーでチームを組んで出場しました。(COVID-19の影響により)大学から対面参加の許可が下りなかったので、オンラインでエキシビションとしての参加となりました。

戦績

エキシビションとしての参加だったので、戦績はありません。

作ったロボットについて

当時作ったSlideShareのほうがわかりやすかったのでそれを貼っておきます。

www.slideshare.net

マシン

コンブとワカメが作ってくれました。特徴的なのはその足回りですかね。いわゆる独立4輪(有限)ステアリング機構になっています。ステアリングはサーボモータ(DS5160)で、ドライブモータは735です。

制御

STM32マイコンを用いてロボットを制御しました(実際に使用したのはNUCLEO-F446RE)。開発環境にはSTM32CubeIDEを用いていました。以下にGitのリポジトリを貼っておきます(誰も興味ないと思うけど)。

github.com

実装したのは

  • 4ステ制御のための逆運動学
  • コントローラとの無線通信
  • Yaw軸制御

など。

回路

モータードライバは先代のを使わせていただきました。一応自分でも設計は進めていたのですが、うまく動作しませんでした…。自分で作った回路といえば、マイコンボードと各種デバイスを接続するためのマザーボードくらいですかね…。

雑感

対面参加許可は下りないし、ロボットは動かせずじまいだしで散々でしたが、4ステの制御に取り組めたのはよかったと思います。

全方向移動台車のオドメトリ

概要

ロボコンでよく行われる「接地エンコーダとジャイロセンサを用いたオドメトリ」についてのメモ。 (実際はほかの記事から参照する予定なので書いただけ…) 間違っている部分があるかもしれません。

機体中心を向いた接地エンコーダ2個

機体中心を向いた接地エンコーダ2個の場合。
上の図はあくまでも一例です。接地エンコーダの場所は何でもいいです(機体中心を向いてさえいれば)。 樽の軸方向のみの力が作用することに注意すると、

 \displaystyle
v_1 = v_x\cos\theta + v_y\sin\theta \\
v_2 = -v_x\sin\theta + v_y\cos\theta

これより、

 \displaystyle
v_x = v_1\cos\theta - v_2\sin\theta \\
v_y = v_1\sin\theta + v_2\cos\theta

 v_x v_y \omega積分してやれば姿勢を推定できます。

接地エンコーダ2個

少なくとも一方が機体中心を向いていない場合。
上の図はあくまでも一例です。接地エンコーダの場所は何でもいいです。 樽の軸方向のみの力が作用することに注意すると、

 \displaystyle
v_1 = v_x\cos\theta + v_y\sin\theta + l\omega\sin\alpha \\
v_2 = -v_x\sin\theta + v_y\cos\theta

これより、

 \displaystyle
v_x = (v_1-l\omega\sin\alpha)\cos\theta - v_2\sin\theta \\
v_y = (v_1-l\omega\sin\alpha)\sin\theta + v_2\cos\theta

 v_x v_y \omega積分してやれば姿勢を推定できます。

接地エンコーダ3個

接地エンコーダ3個の場合。
上の図はあくまでも一例です。接地エンコーダの場所は何でもいいです。 樽の軸方向のみの力が作用することに注意すると、

 \displaystyle
\begin{bmatrix}
v_1 \\
v_2 \\
v_3
\end{bmatrix}
=
\begin{bmatrix}
\cos\theta & \sin\theta & l_1\sin\alpha \\
-\sin\theta & \cos\theta & 0 \\
-\sin\theta & \cos\theta & l_3\cos\beta
\end{bmatrix}
\begin{bmatrix}
v_x \\
v_y \\
\omega
\end{bmatrix}

これより、

 \displaystyle
\begin{bmatrix}
v_x \\
v_y \\
\omega
\end{bmatrix}
=
\begin{bmatrix}
\cos\theta & \frac{l_1\sin\alpha\cos\theta}{l_3\cos\beta}-\sin\theta & -\frac{l_1 \sin\alpha\cos\theta}{l_3\cos\beta} \\
\sin\theta & \frac{l_1\sin\alpha\sin\theta}{l_3\cos\beta} + \cos\theta & -\frac{l_1 \sin\alpha\sin\theta}{l_3\cos\beta} \\
0 & -\frac{1}{l_3\cos\beta} & \frac{1}{l_3\cos\beta}
\end{bmatrix}
\begin{bmatrix}
v_1 \\
v_2 \\
v_3
\end{bmatrix}

 v_x v_y \omega積分してやれば姿勢を推定できます。

MATLAB用UTM-30LXライブラリを作ってみた

概要

MATLABでUTM-30LXを使うためのライブラリを作ってみたので、そのご紹介。(需要があるのかどうかは知らない。)

ライブラリ

File Exchangeにアップロードしています。

www.mathworks.com

GitHubリポジトリはこちら。

github.com

使い方

decodeSCIP.m、LidarScan.m、setURG.mの3つがライブラリを構成するファイルです。sample.mにありますように、

  1. シリアルポートを開く。
  2. setURG()関数を呼ぶ。
  3. LidarScan()関数で距離データを取得する。
  4. "QT"を送信して計測停止

という感じです。

実行結果の例

実行結果の例。レーザースキャンが表示されている。

こんな感じです。

参考文献

ehab alkhatib (2023). MATLAB Driver for Hokuyu URG family (https://www.mathworks.com/matlabcentral/fileexchange/57425-matlab-driver-for-hokuyu-urg-family), MATLAB Central File Exchange. Retrieved .