Processing math: 100%

2017年8月17日木曜日

東山動植物園に居るけものフレンズに出てくる動物一覧

概要

先日,東山動植物園がナイトZOOというイベントで20:30まで開いているよということだったので行ってきました.
その際,東山動植物園にいるアニメ版けものフレンズに出てくる動物は大体確認できたと思うので場所や写真をメモします.
なお内容は2017年度8月のものであり,見落としや間違いなどもあるかもしれませんがご了承ください.
また,東山動植物園のホームページでは地図が公開されてますのでそちらを参照すると幸せになれると思います.

アニメ版けものフレンズに出てくる動物一覧

亜種に分類されている動物も注付きで一応書いておきます.

・1話
サーバルキャット,カバ,フェネック,アライグマ,ヒト*1
・2話
コツメカワウソ,ジャガー,インドゾウ*2,アクシスジカ,マレーバク,ミナミコアリクイ,エリマキトカゲ,クジャク*3
・3話
アルパカ,ショウジョウトキ
・4話
(みつからないですぅ)
・5話
アメリカビーバー,オグロプレーリードッグ
・6話
ライオン,ニホンツキノワグマ,オーロックス*4
・7話
(みつからないですぅ)
・8話
イワトビペンギン,フンボルトペンギン
・9話
カピバラ
・10話
タイリクオオカミ*5,アミメキリン,ヤギ
・11話
ヒグマ*6

*1 展示はされていないが,土日やイベントの際にはびっくりするぐらいいる.
*2 アニメに出てくるインドゾウはアジアゾウの亜種で,スリランカで生まれたアジアゾウは居るがインドゾウという名前で展示はされていない.
*3 展示ではインドクジャクという名前になっていた.
*4 展示されているウシはオーロックスの亜種というかオーロックスを家畜化したもの.原種のオーロックスは絶滅してる.
*5 展示されているのはシンリンオオカミというオオカミで,アニメに出てくるタイリクオオカミの亜種.ちなみにWikipediaによれば普通の犬もタイリクオオカミの亜種らしい.
*6 展示されているのはエゾヒグマで,アニメに出てくるヒグマの亜種.

1話に出てくる動物の写真と場所

東山動植物園のホームページで公開されている地図を元に場所を説明していきます.

サーバルキャット

初っ端から写真写りが悪いですがサーバルキャットです.場所は正門入って少し行った場所の「食肉小獣舎」という場所です.HPの地図でいう18番の場所です.
アニメでは夜行性と言ってましたが昼間でも起きてたりします.ただ夕方のほうがよく動いてくれる気がします.Wikipediaはここです.

カバ

カバです.場所は動物園北園,スカイタワーのエスカレーターを登らずに左に行くと会えます.HPの地図でいうWの場所です.
動かなかったり潜っていたりしてまともに見れないことが多いかもしれないです.2匹居て,獣舎の中にもう一匹が泳いでいました.また別種ですが,スカイタワーのエスカレーターの右側(地図U)にコビトカバというカバが居て,そちらのほうが近くで見れると思います.Wikipediaはここです.

フェネック

フェネックです.場所はサーバルキャットと同じ食肉獣舎(HPの地図でいう18番の場所)です.
夜行性らしく昼間は結構寝てます.朝方に行ったら1匹,夕方に行ったら2匹ちょこちょこ走っててかわいかったです.ちなみに暑い地域の動物は熱を逃がすために,耳や尾などの体の出っ張った部分が長くなるそうです(ベルクマンの法則 - Wikipedia).フェネックのWikipediaはここです.

アライグマ

アライグマです.場所はサーバルキャット,フェネックと同じ食肉獣舎(HPの地図でいう18番の場所)です.
割りと動いていて可愛いですが,特定外来生物で害獣とされているらしいです.憎悪からかWikipediaに結構詳しい内容が書かれてます.

ヒト

ヒトです.場所は東山動植物園内随所に見られます.
6月,7月に動物園に行った時は平日でしたが,平日の昼はベビーカーに乗っているような幼稚園前の赤ちゃんとその母親が多く確認できます.また夏休みでは小学生ぐらいの子供が多いですが,小学生ぐらいの子供の近くで動物を見ていると視点の高さが違うからか僕が気づかないような事に気づいたりします.Wikipediaはここです.

2話に出てくる動物の写真と場所

コツメカワウソ


コツメカワウソです.場所はアジアゾウ(地図中2番)のすぐ近くです.自然動物館(地図中S)にも飼育ゲージがありますが見たことないです(暗くて見つけられてないだけかも……?)
ちょこまか動いてとても可愛いです.朝方は寝ている姿が見られます.また夕方16:00ぐらいに行くと魚を食べる姿や,ザリガニと戦って食べる姿が見られます.それ以外の時間帯はずっとじゃれている印象です.Wikipediaはここです.

ジャガー


ジャガーさんです.場所はサーバルキャット,フェネックと同じ食肉獣舎(HPの地図でいう18番の場所)です.
昼間は寝ていますが,夕方になると動いて写真のように玉で遊んだりウロウロしたりします.ずんぐりむっくり可愛いです.少し飼育ゲージが狭い気がするんですが大丈夫なんですかね…….Wikipediaはここです.

アジアゾウ


アニメに出てきたのはインドゾウですが,インドゾウはアジアゾウの亜種なので紹介します.場所は正門はいって真っすぐ行けばまず会えないことはないです(地図中番号2).
朝早く行くと獣舎から出てくる時にりんごを飼育員さんからもらう姿が見れました.また獣舎からでると木や岩の上に置かれた葉っぱを長い鼻で取る姿や,となりのゾウと鼻を絡ませる姿を見ることができます.芸の真似事ができるらしいですが見たことないです.(東山動植物園のツイート情報).インドゾウのWikipediaはここ,アジアゾウのWikipediaはここです.

アクシスジカ

アクシスジカです.場所はアジアゾウの向かい側,地図中番号3です.
アニメでは土を食べてる変な子みたいな扱いでした(?)が動物園では何かの草を食べてます.朝方に行くと食べている姿が見られます.アクシスジカはこの動物園では長い草を食べるのですが,ほとんど丸呑み状態です.Wikipediaによれば反芻亜目とよばれるものに分類されており,食べ物を反芻をします.草がないのに口をモグモグしているときに喉のあたりをよく見ると食べ物を戻していることがわかります.口の動きは近い種のヤギやキリンと比較すると面白いと思います.Wikipediaはここ

マレーバク

マレーバクです.場所は正門はいって左,アジアゾウの手前です(地図中番号22).
メチャクチャゆっくり歩いて水を飲んで庭(?)をうろついて草を食べてまた寝る……という姿を延々と見せてくれます.僕の中での野生で生きていけなさそうな動物ランキング1位はこいつです.夜行性らしく昼間はねていることが多いですが,夕方は割と動いています(寝てることもありますが).
特にナイトズーでは鳴き声を数回聞くこともできました(キュイッ!という感じの甲高い声でした).また2枚目の写真の様に,夜ではラッキービーストがアニメで言ってた通り,岩なのか何なのかよくわからなくなってるのを見ることができました.Wikipediaはここ

ミナミコアリクイ

ミナミコアリクイです(写真なし).場所はスカイタワー前の自然動物館という場所に居ます.
夜行性らしく,自然動物館の中は暗くなっており写真は僕のカメラでは撮れませんでした(フラッシュ禁止).2匹ぐらい居たと思います.威嚇はされませんでしたが結構動いているのが見れます.もっとよく見たいという方はオオアリクイがスカイタワーから少し北に行ったあたりに居ますので見ると良いと思います.Wikipediaはここ

エリマキトカゲ

エリマキトカゲです.場所はスカイタワー前の自然動物館という場所に居ます.
自然動物館には爬虫類が展示されている場所があり,そこのトカゲエリアにいます.爬虫類エリアにいる動物全般に言えるのですが,あまり動かないです.Wikipediaはここ

インドクジャク

インドクジャクです.場所はコアラ舎のさらに奥,バードホールという場所にいます(地図中13).
バードホールではネット越しではなく,鳥たちがすぐ目の前を歩く姿が見られるので大変良いです.このクジャクは結構大きく,閉じたままですが大きな羽とともに歩く姿はなかなか可愛いです.Wikipediaはここ

3話に出てくる動物の写真と場所

アルパカ


アルパカです.正門から入ってかなり東に行った,こども動物園という場所にいます(地図中25).
写真にある通り,夏は会えないみたいです.僕は夏にしか行ったことがないのでまだ一度もアルパカには会えていないです.Wikipediaはここ

ショウジョウトキ

ショウジョウトキです.コアラ舎の南東側にバードホールといういろんな鳥を間近にみられる場所があって,そこに居ます(地図中13)
赤いです.鳥の本はあまり読んでないのでよく知らない上,近くに来てくれないのであまり観察できてないです.Wikipediaはここ

4話に出てくる動物の写真と場所

スナネコではなくスナドリネコというネコなら食肉小獣舎にいます.ツチノコはいたらこんなブログ書いてません().ツチノコは見つけると1億円もらえるらしいです.はやく1億円を手に入れてイケメンな男の子と一緒に女装してダンスしてカワイイの星を目指したいです

5話に出てくる動物の写真と場所

アメリカビーバー


アメリカビーバーです.アメリカゾーンというスカイタワーを登ってさらに北に行った場所に居ます(地図中M)
朝一番に行くとみんな巣の中に寝てて一匹も泳いでない,なんてことがありました.夜行性らしく,夕方は泳いでいる姿が見られます.尻尾の質感が凄くて,他の毛とはぜんぜん違うのが見て取れます.本当に尻尾が平べったくて誰かがつけたんじゃないかと思ってしまうほどです.泳いでいる姿もかわいくて水の中でぐるりと回ったりするのはカワイイです.人気なのか休日なんかはヒトが多くて全然見られないですし,平日にも良い感じのカメラを持ったおじさんが常時構えていたりします.Wikipediaはここ

オグロプレーリードッグ

オグロプレーリードッグです.アメリカビーバーのすぐ近く,アメリカバイソンのあたりいいます(地図中Iのあたり)
名前の通り尾の先が黒いです.朝早く行ったらベチャッて感じで寝てるオグロプレーリードッグ(下の写真)を見ることができました(これめっちゃ可愛かった).昼間はずっと草を食べている印象です.4匹居るのですが,ナイトズーの際に夜に行ったらみんな土の中に潜って見ることができませんでした.アニメ同様穴があちこちに開いており,一部の穴の中が見れるようになっています.運がいいと穴の中にいるオグロプレーリードッグが見られるかもしれませんが僕はまだ見たことがないです.けものフレンズで絡みのあったアメリカビーバーさんの近くにいるとか運命を感じます.Wikipediaはここ

6話に出てくる動物の写真と場所

ライオン



ライオンです.場所は正門入ってずんずん進むと看板があってライオンはこっちと書いてあります(地図中6)
3~4匹ぐらい居て,1日に3回ぐらいルーチンで外に出ている子が変わります.獣舎が展示場の隣にあり,そちらに行けば他の個体も見ることができます.時々凄く大きい声で吠えるのを聞くことができます.運がいいと玉にじゃれるネコ……もといライオンが見られます(下の写真).Wikipediaはここ

ニホンツキノワグマ

ニホンツキノワグマです.場所は食肉小獣舎の反対側のクマ舎(地図中10)です.
いい写真がありませんでした……><.お腹というか首のあたりに白い部分があります.余談ですがクマ舎にはマレーグマというクマが居て,わりとその子がカワイイと僕の中で人気です.ニホンツキノワグマのWikipediaはここです.

ウシ


ウシです.こども動物園にいます(地図中25).
けものフレンズに出てきたオーロックスは絶滅していますが,普段私達が食べているウシはオーロックスを家畜化したものです.したがってウシはオーロックスの亜種という分類になるそうです.(オーロックスの子孫がウシならオーロックスは絶滅していないのではという疑問が僕の中では残っていて,種とは何かを詳しい人に聞きたいです).オーロックスのWikipediaはここ,ウシのWikipediaはここです.

7話に出てくる動物の写真と場所

確認した限りではアフリカオオコノハズクもワシミミズクも居ないです.フクロウは小鳥とリスの森(地図中24)というところに居ます.
また,猛禽類が居る場所(地図中G)ではメンフクロウというフクロウがいるのですが……
……と,このように「猛禽類エリアの一番端」の,「他と比べてとても小さいゲージ」にいます(見つけづらいです).あまり顔を出してくれませんが,写真を撮れたことはあります下図参照.


8話に出てくる動物の写真と場所

イワトビペンギン

イワトビペンギンです.卵はバードホール(地図中13),生きている成体は池の前,アシカやホッキョクグマがいる場所の周辺にあるペンギンエリアにいます(地図中17)
飾り羽があるのでよく見分けやすいです.ちなみに僕はペパプのなかではイワビー推しです.腹ばいになってキョロキョロしている姿を見られます(とてもかわいい).Wikipediaはここ

フンボルトペンギン

フンボルトペンギンです.イワトビペンギンと同じ場所にいます.
くちばしの根本が赤みがかっているのが特徴です.めっちゃ多いのでペンギンエリアで一番多いペンギンがそれだと思えば良いと思います.Wikipediaはここ

9話に出てくる動物の写真と場所

カピバラ


カピバラです.スカイタワーから少し北に行ったあたりに居ます(地図中O)
黙々と草を食べている姿がカワイイです.げっ歯類最大というだけあって,犬ぐらいの大きさがあります.アニメとかだと温泉に入っていましたが,水に入る姿は見たことないです(Wikipediaによれば温暖な地域にいるので温泉に入るらしく,ここの冷たい水には入らなさそう).とにかくずっと草食ってる印象です.Wikipediaはここ

10話に出てくる動物の写真と場所

シンリンオオカミ

シンリンオオカミです.場所はスカイタワーと世界のメダカ館の間に3頭,アメリカゾーン(地図中J)に数頭います.
アニメ版けものフレンズではタイリクオオカミさんが出てきましたが,シンリンオオカミはその亜種となるそうです.アプリ版にはシンリンオオカミのフレンズもいるみたいです.
ヘッヘッヘッヘッ言いながら走ったりする姿はイヌそのものです.近所のイヌと同じ匂いがします().運がいいと飼育員さんによる餌やりの姿が見られますが,餌を前にした姿は飼育員さんの言うことを素直に聞いてて,イヌイヌしててほんと可愛いです.オオカミ全般のWikipediaはここです.

アミメキリン


アミメキリンです.場所はクマ舎の奥,ペンギンエリアの近くです(地図中11).
餌やりの時間では,髪の長いカッコイイオジサン(オニイサン?)による説明があります.また,上の写真のような構造物で餌やりをする姿が見られます.餌やりの時間以外にも,長い首をあちこち動かす姿が見られると思います.アクシスジカ同様反芻をするので,長い首を食べ物が登っていく姿が見られます.キリンのWikipediaはここ

ヤギ


ヤギです.こども動物園にいます(地図中25).
こども動物園という場所にいるので,触ったり餌をやったりできます.近くに寄ってくるので結構観察できるかと思います.みんな妊娠しているんじゃないかってくらいお腹が大きいですが,飼育員さんによれば食べ過ぎor糞詰りだそうです.Wikipediaはここ

11話に出てくる動物の写真と場所

エゾヒグマ


エゾヒグマ(ヒグマの亜種)です.場所は食肉小獣舎の反対側のクマ舎(地図中10)です.
でかいです.昼間は寝ていることが多い気がしますが,水の中に入ったりする姿も見られます.下の写真をみるとよくわかると思いますが,肉球やべぇ……って感じになります.しかもその先についた爪の大きいこと大きいこと……正直野生では絶対に会いたくないですね…….エゾヒグマのWikipediaはここ,ヒグマのWikipediaはここです.

余談

数えたら30種ぐらい紹介していました.というかアニメ版けものフレンズに出てきた動物だけでこれだけいて,東山動植物園にはさらにもっと多くの動物がいるんですよ…….なんでコラボしないんですかね.ただ東山動植物園の展示を見ていると,多少見づらくなってでもストレスのかからない生活環境を作っている感じがして,人間よりもむしろ動物のためにある動物園という感じがします.東山動植物園がコラボしないのはそのへんの考えがあるためかもしれません.コラボせずとも十分儲かってるからかもしれませんが.

イヌ派の僕的にはヤブイヌとか超絶可愛いのでおすすめです.イケメンゴリラことシャバーニの人間の動きそのまんまじゃん!みたいな動きも見ていて好きです.また行きたいです.

参考リンク




2017年8月5日土曜日

現代制御勉強メモと倒立振子の制御例

## 概要

現代制御の勉強メモです.実装するまでの過程をトレースしたかったので,それに必要な知識の確認程度に書いたものです.
内容は状態フィードバック則と同一次元状態オブザーバのまとめと,それを使って適当な制御対象を制御してみてみます.
なお授業で扱った内容を思い出すためのものである上,幾つか扱ってない部分があったり間違ってたり省略してたりするので,ちゃんとした説明は教科書見直してください.学部生なんだ許されてくれ.

## 勉強メモ


### メインコンセプト

次のような状態方程式と呼ばれる形で表された微分方程式がある.ただしxはベクトルで内部状態を表し,uは入力,yは出力である.またA,B,C,Dは定数行列である.

\begin{eqnarray} \dot{x}&=&Ax+Bu\\ y&=&Cx+Du \end{eqnarray}

メインコンセプトは,この微分方程式の内部状態xを,0ベクトルにどうやって近づけるかということである.xが0ベクトルに収束するためには行列「Aの固有値の実部がすべて負」でなければいけない.「Aの固有値の実部がすべて負」の時,xは指数関数的に減衰していくことが知られているため,xは0ベクトルに収束する.

さて,実際にモデルを立てた時に「Aの固有値の実部がすべて負」という条件が満たされていなかったとする.その場合,xは0に収束するどころか発散してしまう場合がある.しかし,このとき入力uをうまく与えてやることで擬似的に「Aの固有値の実部をすべて負」にできる.その最も単純な方式として状態フィードバックを用いた極配置という方法を取る.

この方法では,入力uを次のような形で与える.ただしKは適当な定数行列である.

u=Kx+v

これを上式に代入すると次のようになる.

\begin{eqnarray} \dot{x}&=&(A+BK)x+Bv\\ y&=&Cx+Du \end{eqnarray}

したがって定数行列Aが,擬似的にA+BKとなった.したがってKをうまいこと決めてやれば,定数行列Aの固有値を変えられる.固有値の実部が全て負になるようなKにすれば,xは0ベクトルに収束し目的が達成できる.

さて,現代制御論のメインコンセプトは上に述べたとおりである.しかし上では語弊を承知で具体的な計算などはすべて除いた.そのため実際には安定化させられない条件というのがいくつかある.また,入力uu=Kx+vとすればよいといったが,xがわからなければuを決定できない.そのためxを推定する必要がある.

以下では制御ができるかできないかを表す指標「可制御性」,状態xが推定できるかできないかを表す指標「可観測性」について述べる.

### 状態フィードバック則(文献[1]P35)

先程定数行列Kをうまく決めてやれば,定数行列Aの固有値を擬似的に変えられることをのべた.実際にはKはその要素を適当な変数で置いてやって固有値方程式
\det(\lambda I-(A+BK))=0
が,実部が負となる適当な固有値 \lambda_1,...,\lambda_nを自分で決めてやって,次式のようにその解がその固有値になるようにしてやれば良い.

\det(\lambda I-(A+BK))=\prod_{i=1}^n(\lambda - \lambda_i)

ただし\lambda_1,...,\lambda_nは係数が実数の多項式の解となるような状態(複素平面上においた時に実軸対称)でなければならない.

### 可制御性(文献[1]P35)


さて上記の式を実際に立ててみると連立方程式はKの要素に関する線形連立方程式になることが保証されているらしい.しかし妥当な解が得られないような場合がある.すなわち,思い通りに制御することができない場合がある.思い通りに制御できないことを不可制御性を持つと良い,逆に思い通りに制御できることを可制御であるという.

可制御であるということの必要十分条件は次の条件が満たされている場合である事が示されている(文献[1]P38).
rank M_c=rank [B \,\, AB\,\,\dots\,\,A^{n-1}B]=n

この行列M_cは可制御性行列とよばれるもので,微分方程式の解析解を求めると出てくる

\begin{eqnarray} x(t)&=&e^{At}x(0)+\int_0^t e^{A(t-\tau)}Bu(\tau)d\tau\\ &=&e^{At}x(0)+\int_0^t (\beta_0 (t-\tau)I+\beta_1(t-\tau)A+\dots+\beta_{n-1}(t-\tau)A^{n-1})Bu(\tau)d\tau \\ &=&e^{At}x(0)+[B \,\, AB\,\,\dots\,\,A^{n-1}B][\int\beta_0udt \dots\int\beta_{n-1}udt ]^T\\ &=&e^{At}x(0)+M_c [\int\beta_0udt \dots\int\beta_{n-1}udt ]^T \end{eqnarray}

不可制御の場合はどうやっても不安定であったりするので,そういう場合は制御対象を何かしら変える必要がある.

### 同一次元状態オブザーバ(文献[1]P121)

状態フィードバック則では,入力uを決定するのにu=Kx+vとしているから,内部状態xがわかっている必要がある.

普通は内部状態xを知ることはできず,ここでは出力yと入力u,および定数行列A,B,Cのみから推定するしか無い.内部状態を推定する方法はいくつかあるらしいが同一次元状態オブザーバというものを紹介する.

まずxと同じ次元を持ち,次のような微分方程式で表される関数z(t)について考える.

\dot{z}=Az+Bu+G(y-Cz)

このzx(t)=z(t)となってくれれば内部状態xがわかったことになる.ここでxzの差e(t)=x(t)-z(t)について考えると,\dot{e}=\dot{x}-\dot{z}であるから,

\begin{eqnarray} \dot{e(t)}&=&A(x-z)-G(Cx-Cz)\\ &=&A(x-z)-GC(x-z)\\ &=&(A-GC)e(t) \end{eqnarray}

となるから,行列A-GCの固有値の実部が全て負であればeは0に収束する,すなわちx=zとなる.したがってA-GCの固有値の実部が全て負となるようにGを状態フィードバック則と同じように決めてやればよい.

### 可観測性(文献[1]P41)

ただ同一次元状態オブザーバを作れない場合がある.すなわち,内部状態をどれだけ頑張っても出力yから知ることができない場合がある.そのようなシステムを不可観測であるといい,逆に内部状態を推定できるシステムを可観測であるという.

システムが可観測であるという必要十分条件は次の可観測性行列M_o
rank M_o = rank\begin{bmatrix}C\\CA\\\vdots\\CA^{n-1}\end{bmatrix}=n

であることである.この可観測性行列は入力が0である場合のyの解析解

\begin{eqnarray} y&=&C e^{At}x(0)\\ &=&C(\beta_0 (t)I+\beta_1(t)A+\dots+\beta_{n-1}(t)A^{n-1})x(0)\\ &=&[\beta_0\dots \beta_{n-1}]M_o x(0) \end{eqnarray}

に出てくる行列である(文献[1]P43).


## 具体例

### 運動方程式の導出

ここでは台車にくっついた倒立振子について考えます.ただし運動方程式の導出は面倒なので参考文献[2]のモデルを用います(というかこの運動方程式の導出がちゃんとできないとだめというか,現代制御ではモデル化ができてしまえば後は勝手に制御則が出てくるので,でもう少し運動方程式の導出を再勉強するべきな気がする).

参考文献[2]より,台車の位置及び振り子の回転角度の運動方程式は次式のようになる.

\begin{bmatrix} M+m&ml\cos(\theta)\\ ml\cos(\theta)&J+ml^2 \end{bmatrix} \begin{bmatrix} \ddot{x}\\\ddot{\theta} \end{bmatrix} + \begin{bmatrix} -ml\dot{\theta}^2\sin\theta\\ -mlg\sin\theta\end{bmatrix} + \begin{bmatrix} B\dot{x}\\C\dot{\theta} \end{bmatrix} =\begin{bmatrix} u\\0 \end{bmatrix}

ここで
T=\begin{bmatrix} M+m&ml\cos(\theta)\\ ml\cos(\theta)&J+ml^2 \end{bmatrix}
とおけば


\begin{eqnarray} \begin{bmatrix} \ddot{x}\\\ddot{\theta} \end{bmatrix} &=&T^{-1}\left(\begin{bmatrix} ml\dot{\theta}^2\sin\theta\\ mlg\sin\theta\end{bmatrix} +\begin{bmatrix} -B&0\\0&-C \end{bmatrix}\begin{bmatrix} \dot{x}\\\dot{\theta} \end{bmatrix} +\begin{bmatrix} u\\0 \end{bmatrix}\right) \end{eqnarray}


となる.数値解析する分にはこの程度の形で書けていればルンゲクッタでシミュレーションできる.

### 線形化

次に,現代制御を適用するために\dot{\theta},\thetaが微小であるという近似をすると
T=\begin{bmatrix} M+m&ml\\ ml&J+ml^2 \end{bmatrix}
であり,微分方程式は次のようになる.

\begin{eqnarray} \begin{bmatrix} \ddot{x}\\\ddot{\theta} \end{bmatrix} &=&T^{-1}\left(\begin{bmatrix} 0&0\\ 0&mlg\end{bmatrix}\begin{bmatrix} {x}\\{\theta} \end{bmatrix} +\begin{bmatrix} -B&0\\0&-C \end{bmatrix}\begin{bmatrix} \dot{x}\\\dot{\theta} \end{bmatrix} +\begin{bmatrix} 1\\0 \end{bmatrix}u\right)\\ &=&\frac{1}{\det T}\left( \left[\begin{matrix}0 & - g l^{2} m^{2}\\0 & g l m \left(M + m\right)\end{matrix}\right]\begin{bmatrix} {x}\\{\theta} \end{bmatrix}\\+\left[\begin{matrix}- B \left(J + l^{2} m\right) & C l m\\B l m & - C \left(M + m\right)\end{matrix}\right]\begin{bmatrix} \dot{x}\\\dot{\theta} \end{bmatrix} +\left[\begin{matrix}J + l^{2} m\\- l m\end{matrix}\right]u \right) \end{eqnarray}
ここで状態量を(変数名かぶってますが)x=\begin{bmatrix}x&\dot{x}&\theta&\dot{\theta}\end{bmatrix}^Tとすると
\frac{d}{dt}x=\frac{1}{\det T} \begin{bmatrix} 0&\det T&0&0\\ 0&-B(J+ml^2)&-m^2l^2g&Cml\\ 0&0&0&\det T\\ 0&Blm&mgl(M+m)&-C(M+m) \end{bmatrix}x+ \frac{1}{\det T} \begin{bmatrix} 0\\J+ml^2\\0\\-ml \end{bmatrix}u
となるから,
\begin{eqnarray} A&=&\frac{1}{\det T} \begin{bmatrix} 0&\det T&0&0\\ 0&-B(J+ml^2)&-m^2l^2g&Cml\\ 0&0&0&\det T\\ 0&Blm&mgl(M+m)&-C(M+m) \end{bmatrix}\\ B&=& \frac{1}{\det T} \begin{bmatrix} 0\\J+ml^2\\0\\-ml \end{bmatrix}\\ C&=& \begin{bmatrix} 1&0&0&0\\ 0&0&1&0\\ \end{bmatrix}\\ \end{eqnarray}
とおけば線形化した場合の状態方程式が書ける.

### オブザーバ,フィードバックゲインの決定

オブザーバ,フィードバックゲインは手計算で求めるとめんどくさそうなのでライブラリを使います.python-controlやmatlabにはplace関数というものがあって,それを用いるとフィードバックゲインなどを求めることができます.

なお,place関数はA+BKKを決めてくれる関数です.したがって状態オブザーバのゲインGを決める方法については,A-GCの転置をとったA^T-C^TG^TG^Tを求めることをすれば良いです.

コードはこんな感じです.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

### シミュレーション

シミュレーションはProcessingで行いました.自分用の行列ライブラリ,ODEライブラリを作っておきたかったので読みにくいかもしれないです.

コードはここに上げてあります.
上が制御対象(RK4でシミュレーションした非線形微分方程式),下がオブザーバの出力を可視化したものです.初期値は0にしてあり,キーボードの矢印キーで外乱(入力)を与えてやれば動きます.
制御していない場合は発散し,制御している場合にはちゃんと倒立していることがわかります.オブザーバの出力もだいたい上のと同じ感じになってます.

## 感想

大変だったけどいい経験になりました.あと先輩に聞くと結構授業では端折っているところがあったりするらしいので,もっと勉強しないとなと思いました.

## 参考文献

[1] 吉川恒夫,井村順一,現代制御論,(2014),コロナ社
[2] http://www.robot.mach.mie-u.ac.jp/~nkato/class/sc/Invpend_eq3.pdf
[3] Python で任意極配置のフィードバックゲインを求める | org-技術, http://org-technology.com/posts/pole-placement.html
[4] python-controlを利用する際に直面したエラー - szmlb.net, http://szmlb.hatenablog.com/entry/2015/09/08/203643

2017年6月14日水曜日

Brainfuck CPUをマイクロプログラム方式で実装したお話

1.概要

論理回路シミュレータのlogisimを使って,Brainfuckのコードをそのまま(?)実行可能なCPUをマイクロプログラム方式で作ってみました.

この記事ではその成果,作り方,仕様を簡単に説明しますが,僕はCPUの勉強を始めたところなので,細かい内容については保証できません.

作ったlogisimのファイルとか,命令セットとかを書いた秘伝のエクセルシートとかはここに投げておきます.

2.とりあえず成果

興味本位で見に来たという方がほとんどだと思うので,説明はともかくとりあえず動作している様子はこんな感じです.
左上にあるのがROMで,Brainfuckの命令を書き込みます.その下にあるやつがマイクロプログラムが書き込まれたROMです.

デコーダ上ではBrainfuckの命令とマイクロコードを読み取っていい感じにBrainfuckのプログラムを実行しています.

今回はlogisimに搭載されているキーボードやディスプレイを使えるようにしているので,入出力がちゃんとできるようになっています.上のGIFではどっかから引っ張ってきたHello Worldのコードを実行していますが右下のディスプレイにちゃんと「Hello World!」が表示されています.

3.実装方法(マイクロコード編)

このCPUのキモはBrainfuckのコードが~という下りよりも,CPUの命令の制御にマイクロプログラムを用いているという点です.この制御方式はマイクロプログラム方式とよばれていて,1つの命令をより単純な命令群に置き換えるというものです.

マイクロプログラム方式の詳しい話はWikipediaをみるか,CPU関係で有名な本である『コンピュータの構成と設計 第二版 上』を読むといいと思います(最新版では省略されているかもしれないです).

先に少し触れましたが,マイクロプログラム方式ではCPUの命令をより単純な命令群で置き換えるというものです.

まもな高級言語がなくアセンブラ言語でガリガリ書いていた時代では,より高度な命令をCPUに組み込ませるという考え方(CISC)が流行っていたようで,その考えのもとで作られたCPUではマイクロプログラム方式がよく用いられてきたようです.

今ではあまり使われていない方式のようですが,この方式を用いれば複雑な命令を実行できるので,Brainfuckを実行するCPUを作るのはお茶の子さいさいというわけです.

このCPUではBrainfuckの命令(+-,.><[])それぞれを次のようなマイクロプログラムで動かしています.エクセルシートもあげてありますので気になる方はそっちを見てください.
一番面倒なループ命令("""["""と"""]""")は,Cレジスタで括弧の数を数えることで対応する括弧のところまでジャンプしています.それ以外はわりと単純な命令なのでほとんどそのままとなっています.

このマイクロプログラムからデコーダが適切な信号を出力します.

4.デコーダ

デコーダは割りと雑な感じになっていますがこんな感じです.雑に説明を入れておきました(あとで僕が見る用なので)

まだ数回しかCPUを作ってないですがデコーダだけはなんともなんないですね……ただ今回はCPUの勉強をある程度進めたお陰で割りとすんなり作れました.ちなみにこのCPUを作るのに6時間かかっているか,いないかぐらいです.

先程見せたマイクロプログラムの命令(マイクロ命令)から,適切な信号を出力するような回路となっているはずです.
マイクロ命令から出力される信号はこんな感じです.
XXXXという命令は,Brainfuckの命令から対応するマイクロプログラムの番地へジャンプする命令です.それ以外のマイクロ命令は大体普通のCPUとおんなじ感じになってます.

5.コンパイラ

コンパイラと言っても対応する数字を出力するだけのプログラムです.余分なincludeとかありますが無視してください.出力されたファイルはlogisimでROMデータに書き込むことができます.

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#ifndef _USEFUL_MACROS_
#define _USEFUL_MACROS_
#define INF 99999999
#define FOR(i,a,b) for (int i=(a);i<(b);i++)
#define RFOR(i,a,b) for (int i=(b)-1;i>=(a);i--)
#define REP(i,n) for (int i=0;i<(n);i++)
#define RREP(i,n) for (int i=(n)-1;i>=0;i--)
#endif
using namespace std;
int main(int argv,char *argc[]){
FILE *src;
FILE *output;
char c;
if( argv <= 2 ){
cout << "Error: no input file." << endl;
cout << "usage: ./bfc code.txt out.txt" << endl;
return 0;
}
src = fopen(argc[1],"r");
if( src == NULL ){
cout << "File \"" << argc[1] << "\" not foud." << endl;
return 0;
}
output = fopen(argc[2],"w");
if( output == NULL ){
cout << "File \"" << argc[2] << "\" not foud." << endl;
return 0;
}
fprintf(output,"v2.0 raw\n");
while( (c=fgetc(src)) != EOF ){
int n = -1;
char codes[9] = "><+-.,[]";
REP(i,8)
if( codes[i] == c )
n = i;
if( n != -1 ){
fprintf(output,"%d ",n);
}
}
fclose(src);
fclose(output);
return 0;
}
logisimではROMにデータを書き込むときにはkのよくわからないファイルフォーマットのファイルからデータを読み取れるようになっているのでそれを使うとハンドアセンブルしなくて済みます.

6.感想とか

この間『コンピュータの構成と設計 第二版 上』を読了しまして,その時にないがしろになっていた桁上げ先見加算器とマイクロプログラム方式について一応手を動かして作ってみた感じです.

もともと大学のレポートで自由課題として提出する用に作っていたのですが,Brainfuckの方は間に合わなかったのでブログに書いて供養させた感じです.

なるべく早く下巻を読み終えてパイプライン処理のmipsを実装したらFPGAに手を出していきたい所存です……

2017年5月5日金曜日

論理回路シミュレータで8bitCPUを作ったお話

※この記事はエッセイ的な感想です

1.概要

  一昨日「logisimでTD4を再現したお話(ポエム)」を書いたときに作ったCPUは完全に『CPUの創り方』に載っていた回路をlogisimに落とし込むだけだったため,設計らしい設計はしませんでした.

  なのでGWのパワーを借りて8bit CPUを作ってみました.こちらが動作しているときの動画です.なまえは適当にTM8にしました.
  これは9!を計算するプログラムを動かしています.結果がこんな感じに出ます.
  多倍長整数みたいに10進数で計算して繰り上がりをやって~みたいな処理になっています.なので1byteにつき一桁分の情報が入ってるので上みたいな感じに9!が362880と出力されます.

  今回はRAMやROM,乗算器や除算器,マルチビットの伝送路などlogisimのパワーで殴ってみました.なので若干のブラックボックスが存在したりしてます.そのへんはおいおい勉強していく所存ですかね……

  この下にはデコーダとかを作った際の過程を適当に書いていくつもりです.回路とかアセンブラ,プログラムなどはGitHubに投げてます→ここ

2.レジスタ

  レジスタはこんな感じになってます.
  logisimに画像エクスポート機能をなんてものがあるんですね.大変便利.レジスタは8つあるのですがFは比較結果を代入する用,Gは出力用,Hはプログラムカウンタになっています.また命令デコーダを作るのがめんどくさすぎたので,EレジスタはRAMを読み書きするようのポインタになっています.

  select_a,select_bはALUに送るデータをどれにするかを決めています.inputは命令に手入力だったりイミディエイトデータだったりします.dataは演算結果です.

  レジスタの回路はlogisimで用意されていたやつです.

3.ALU

  ALUはこういう感じになっています.operationでどの演算結果を出力するかを決めています.
  乗算器や除算器はlogisimにあったやつを使ってしまったのでまた今度作りたいです.

4.デコーダー

  命令デコーダーはきつかったです(大嘘).いや,嘘ではないんですがメニューバーのProject>Analyze Circuitで真理値表を入れれば回路を勝手に作ってくれたので楽でした.その存在に気づくまでは頭を抱えましたが…….

  回路はこんな感じです.
  下の方はわりと頑張っていました.上の方は……設計をコンピューターに任せた部分とそうでない部分があったりします.かなり見づらいですが魔法の言葉「どーんいずべたーざんぱーふぇくつ!!」を積極的に叫んでいきます.

  参考までにSelect_b専用のデコーダーを貼っておきます.
  多分カルノー図書いてNOTとANDで適当に組んでORで総和を取るというアルゴリズムだと思うのですがここまできれいにできるとは……という感じです.真理値表を入れればものの数秒で作ってくれるので凄いなーという感じでした.

  余談ですがこういった数学モデルがきちんと確立している分野って人間の入り込む要素があまりないですね.そういう点で情報工学の分野は優れているし発展が早いんだろうなと思いました.早くなにかを設計するプログラムを書いて100億円ほしい!!!!!!

5.アセンブラと命令

  命令はエクセルで適当に作っていきました――がだいぶスカスカです.というのも手でデコーダーを作るつもりでいたので命令を結構少なくしました.早い段階で自動設計の存在に気づいていれば……という感じです.

  ついでにアセンブラもエクセルで作りました.ラベルをつけたりコメントアウトができたりと便利です.割りと力作.
  実はアセンブリ言語は今までさっぱりだったのですが,ここで始めてまともに使いました.始めてまともに使ったアセンブリ言語はお手製です(?).今日9!を計算するプログラムを書いた感想としては,人間の書く言語じゃないなってことぐらいですかね.早くコンパイラを作ってみたいです.

6.感想

  まさか先週『CPUの創り方』を買ったときには,1週間ここまでできるとは思いませんでした.確実に挫折するか,手を動かさずに終わるんじゃないか……と思っていました.おそらくここまでできたのは①この本がすごい,②出会えたフリーソフト(logisim)がすごい,③たぶん今まで学んできたことがいい感じに組み合わさった,の3つの要因があると思います.本の著者とフリーソフトの作者に感謝です.