スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

友人との何気ない会話から

C言語ではString型が使えないよね~、とラーメン店で友人たちと会話していたところ、C言語でそれっぽく実現できるのかなぁ? と疑問が生まれたので、試しにまずは構造体でそれっぽくプログラムを書いてみようじゃないか!

なお、include文は省略します。

typedef struct string{
char text[];
}string;

int main(void){
string a;
a.text = "abc";
printf("%s",a.text);
return 0;
}


まぁ、一般的な感覚でこんなコードを打ってコンパイルしてみる! a.textってやってる時点でStringじゃないだろ! ってツッコミがくると思いますが(;´∀`)

c:2: error: flexible array member in otherwise empty struct


お、なんかエラーが出てきたぞ。
エラーから予測すると、構造体の中に char[] は使えないようだ。
ならば、charをポインタでやってみよう! と思って、次のコードを書く

typedef struct string{
char *text;
}string;

int main(void){
string a;
a.text = "abc";
printf("%s",a.text);
return 0;
}


コンパイルをしてみると、・・・おぉ、コンパイルが通った(`ω´) で、作られたファイルを実行すると

abc


・・・何だ、あっという間じゃないか(;´∀`)

しかし、ここで阿呆なことに気づく。
「charにtypedef使えば、構造体いらないですよね~!(;・∀・)」
わざわざtypedefを使ってるくせに、何故か気づかないという・・・。もう、ホントに申し訳ありませんm(_ _)m

長くなるため、続きからお読みください。

続きを読む

スポンサーサイト

PID制御、ねぇ

ロボットを真っ直ぐ綺麗に走らせるためには、ON/OFF制御・PID制御が必要不可欠になりそうなのでメモをば。

ON/OFF制御(bang-bang制御)とは

「ON(出力あり)」か「OFF(出力なし)」を使い分けて「操作量(出力値)」の“あり”“なし”を決定し、「制御量(入力値)」を目的値に近づける制御

とのこと。実装はすぐに実現できる(条件分岐をいくつか用意するだけ)ほど容易になるけども、この制御方法だと閾値を基準としてるので、オーバーシュートとアンダーシュートを繰り返して無駄な走行距離が発生してしまう。これを別名「ハンチング」と言うそうな。ふむふむ。

で、この欠点を補ったものがPID制御というもの。

PID制御とは

P:比例制御(Proportional)
I:積分制御(Integral)
D:微分制御(Derivative)

以上の三つの頭文字を取っており、それぞれ

P:現在の状況から制御量を決定
I:過去の状況から制御量を決定
D:未来の状況から制御量を決定

してるとのこと。ふむふむ。
で、これで制御量を決定する公式が次の通り。

制御量=Kp×偏差+Ki×偏差の累積値+Kd×前回偏差との差

ここで重要なのは、扱う機体によって係数Kp,Ki,Kdの値を適切なものに変える必要があるということ。これら三つの値が適切なものでないと、値が目標値に収束するどころか、寧ろ発散してとんでもない結果にorz
今日の走行では、Kp=0.8 Ki=0.3 Kd=0.08 が一番いい値だったけども、これを切り替えて一番いい係数を発見する必要があるということですね・・・(・x・
こりゃぁ、今度のミーティングまでにまた動かして検証するしかないですのぅ。

あと忘れてならないのは、タスクは連続して実行されるわけでなく、離散的に実行されるということ。
これを連続量っぽく扱うためには、タスク間の時間を乗算したり除算する必要があるわけで。これも忘れてはならない事柄ですな(・x・


少し前のPWMもそうですが、制御関連の話が出てきてすごく面白くなってきましたw
なんというか、そんな手段で上手く制御できるんだなぁ・・・と感心してしまいますw
今度はセンサの話とかで、また制御関連が出てくるんでしょうかねぇ・・・(・x・

定式化は読めば読むほど、面白い

論文を読んでると、新たな問題を解決する上で、定式化の作業はかなり重要なポイントだなぁ・・・って感じてます
なんせ既存のツールとどれだけオーダーが変わるかとか、理論値として数値がしっかり求められていると説得力があるというか・・・シミュレーションの結果を判断する指標にもなりますしね。
まぁ、先生には「理論値だけじゃなく、実機でやれ」と言われていますが、そうなると専用の評価ボードがないものかと探すわけですよ!
そうして探してみましたが、100万円単位しかない。

今まで見てきた評価ボードは最高でも10万近くだったので、なんとか個人で購入できるかなぁと思ってましたけど、さすがに100万円は無理です・x・;
なんでこんなに高いんだ。
これは先生にたかるしかないですね(ぇ

ぱぱっとプログラムを書けるか?

ネットサーフィンをしていたら「プログラマの能力」という単語が目に入った。
仮にも、情報系大学でプログラミングをやっている身である。やはり気になって、ページを覗いてみた。
こちらがそのページ「http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm

このページでも紹介されているが、プログラマの実力を試すものとして有名なものには「FizzBuzz問題」がある。
ページにも記載されているとおり、この問題は次のようなもの。

「1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること」

優秀なプログラマはこれを2分で解けるそうだが、殆どの人は解くことができないだとか。
「ぇ!? そんなに難しいのか!?」と思って、早速プログラムを書いてみた。

for(i = 0; i <= 100; i++){
if(i % 3 == 0)
{
if(i % 5 == 0) printf("FizzBuzz\n");
else printf("Fizz\n");
}
else if(i % 5 == 0){ printf("Buzz\n");}
else {printf("%d\n",i);}
}



直感的に書いたら、動いた。というか、2分とは言わずとも数分では書けた。
どうやら、プログラマとしてのスタートラインには立てているみたいです。
ふぅ・・・安心。
もちろん、他に方法はあると思いますし、綺麗な書き方があるとも思いますが、それはさておき。

この問題がすぐに解けたため、調子に乗って他のサイト様の問題に挑戦してみた。
問題を頂いたサイト様「http://blogs.wankuma.com/mcat/archive/2008/07/17/149236.aspx

問題とは、次のようなもの。
「与えられた自然数(0を含む)が2のべき乗数か否か判定し、そのbooleanを返すインターフェイス isAPo2 を作成せよ」

早速、この問題も解いてみた。

続きを読む

劣化指標

画像劣化指標の代表格と言えば、PSNR(Peak signal-to-noise ratio)なんでしょうね。

まず、平均二重誤差MSEを求める

MSE
※図:Wikipedia The Free Encyclopedia「Peak signal-to-noise ratio」より

ここでm,nは画像の縦横サイズ
Iは元画像、Kは劣化画像を示してる、と。ふむふむ。
で、このMSEを使って次のPSNRを求めるわけだ

PSNR
※図:Wikipedia The Free Encyclopedia「Peak signal-to-noise ratio」より

MAXとは、元画像がとりうる最大画素数。
つまり8bit画像なら、255というわけですな。
ここでPSNRは単位が[dB]で、35dB?40dBになると良画質だとか。
ふむふむ・・・。

とこれまで納得していたのだが、この指標って人間に対応したものなのか? と思って調べたら、こんな記事発見。
Dark_Shikari WebPについて語る

ほほぅ、どうやら MPEG4 AVC/H.264(正確にはx264)にはPSY RD0と呼ばれる人間向きの指標があるそうな。
となると、この指標を求める式は? と思ったけど、上手く見つからなかった。
詳しい論文を見ればありそうだけど、使えそうな指標だから今度見ておこう。
あと、SSIMなるものも発見した。これも指標として使えそうだ。
プロフィール

朔夜だったり、シェルジュだったり

Author:朔夜だったり、シェルジュだったり
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。