LancerStratos’s blog

第23回ロボットグランプリに向けたロボットランサー”ランサーストラトス”開発記録

HYPERDRIVE

NETFLIXで偶然面白い番組を見つけた。HYPERDRIVEというカーレースものだが、その中に日本人選手が出ていて、他の選手と異なるドリフトテクを駆使している様がとてもカッコよくて誇らしい。

HYPERDRIVEの谷口敦史さん

他の選手の車両には起立したサイドブレーキレバー(?)がついていてそれをドリフトのきっかけに利用しているのだが、谷口選手の車両にはそのような装備は見当たらない。頭文字Dサイドブレーキをきっかけにドリフトするのは初心者とかいったセリフがあったような気がするので、優勝は逃したものの谷口選手だけが異次元のテクを持っていたようです。HYPERDRIVEってタイトルがいいよね。個人的にはスターウォーズのハイパードライブを思い出すけど。

さて、ロボット開発に話を戻します。年始にロータリーエンコーダを右前輪から車体後部に移設したため、フロントバルクヘッドあたりに空間的な余裕が生まれました。フロント部は3mm厚アクリル板のシャシーのみでつながっているので、しならないように以前から補強したかったのですが、ステアと共にスイングするロータリエンコーダが邪魔だったのです。車体後部に移設した今なら補強できます。

ということで、松戸にある工作室アルタイルさんのレーザカッターで3mmアクリル板から部品を切り出し、フロント部と中央部の間をステアリング機構の隙間を縫うようにしてダブルデッキ形状になるように補強しました。

スティフナーを追加したランサーストラトス

この改造で明らかにフロントから中央部にかけてのシャシーのしなりが減少しました。

あと、秋月電子にてBNO055 9軸センサーフュージョンモジュールを調達しました。最近売り切れ表示が続いていたので無くなる前に購入できて良かったです。

ギヤボックスの改修など

いまだロボットグランプリHPには開催に関する情報が掲載されていませんね。

本来ならプログラムを本番用に仕上げるべきところですが、この週末は機体構造で気になる部分があるので手直ししました。

後輪の車軸は3mmのカーボンシャフトを使用していましたが、六角ハブやストッパーのイモネジで簡単に変形してしまうので、思い切ってステンレスシャフトに交換しました。3mmΦステンレスシャフトは固いですが切断部位以外に傷をつけないようにビニールテープで保護した状態で金鋸で切り落とし、金やすりで切断面を整えました。3mm穴ボールベアリングの装着はかなりきつかったですが、なんとか圧入できました。アクリル板にボールベアリングを埋める6mmΦの穴をあけていますが、すこしガタがあるため、フランジ部分とアクリルをホットボンドで固定しました。

ホットボンドがベアリングの隙間に入らないようにテープでマスキング

するとこれまでのガタがかなり少なくなりました。ベアリング自体のガタはあります。これは3mmステンレスシャフトに強引に圧入した際にベアリングを変形させてしまった結果かもしれません。まあよしとします。

自宅から車で少し走ったところに昔ながらの模型屋さんがあり、そこでミニ四駆オイルペンとミニ四駆Fグリスを購入しました。これをスパーギヤとピニオンギヤの接触面に塗布しました。走行させると、かなり静粛になったように感じます。

 

エンコーダの移設

新しい1年が始まりました。コロナパンデミックもだいぶ落ち着き、5類への指定変更が間もなく行われるかもしれない状況ですが、今年のロボットグランプリは開催されるのでしょうか。ホームページにはいまだ情報が掲載されていませんが、3月には開催されることを信じてランサーの開発を続けます。

昨年ホームセンターで購入したアルミ板を金切り鋏で切りだし、切り口を紙やすりで整えた後、曲げたり穴をあけたりして、ようやくロータリーエンコーダを機体後部に移設しました。

ロータリーエンコーダの移設

紙やすりは、金属用ではありませんでしたが、アルミが柔らかいせいか、きれいにバリを取り除くことができました。エンコーダ用ホイールは、昔のランサーに使っていたマウスのホイールを流用しました。ゴム部分がちょうど適当なグリップを持っています。また、なんの偶然か、エンコーダホイールの直径が、タイヤ直径のちょうど半分だったので、プログラム修正も楽でした。距離分解能が2倍になります。

ロボットグランプリが3月中旬に開催されるとしたら、あと2か月半しか残されていません。デッドレコニングは後回しとし、今後は的突きプログラムを作成調整することにします。

ジャイロの出力値(その4)

ワールドカップイタリア戦

寒さが日に日に増してきました。サッカーワールドカップ対イタリア戦は、日本が勝利して凄くうれしかったです。私はスポーツはあまり興味の沸かない方ですが、堂安選手や三苫選手のプレーには感動を覚え、金曜日の帰宅の電車内でYoutube動画を見て涙を流しました。

さて、今週末はジャイロ出力が意図しない点を解消しました。L3GD20Hジャイロの初期設定において、フルスケールの設定を2000dpsにしているのですが、これが不完全なのではないかと(勝手に)解釈し、2回同じ設定を繰り返してみると、今のところ症状は再発していません。あまり納得いかない対策ですが、とりあえず再発するまではよしとします。

そうこうしていると、今度はSDカードログが変なことに。1000個の時系列データを走行後にSDカードに書き込むのですが、なぜか1000個以上のデータが書き込まれます。これも通信がうまくいってないのだろうと(勝手に)解釈し、1個書き込んだらHAL_delayで少し間を開ける、という気休めのような対策をしておきました。

日曜の夕方、近くのホームセンターに行き、ジャイロと機体を接続するための材料を探しに行きました。いろいろ脳内検討し、0.3mmアルミ板を購入しました。これを加工して機体後部に尻尾のようにエンコーダを設置しようと考えています。ノートに鉛筆でデザインを描いてみました。来週末は板金加工になりそうです。

デッドレコニング実験(その1)

折角の祝日ですが雨が降っています。が、ロボットランサー開発には関係ありません。さて、新しく装備したジャイロの出力と、ロータリーエンコーダによる移動距離を使って、機体位置の計算をさせてみました。

ジャイロもロータリーエンコーダも、その出力は10msec毎に取り出しているため、10msec毎に三角関数を使ってX方向とY方向の移動距離を計算し、一つ過去のデータに足していく、とても単純な積分を試してみました。最初の実験では、次のようなログとなりました。

走行ログその1

?なんでこうなるのか、少し悩みましたが、三角関数の引数の型をdoubleとすべきところ、floatのままにしているのが原因でした。修正した結果は以下の通りです。

走行ログその2

期待していたとはいえ、このグラフを描けた時は感動のあまり思わず声がでてしまいました。若干、スケールに実際との誤差がありますが、模擬コースの形状をほぼ再現できており、かなりいい感じに計算できているのではないかと思います。

誤差の修正方法として、右前輪に直結しているエンコーダを、後輪中央に移設することを検討しています。右前輪は左カーブする際に機体中心よりも外側に位置するため、移動距離が大きめに出てしまうのです。つまり、シャシーを再設計しなければなりません。結構な改修作業になりそうです。

OneDriveとSTM32cubeIDE

人力飛行機

朝ドラ「舞い上がれ」に出てきた人力飛行機のプロペラの構造について、実際の人力飛行機コンテストで同様なレイアウトの機体を見たことがあって『一体どうやってペラを回しているんだろう』と思っていましたが、とある場面でプロペラ回転軸が機体の軸の外側にパイプ状に取り付いているのを見つけて、そうだったのか!と一人納得しました。機体軸が撓んだ時の回転抵抗の増加が気になりますが、すごいアイデアです。来週から航空学校編ですね。

さて、ロボットランサーに話を戻します。ジャイロの出力が使えそうなので、コース端のコーナをデッドレコニングで走らせたいと考えています。これができれば、円柱標的やショートカット走法も視野に入ってきます。現在のプログラムをかなり弄ることになるので、プロジェクトを新規作成しようとしたところ、小型ノートPCのバッテリが故障したので、大型ノートPCに開発環境を移しました。STM32cubeIDEのワークスペースをOneDriveにすることで、PCを変えても同じように開発が続けられるようになりました。ついでに、OneDriveのことをよく理解していなかったので、これまで不要にアップロードしていたファイルを整理しました。

今後の予定として、

1 コーナを一定舵角などで走行させ現在位置の計算方法を確立

2 現在位置計算値を使って操舵角を制御しスムーズな180度回頭

3 回頭終了直前から直線コースへの復帰アルゴリズムの調整

を考えています。果たして上手くいくでしょうか。今年中に「1」の目途をつけたいと思っています。

ジャイロの出力値(その3)

先週、秋月にて調達したL3GD20HジャイロモジュールをランサーストラトスのSPI予備端子に接続しました。ショートを防ぐためハヤコート(緑)で絶縁していたものを、ハヤコートリムーバで除去し、手持ちの両面ユニバーサル基盤やピンソケット等を使って、見てくれは悪いですがとりあえずハードは接続できました。

ジャイロモジュールの追加実装

モジュール調達前に準備したプログラムはやはりうまく作動しませんでした。都合3日ほどかけてやっとSPI接続ボーレート5MHzで読み出しができるように修正しました。

参考までに私の関数は以下の通りです。

/*
 * spiL3GD20H.c
 */
#include "stm32f4xx_hal.h"
#include <stdio.h>
SPI_HandleTypeDef hspi3;

/////////////////////////L3GD20H////////////////////////////
#define CTRL4 0x23    //フルスケールの設定レジスタ
#define CTRL1 0x20    //ODR,カットオフ、パワーモード、XYZ軸の有効化選択レジスタ
///////////////////////////////////////////////////////////
uint8_t GyroTempData[3];//センサからのデータ格納用配列
int16_t gZ = 0;//16bitの出力データ
//float gyroZ = 0;//ジャイロセンサから求めた角速度

//SPI通信用関数

void L3G_SPI_Write (uint8_t data, uint8_t WriteAddr)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, 0);    //PB2 Low L3GD20H select
    uint8_t cmd[2] = {WriteAddr | 0x00, data};
    HAL_SPI_Transmit(&hspi3, cmd, 2, 1);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, 1);    //PB2 high L3GD20H de-select
}

void L3G_SPI_Read(uint8_t *pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, 0);    //PB2 Low L3GD20H select
    uint8_t cmd[1+NumByteToRead];
    cmd[0] = ReadAddr | 0x80 | 0x40;
        for(int i = 1; i <= NumByteToRead; i++)
           cmd[i] = 0x00;//dummy byte
        HAL_SPI_TransmitReceive(&hspi3, cmd, pBuffer, NumByteToRead+1, 1);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, 1);    //PB2 high L3GD20H de-select
}

void writeRegister(uint8_t subAddress, uint8_t data)
{
    L3G_SPI_Write(data, subAddress);
    HAL_Delay(10);
}

void readRegisters(uint8_t subAddress, uint8_t count, uint8_t* dest){
    L3G_SPI_Read(dest, subAddress, count);
}

void L3GD20H_setup()
{
  writeRegister(CTRL4, 0x30);    //00110000    Full scale; 2000 dps
  writeRegister(CTRL1, 0x8C);    //10001100    ODR; 400Hz,     Cut off; 20Hz, Power mode; Normal, Z; enable,    Y and X; disable
}

int16_t L3GD20H_GetData()
{
    readRegisters(0x2C, 2, GyroTempData);
    gZ = (int16_t)( (uint16_t)(GyroTempData[2]<< 8) + GyroTempData[1] );
    return gZ;
}

Z軸出力のみ取り出しています。しかも物理量には換算していません。ネットに転がっていたいろんなソースファイルを参考に作成しました。このプログラムはSTM32F405RGT6のSPI3を使っています。呼び出しにかかる時間は計測していません。

SDカードで取り出したログの例が以下の通りです。この時系列グラフは、10msec毎にサンプリングしたジャイロ出力値と、ステアリングサーボの現在値です。前のジャイロセンサMPU9250の出力よりはマシになりました。ヨーレートは前輪操舵角と車速度に関係した値ですが、グラフではほぼ同じ傾向に見えます。また、コース端での旋回中に一度当て舵的な操舵部分があります。これを藤原拓海君の様に何とか無くしてスムーズな旋回にしたいと考えています。

ジャイロ出力値とステアリング指令値