ホーム » 2011 » 11月 (ページ 3)

月別アーカイブ: 11月 2011

2011年11月
 12345
6789101112
13141516171819
20212223242526
27282930  

検索・リンク

Kinectで動くロボット、…(11/16)

この記事は、twitter の @TohruSaitohに掲載した #fnct タグ付き記事を、まとめたものです。


2011年11月13日(第242回)

誠市、ご縁市開催中でした!
ゲスト:福井高専OB 福野さま、石川高専専攻科 喜多さん

  • OB講演会の開催について

photo111113.jpg
ゲストお二人にスタジオに来ていただきました。

ムラタセイサク君の開発と知的財産

今日は、知的財産教育の講演会が開催されました。

「自転車型ロボット"ムラタセイサク君"の開発と知的財産」
    "知的財産はどのようにして生み出されたのか"
村田製作所 広報部企業広報課 係長
自転車型ロボット「ムラタセイサク君(R)」開発者 
吉川 浩一 氏
1111111724_960x720.JPG

Microsoft包括協定のソフトインストールにイライラ

高専では、Microsoftの包括協定にて、OSやOfficeのインストールにて、 適正なライセンス手続きを経れば、無償でOS,Officeをインストールできるようになった。

んで、今回Office2010を卒研用のPCに入れようとしたけど、かなり苦戦。

学内のサーバより、教員のメールID、パスワードを入力すれば、インストール用の データをダウンロードできる。これを使ってインストールを開始すると、 改めてメールID,パスワード,パソコンの管理台帳の番号を入力すれば、 利用ができる。

でもOfficeをインストールをすると、どうしても失敗する。 OSが、「Windows 7/Vista/XPじゃない」って文句を言ってくるけど、 購入時にWindows 7 Home Edition 64bit が入ってるじゃん。 よくよくインストールの手順書を見ると、7/Professional/Enterpriseじゃないとダメ らしい。 じゃあということで、Windows 7 の Anytime Update で、アップグレード をしようとするが、なぜか失敗。 OSの方も、包括協定でのアップグレードが必要みたい。 しかし、ライセンスを設定するプログラムは、サーバからダウンロードできるけど、 アップグレードには今度は学校指定のメディアが必要とな。
# 面倒だなぁ…イライラ。

2分木と式の表現・B木

2分木の応用として、式の表現の説明を行う。

まず、式の表現にあたって、演算子の優先順位の話として、 "1+2+3"が、"((1+2)+3)"として扱われる左結合で、 "x=y=z=0"は、"x=(y=(z=0))"で扱われる右結合といった話を説明する。 これらの優先順位情報は、分かり難いのでプログラムと処理しやすいように扱う必要がある。 "2+3*4"といった式は、前置記法では"+,2,*,3,4"と表現される。 一方、後置記法(逆ポーランド記法)では、"2,3,4,*,+"となる。 特に逆ポーランド記法は、計算の機械語生成に結びつくので、よく利用される。

でも、2項演算子は2分木として表現できるため、以下のようなプログラムで 式を扱うこともできる。

struct Exp {
int type ;
int data ;
struct Exp* left ;
struct Exp* right ;
} ;
struct Exp* Integer( int x ) {
struct Exp* n ;
n = (struct Exp*)malloc( sizeof( struct Exp ) ) ;
if ( n != NULL ) {
n->type = 0 ;
n->data = x ;
n->left = n->right = NULL ;
}
return n ;
}
struct Exp* Operator( int op , struct Exp*l , struct Exp*r ) {
struct Exp* n ;
n = (struct Exp*)malloc( sizeof( struct Exp ) ) ;
if ( n != NULL ) {
n->type = 1 ;
n->data = op ;
n->left = l ;
n->right = r ;
}
return n ;
}
int eval( struct Exp* x ) {
if ( x->type == 0 ) {
return x->data ;
} else {
int l = eval( x->left ) ;
int r = eval( x->right ) ;
switch( x->data ) {
case '+' : return l + r ;
case '*' : return l * r ;
}
}
}
void main() {
struct Exp* x =
Operator( '+' , Integer( 2 ) ,
Operator( '*' , Integer( 3 ) ,
Integer( 4 ) ) ) ;
printf( "%d" , eval( x ) ) ;
}

次に、演算子といっても単項演算子、2項演算子、3項演算子などがあり、 これらのデータを表現することを考えると、2分木は3分木といった拡張の イメージもでてくるであろう。これをもっと一般的にすれば、n分木も 考えられる。これをデータベース用にしたものはB木となる。 この方式は、n件のデータと(n+1)件のポインタで実装される。 詳しくは、B木にて。

この話のおまけとして、データベースシステムについて簡単に話す。 特に、データベースが使われるような巨大なシステムになると、 3段スキーマ構成といった事例や、SQLによるアクセスといった、 一般的な話の導入について紹介する。

データベース演習

# 前回の授業から間が長かったのもあり、内容忘れ気味。
前回の授業で説明が抜けていた、集約関数(count,sum,avg,max,min)、 集合演算子(union,except,intersection)、ソート(order by)、グループ化(group by … having…)をひと通り説明する。

第1週に渡した演習の環境の説明資料を元に、 https://www.ei.fukui-nct.ac.jp/~t-saitoh/edu/DB/exp/の使い方を説明する。

演習テーマは、何らかの意味のある2つのSQL命令を実行し、 その動作結果を確認、さらにその命令と同じような処理をするC言語のプログラムを 作成し、データベース命令の意味やその便利さを確認する。 レポートには、動作結果とその内容の説明や分かったことを記載すること。

職場の事務用ファイル共…(11/09)

  • 11/09 職場の事務用ファイル共有サーバ、ディレクトリの内容を見るだけでも激遅。見たいファイル見つける度に30秒近く待たされる。どうもディレクトリアクセスが遅いようなので、探したいフォルダごっそりコピー。 #fnct

この記事は、twitter の @TohruSaitohに掲載した #fnct タグ付き記事を、まとめたものです。


LEGOエネルギーセットで太陽光追尾

機械工業会さんとの連携事業の講習会用に、 LEGOのエネルギーセットで作った、ソーラートラッカーのプログラムを書いてみた。

3番ポートにつないだEnergy Meter から、電圧Vinを読み込む。 太陽電池に明るいライトをあてると、2[V]〜5[V]ぐらいの電圧が観測できる。 しかしデータは0.5秒ぐらい毎に、±1[V]ぐらいは簡単に変動するため、 この電圧だけで太陽光追尾をさせると、方向が安定しないことが予想される。 このため、平滑化が重要となる。 LEGO MindStormsのデータハブを使って、平滑化の処理を記述したのが、下図。 単純移動平均では、過去の測定値を保存する必要があるので、 指数移動平均を用いる。

移動平均によりある程度安定した電圧を元に、 太陽光の方向に動かすために、現在方向、+10度、-10度の3方向で電圧を測定し、 最も電圧の高い方向に向くようにしたプログラムを以下に示す。


このプログラムでは、横方向の追尾だけなので、同様の処理を縦方向にも 記述すればいい。 ただ、LEGOエネルギーセットの太陽電池の発生電圧は、予想外に不安定であり、 追尾には難しい。

ある程度ずれた方向から、ライトの方向を追尾させる実験をしてみたが、 時間と共に あさっての方向に動いてしまう場合があった。 原因は、ライト方向からずれて発電量が足りない状態で、 蓄電池への充電が不十分だと、エネルギーメーターが一時的にリセットされる場合がある。 さらにリセット復帰後の一瞬は測定電圧が高めに観測されるようである。 このため、発電量が少ない状態で、さらに発電量が減る方向を向いた時に、 リセット&復帰で一時的に高い電圧で測定されると、その発電量の少ない方向に 向いてしまう。

太陽電池の電圧は、負荷の影響で変動もするため、太陽電池の電圧情報を元に 太陽光追尾を行うのは困難と思われる。 よってLEGOのこの実験環境でも、LEGOの光センサーの光量に応じて方向を変えるように すべきであろう。

専攻科・生産システム実験で…

専攻科の後期実験で、昨日から4週実験の担当。 例年、組み込み系の制御実験として、 H8/Arduinoで歯みがきロボコンネタをやっていた。 でも、最近は Arduino を使うと、ライントレースなんか簡単すぎなので、 通信やら加速度センサーを使ってもらうネタとした。

車体は、オムニホイールの既存車体を使ってもらい、 1台のArduinoで制御。 一方、リモコン側ということで加速度センサーをハンドルにみたてて 操作してもらう。 車体側Arduinoと、リモコン側Arduinoは、 有線のシリアルケーブルで接続する。 加速度センサーに応じた速度情報を一方的に車体側に送るだけだと、 通信プログラムが単純すぎるので、 車体側のセンサー(ライントレース用のセンサーとか、自分でつける距離センサーとか…) の情報をリモコン側に送り返し、 車体を見なくてもある程度、操作できるようにすること。

ということで、昨日の1日目は、Arduinoと基本的な入出力の説明。 第1週2日目の今日は、 加速度センサーと信号の平滑化の説明と、 シリアル信号の説明などを行う。 今回の実験ではあまり関係ないかもしれないけど、 パリティチェック・CRCチェック・チェックサムなどの説明も行う。 また簡単な通信プロトコルを決める必要もあることから、 途中のデータが欠落した場合のデッドロック状態や、 スタートヘッダの必要性も説明する。

OSと割り込み

先週のジョブ・プロセス・スレッドの説明に引き続き、 プロセスの実行方式の説明から、割り込みなどを中心とした説明を行う。

プロセスの実行方式には、ジョブ方式やTSS方式、リアルタイム方式があることを 説明し、マルチタスクでのメモリ量による処理速度の違いを説明する。 例えとして、主記憶4GBのマシンで、メモリ使用量1GBのプロセスA,B,Cを実行する。 この場合、プロセスが入力待ちなどがあると動かせないので、ジョブ方式では あらかじめ入力データは随時よみこめるようにする必要がある。 ジョブ方式では、1つが終わったら次の処理を起動するので、問題がない。 しかしTSS方式では、みかけ上並行処理をしているようにプロセスの切り替えを するので、若干遅くなる。 しかし、主記憶が2GBという状態では、TSS方式では3つめのCの処理では、 メモリが不足し仮想メモリ機能が必要となる。これに伴い一時停止中の プロセスを補助記憶に保存したり復活させたりという処理が加わるため、 とたんに処理速度が低下する。

こういったOSの処理では、割り込み機能が重要となる。 割り込みとは処理速度の違うものの間での受け渡し時に重要。 割り込みでは、信号が入ったら割り込み許可を確認後、 処理番地(PC)保存・CPU内情報(レジスタ)を行なってから、割り込み処理に切り替わる。 割り込み処理が終了すれば、CPU情報・処理番地情報を元に戻し、本来の処理にもどる。 割り込みには、入出力割り込み・タイマ割り込み・エラー割り込み、ソフトウェア割り込みなどがある。

マルチタスク機能は、タイムスライス時間後にタイマ割り込みが発生するように設定することで実現する。 タイマ割り込み時には、OSが実行待ち行列からプロセスを選んで処理を切り替える。 中断したプロセスは待ち行列の最後尾にいれられ、順次処理が繰り返されることになる。 入出力処理が行われる場合は、プロセスは入出力待ち状態となり、スケジューラは 待ち行列より処理を選んで実行する。時間が経過して入出割り込みが発生すると、 OSが入出力待ちのプロセスを実行状態に戻す。

システム

最新の投稿(電子情報)

アーカイブ

カテゴリー