東京工業大学 ロボット技術研究会

東京工業大学の公認サークル「ロボット技術研究会」のブログです。 当サークルの日々の活動の様子を皆さんにお伝えしていきます。たくさんの人に気軽に読んでもらえると嬉しいです。
新歓特設ページ        ロボット技術研究会 HP        ロボット技術研究会 twitter公式アカウント

みやび。

「ロボット技術研究会」通称「ロ技研」は、その名前の通りロボットの制作や研究はもとより、電子工作や機械工作、プログラミングなどの幅広い分野にわたるものつくり活動を行っています。

カテゴリ一覧: loading

PID制御で経路をトレースするようなシミュレータ作ってみた



アクア研として書くのは恐らく初めてですね。
アクア研所属14のみやびです。鉞が怖いとびくびくしながら更新しています。

さて、アクア研として初めに何をしようか迷ったのですが、
自分が興味のある部分から行こうということで、制御に関することをやってみました。
今回作ったのは、任意の経路をトレースする(しようとする)物体のシミュレータです。
youtubeにちょっとした動作テストの動画をあげましたので、興味がありましたら。
パラメータ調整している時間がなかったのでまだまだトレースとは言えません。


以下では、
①制御するためにどのように考えたのか
②今後どのように発展させるのか
この二つについて簡単にお話ししたいと思います。


①制御するためにどのように考えたのか
今回はPID制御を使おうと考えました。
PID制御とは、大雑把にいうと、制御したい対象の現在の値と目標値との差(偏差)に対して
P:そのもの
I:積分値
D:微分値
を算出して、それにいい感じの係数をかけて出力に回すという方法です。
時間による出力をu(t)、偏差をe(t)などとすると、

u(t)=Kp*e(t)+Ki*(∫(0→t)e(x)dx)+Kd*(de(t)/dt)

と書けます。
ところで、いい感じと表現したのは比喩ではなく、
トライアンドエラーで繰り返していけばいい雰囲気で制御できる係数を発見できてしまいます。
むしろ最適係数を一般に出す方法は存在しないように思えます(制御対象の特性で変わるので)

さて、今回はトレースしたいので位置が制御対象ですね。
目標値はどのように設定設定するかというと、
マーカーを任意の点におき、それらを繋いだ経路が目標値ということにします。
このマーカーをつないだ経路をトレースするように動いて欲しいです。
では、偏差はどのように設定すれば良いでしょうか。
もしマーカーとの距離だけを偏差として設定すると、確かに全てのマーカーを通るような挙動になりそうですが、
それは経路をトレースしているようには見えない可能性があります。(例えばぐるぐる渦巻き状に近づいても良くなる)
そこで、偏差を二つ出してそれぞれに対して制御したら良いのではと考えました。
つまり、経路とのズレと、マーカーとの距離二つを考えれば良いということです。
制御したい対象が二つになっても、出力を算出する量に二つ偏差に対する項を足し合わせれば良いはずです。
そんな感じで、偏差二つに対しての出力を考えています。
F(t)=u(t)として推進力を与え、質量1とした運動方程式に沿って速度と位置を計算して、位置を描画しています。

②今後どのように発展させるのか
・描画関係のプログラムの書き方を工夫する
マルチスレッドの方が描画がきれいになりそう。演算スレッドと描画スレッドを分けたい。
今後の勉強のためにもやってみたいです。
・外乱を考慮する
実は外乱によって受ける力の項も含めて計算してるのですが、調整が出来ていないので0のままになっています。
そこらへんの調整をします。
・出力の次元を考える
動きを見ていて、制御したい対象と出力の次元が異なると制御がすぐに効いてこないので良くないと思いました。
(位置を制御したいのに直接制御しているのは力(加速度))
制御に関しても勉強したいと思います。


そろそろ新歓展示も考えなければいけません。
ハードにソフト、理論と学びたいことは尽きません。
頑張ります。

アクア研 みやび。

シミュレータ作って迷路探索してみた


迷路探索のアルゴリズム

・はじめに

はじめまして、14のみやびです。
大学に入学してからいまのところ現在までは主にソフト面をやってきています。
(ソフトって気軽に触れるからついつい偏っちゃいますよね)
rogyではマイクロマウスの大会に向けて活動しています。
迷路シミュレータを作っています。
前期研究報告会では迷路の生成法について発表したので、ここでは迷路の探索方法についてお話ししたいと思います。

探索改良
こんな感じです。

大まかな流れ
探索アルゴリズムの流れを簡単に記述すると、
①探索結果を保存する入れ物を作っておく
(マス目の間の壁全てに対して用意し、初期状態は壁がないとしておく)
②ゴール座標からの歩数マップ(そのマスに行くための最短歩数が入ったマス)を作る
③歩数マップともろもろのデータからスコアを算出したうえで、最も低いスコアの方向に進む
(自分の向いている方向でない部分に進む選択になったら、進みたい方向に向きを変える)
④現在の座標と方向から視野内の壁を認識する
⑤②-④を繰り返してゴール座標に到達する
⑥(0,0)座標を目指して同じように探索する
以上の流れで一往復探索します。

・詳細
上記だけでは大まかすぎるので、以下に詳細を書きます。

①探索結果を保存する入れ物
私の場合は、横の壁の集合rと縦の壁の集合cを用意しています。
マス目の座標に対して、上下左右のマスがどの壁になるのかよく確認する必要があります。
初期状態は壁がない状態にしてあり、進みながら壁を追加します。

②歩数マップ作成
研究発表会でも話しましたが、歩数マップの作成方法についてお話しします。
・任意の座標に0を入れて確定マスとする。
・確定マスに隣接する、未確定かつ踏破可能なマスをピックアップする。
・ピックアップしたマスに、隣接する確定マスの最小値+1を代入する。
・数値の入ったマスを確定マスにする。
これを繰り返すことで、ある座標からの歩数が入ったマスが出来ます。
ゴール座標からこの歩数マップを作ることによって、数値が大きいほどゴールから遠いマスということになります。

③スコア算出
自分の周りの四方のマスに対して、
Score=(歩数マップの値)+(踏破済みマスかどうか)+(最近に踏破したマスかどうか)
というようなスコアを算出しています。
・歩数マップの値…②で言った通りのゴールからの歩数を加えます。
・踏破済みマスかどうか…踏破済みならk1,未踏破なら0を加えます。
・最近踏破したマスかどうか…現在から10個前までのマスをログとして保存し、
i個前のログに存在するマスだった場合、(10-i)*k2を加えます。
ただし、四方で踏破不可能なマス(壁に阻まれたマス)がある場合は、
その方向はスコアを10000などの高すぎるものにし選ばれないようにします。

このようにスコアを算出した後、このスコアが最も低い方向へ進みます。
移動した先のマスを踏破済みマスにし、ログに座標を収納しておきます。

④迷路の壁認識
このプレイヤはマウスの特性上、自分の両隣の壁と、一つ前のマスの両隣の壁を見れる設定にしてあります。
ただし、目の前が壁だった場合は一つ前のマスの両隣の壁は見えないようになっています。

⑤ゴール座標に到達してから、踏破済みマスでの最短経路を考える
ゴール座標についたタイミングで、とりあえず認識した範囲での最短経路を知りたいですね。
しかし、踏破済マスだけだとうねうね曲がっているので経路を考えるのが難しいです。
そこで、踏破済マスと未踏破マスの間にわざと壁があるとして歩数マップを作ることによって、踏破済マスの中でのゴールまでの経路を作っています。
壁で囲まれた範囲なら歩数マップを使って歩数を割り出すことが出来、かつ歩数が壁の外に出ないので未踏破マスを通ることがありません。
ゴール座標から、隣接する差が1のマスをたどることによって経路を出すことが出来ます。

⑥スタート地点に戻る
今度はスタート地点からの歩数マップを作り、同じようにスコアを算出して動きます。
踏破済みマスのスコアが高くなるように設定されてるので、帰るときは行ったことのないマスに向かうようになっています。


これらのような方法で探索しています。
現在ではスコアの部分をいじって、探索の効率を上げている段階です。
スコア方式を用いているので、新しい項を追加するのも簡単かなぁと思っている次第です。


・終わりに
なにか不明な点や知りたい点、迷路の生成方法やシミュレータの仕様など気になることがあれば、
ついったーでリプください。
miyabi3180
それでは、失礼しました。
ギャラリー
  • MakerFaireTokyo2017に出展します
  • MakerFaireTokyo2017に出展します
  • MakerFaireTokyo2017に出展します
  • MakerFaireTokyo2017に出展します
  • MakerFaireTokyo2017に出展します
  • MakerFaireTokyo2017に出展します
  • たのしいロボット帝国 製作物紹介
  • たのしいロボット帝国 製作物紹介
  • たのしいロボット帝国 製作物紹介
記事検索
最新コメント