DATE : 2007/04/26 (Thu)
今日付けの某地方紙に以前から取り組んでいた企画が取り上げられました。
(;^ω^)一面のど真ん中に載っています。新聞社のウェブサイトにもトップに載っていました。
初めの取材を終えて数日経ってから、もう少し大きく載せたいと補足の取材を受けたのですが、まさかここまで大きく載るとは思いもよりませんでした。
(;^ω^)しかも、新聞社側が自発的にやってきた取材ではなく、こちら側が話を提供した上での取材だったので、ますます驚いてしまいました。
GPS を使った企画だったのですが、取材を受けていて気付かされたのは、GPS そのものはあまり知名度が高くないということでした。カーナビや携帯電話ではすでにおなじみですが、その背後に控えている GPS の仕組みは、衛星を利用するという点から知られていないようです。
認識を改める良い機会になりました。
(;^ω^)専門的な分野に身を置いていると、ついこれぐらいは一般的だろうと思ってしまうのですが、自分ではなかなかそう思っていることに気がつけないんですよね。真摯に話を聞いてくださった記者の方に感謝です。
DATE : 2007/04/22 (Sun)
「朽ちていった命 ――被曝治療83日間の記録――」(NHK「東海村臨界事故」取材班、新潮社、2006)を読みました。岩波書店から2002年に刊行された単行本の文庫版です。
被曝といえば、恥ずかしながら子供のころに読んだ「はだしのゲン」に描かれたものぐらいしか知識がありませんでした。読んだのがかなり昔のこともあって、体の溶けた人々が街を歩くといった、被爆と被曝がごた混ぜになったようなイメージしか読む前にはありませんでした。
ところが、被曝直後の体は、体にほとんど異常が見られないほど元気なのです。
本書は、1999年9月に発生した東海村 JCO 臨界事故で最も大量の放射線を浴びた大内久氏の83日間の闘病(治療)記録です。大内氏の浴びた放射線は、致死量(7~10シーベルト)をはるかに超える20シーベルトでした。しかし、被曝直後の大内氏はリンパ球の数は減少していたものの、外見はほぼ健康体でした。
ところが、染色体は完全に破壊されていたのです。これは、新たな細胞が生まれてこないことを意味していました。放射線を浴びた直後から、体中の細胞の死が運命付けられていました。
放射線の恐ろしさをまざまざと見せ付けられました。安全だ、安全だと繰り返される原子力発電ですが、放射線が大量に放出されるような事故が発生すれば、いつ同じような状況になるのか分かりません。
しかし、原子力発電はなくせません。発電効率の良い点はもちろん、一度作ったものを解体するにもコストの関係から現実的ではありません(特に、原子炉は放射性廃棄物のなるため、処分には長期間の管理が必要となります)。すると、願うことはとにかく事故がおきないように管理を徹底していただくほかにありません。東海村 JCO 事故では、表向きのマニュアル → (臨界が起きないように考慮された)裏マニュアル → (効率のみを追求した)裏マニュアルが実行され、結果として悲惨な事故となりました。大内氏には、臨界に達する可能性を知らされていなかったそうです。
同時に、知識のないままに物事を行う恐ろしさも知ったような気がします。
DATE : 2007/04/20 (Fri)
「制御工学の考え方」(木村英紀、講談社、2002年)を読みました。
自動車、エアコン、HDD など様々な機器に使用されている「制御」について一般向けに書かれた本です(数式はほとんど出てきません)。
「制御」とは、『目的に向けた影響力の持続的行使』(P.58)のことを言います。エアコンの場合、ユーザの設定した室温になるように風を吹き込み、その室温を一定に保つことが「制御」と言えます。
ちょうどマインドストームを触り始めたので、非常に興味深く読めました。そのころはとても簡単なライントレースプログラムを完成させて喜んでいたころなのですが、そこにはすでに「制御」が顔を覗かせていました。
マインドストームで光センサ1つでライントレースを行う場合、いろいろな方法はあるのですが、ラインとその外との境界をトレースするという方法が一番簡単です(参考) 。ライン上では左の車輪のみ回転、外にはみ出せば右の車輪のみ回転という動作を繰り返します。ラインの境界をまたぎながら前進するという「目的」に向かって、回転させる車輪を切り替えるという「影響力」が光センサによって「持続的」に「行使」されています。
つまり、出力(車輪の回転)が入力(光センサ)に影響を与えるため「制御」が顔を出してくるのでしょう(一種のフィードバック制御です)。
しかし、入力をキーボード、出力をディスプレイとすると、PC 向けのプログラムでも「制御」が行われているといえます。もっとも、制御の「目的」はユーザ(人間)になるわけですが。
(;^ω^)一番やっかいな相手ですね……。
DATE : 2007/04/15 (Sun)
2、3月ごろから調子の悪かった PC を修理に出しました。
(;^ω^)ネコに F9 キーを飛ばされましたしね……。
F9 キーは応急処置ができたのでいいのですが、「h」や「4」「6」キーなどが反応しなくなることがよくあったので、修理に出すことに決めました。
( ´∀`)時期的にもちょうど落ち着いているころですしね。
というわけで、この記事はいつも使っている PC ではなく、家族から借りたものを使って書いています。
あまり環境を移しすぎると、PC が戻ってきたときがまた大変なので、最小限の環境だけで乗り切ろうと思います。
( ^ω^)修理期間中は、積読状態になっている本でも読もうと思います。
DATE : 2007/04/14 (Sat)
場面設定ファイルは次のように記述します。
<?xml version="1.0" encoding="UTF-8"?> <Scene xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Config/Scene/Scene.xsd"> <Floor Length="1.0" Width="1.0" GifFilename="scenario/example/floor.gif" /> <Lights> <SpotLight PositionX="-0.5" PositionY="0.5" PositionZ="1" DirectionX="0.5" DirectionY="-.5" DirectionZ="-1" Concentration="40" SpreadAngle="3" Red="220" Green="50" Blue="50" /> <SpotLight PositionX="0" PositionY="0" PositionZ="2" DirectionX="0" DirectionY="0" DirectionZ="-1" Concentration="100" SpreadAngle="30" Red="150" Green="150" Blue="150" /> </Lights> <StaticObjects> <WorldObject> <ParentTransformGroup Value11="1" Value12="0" Value13="0" Value14="0" Value21="0" Value22="1" Value23="0" Value24="0" Value31="0" Value32="0" Value33="1" Value34="0" Value41="0" Value42="0" Value43="0" Value44="1"> <ChildTransformGroup Value11="1" Value12="0" Value13="0" Value14="0" Value21="0" Value22="1" Value23="0" Value24="0" Value31="0" Value32="0" Value33="1" Value34="0" Value41="0" Value42="0" Value43="0" Value44="1"> <Box Width="0.12" Length="0.08" Height="0.10" Red="200" Green="200" Blue="0" /> </ChildTransformGroup> </ParentTransformGroup> </WorldObject> </StaticObjects> <Cameras> <Camera name="Camera 0"> <TransformGroup Value11="0.8338244" Value12="0.12909822" Value13="-0.53672206" Value14="-1.4949298" Value21="-0.529671" Value22="0.4610073" Value23="-0.71198374" Value24="-2.0976896" Value31="0.15551695" Value32="0.87795556" Value33="0.45277873" Value34="1.1544305" Value41="0.0" Value42="0.0" Value43="0.0" Value44="1.0" /> </Camera> </Cameras> </Scene>
Floor 要素
<Floor Length="1.0" Width="1.0"
GifFilename="scenario/example/floor.gif" />
床画像を設定します。例えば、ライントレースをシミュレートする場合はラインの描かれた画像を用意します。
- Length 属性
- 床の縦方向の長さを指定します。単位はメートルです。例えば、1.0と指定した場合は、1.0メートルとなります。
- Width 属性
- 床の横方向の長さを指定します。単位は Length 属性と同じです。
- GifFilename 属性
- 床画像のパスを指定します。パスは、LMS がインストールされたディレクトリからの相対パスです。「Gif」Filename という名前ですが、GIF 形式の他に、PNG 形式や JPEG 形式の画像も使えます。画像の大きさは、縦横ともにピクセル数が2の倍数でなければなりません。
光センサーで読み取った床の明るさは、床画像の明るさと等しくなります。しかし、現実には完全に白い紙はありませんし、マインドストーム本体などが床に影を落とします。シミュレータと現実とではまずこの部分で大きな違いが出てきます。
Lights 要素
<Lights>
<SpotLight
PositionX="-0.5" PositionY="0.5" PositionZ="1"
DirectionX="0.5" DirectionY="-.5" DirectionZ="-1"
Concentration="40" SpreadAngle="3"
Red="220" Green="50" Blue="50" />
<SpotLight
PositionX="0" PositionY="0" PositionZ="2"
DirectionX="0" DirectionY="0" DirectionZ="-1"
Concentration="100" SpreadAngle="30"
Red="150" Green="150" Blue="150" />
</Lights>
光源を設定します。とりあえずは、上の例の通りで十分です。
ひとつひとつの光源は、SpotLight 要素で指定します。
- PositionX, PositionY, PositionZ 属性
- 光源の位置を設定します。床の中心が原点です。x は右方向、yは上方向、zは手前方向に向かって増大します。単位はメートルです。例えば、「PositionX="0.5" PositionY="0.5" PositionZ="1.0"」の場合は、右上の隅の1m上に光源を置くことになります。
- DirectionX, DirectionY, DirectionZ 属性
- 光源の発する光の方向を指定します。例えば、手前から奥の方向に照らす場合は、DirectionZ 属性を -1.0 に設定します。PositionX, PositionY, PositionZ に対応する属性に、正負を逆転した値を指定すれば、床の中心を照らす光になります。
- Concentration 属性
- 光の強さを百分率で指定します。
- SpreadAngle 属性
- 光の広がり具合を角度で指定します。
- Red, Green, Blue 属性
- 光の色を指定します。各属性は0~255までの値で、大きな値ほど色が濃くなります。光の色を指定する属性ですが、色料の三原色に基づいて指定します。
SpotLight 属性を並べれば、複数の光源を配置することができます。
StaticObjects 要素
<StaticObjects> <WorldObject> <ParentTransformGroup Value11="1" Value12="0" Value13="0" Value14="0" Value21="0" Value22="1" Value23="0" Value24="0" Value31="0" Value32="0" Value33="1" Value34="0" Value41="0" Value42="0" Value43="0" Value44="1"> <ChildTransformGroup Value11="1" Value12="0" Value13="0" Value14="0" Value21="0" Value22="1" Value23="0" Value24="0" Value31="0" Value32="0" Value33="1" Value34="0" Value41="0" Value42="0" Value43="0" Value44="1"> <Box Width="0.12" Length="0.08" Height="0.10" Red="200" Green="200" Blue="0" /> </ChildTransformGroup> </ParentTransformGroup> </WorldObject> </StaticObjects>
物体を配置します。個々の物体は、WorldObject 要素で指定します。
WorldObject 要素内には、ParentTransformGroup 要素を記述し、その要素内には ChildTransformGroup 要素を記述します。そして、ChildTransformGroup 要素内に Box 要素を指定することで、物体を配置できます。
ParentTransformGroup 要素や ChildTransformGroup 要素では、物体の配置する位置を指定します。そのうち、ParentTransformGroup 要素は場面全体から見た物体の位置(ワールド座標)を、ChildTransformGroup 要素は物体を中心に見た位置(ローカル座標)を指定します。
ParentTransformGroup 要素と ChildTransformGroup 要素は属性が共通しています。それぞれの属性は、変換行列の要素を表します。
Value11 | Value12 | Value13 | Value14 |
Value21 | Value22 | Value23 | Value24 |
Value31 | Value32 | Value33 | Value34 |
Value41 | Value42 | Value43 | Value44 |
何も変換を行わない、つまり、中心に物体を配置する場合は次のような変換行列になります。
Value11 = 1 | Value12 = 0 | Value13 = 0 | Value14 = 0 |
Value21 = 0 | Value22 = 1 | Value23 = 0 | Value24 = 0 |
Value31 = 0 | Value32 = 0 | Value33 = 1 | Value34 = 0 |
Value41 = 0 | Value42 = 0 | Value43 = 0 | Value44 = 1 |
例えば、x, y, z 軸に沿った移動は、Value14, Value24, Value34 の値を変えることで行います。
Value11 = 1 | Value12 = 0 | Value13 = 0 | Value14 = dx |
Value21 = 0 | Value22 = 1 | Value23 = 0 | Value24 = dy |
Value31 = 0 | Value32 = 0 | Value33 = 1 | Value34 = dz |
Value41 = 0 | Value42 = 0 | Value43 = 0 | Value44 = 1 |
ここで、dx, dy, dz は、メートル単位で指定します。
物体を回転させるには、以下の要素(回転行列R)を変更します。
Value11 | Value12 | Value13 |
Value21 | Value22 | Value23 |
Value31 | Value32 | Value33 |
- x軸上の回転行列(RX)
-
Value11 = 1 Value12 = 0 Value13 = 0 Value21 = 0 Value22 = cosφ Value23 = -sinφ Value31 = 0 Value32 = sinφ Value33 = cosφ - y軸上の回転行列(RY)
-
Value11 = cosφ Value12 = 0 Value13 = sinφ Value21 = 0 Value22 = 1 Value23 = 0 Value31 = -sinφ Value32 = 0 Value33 = cosφ - z軸上の回転行列(RZ)
-
Value11 = cosφ Value12 = -sinφ Value13 = 0 Value21 = sinφ Value22 = cosφ Value23 = 0 Value31 = 0 Value32 = 0 Value33 = 1
各軸上の回転を合成するには、合成したい回転行列同士を乗じます。例えば、x 軸上の回転と y 軸上の回転を合成するには、R = RX × RY とします。
(;^ω^)行列演算をしないといけないので、ここらへんの設定は結構面倒です。
Box 要素では、物体の大きさなどを指定します。
- Width 属性
- 物体の表面の横幅です。メートル単位です。
- Height 属性
- 物体の高さです。単位は Width 属性と同じです。
- Length 属性
- 物体の表面の縦幅です。単位は Width 属性と同じです。
- Red, Green, Blue 属性
- 物体の色です。Light 要素の属性と同じです。
ChildTransformGroup 要素は複数並べることができます。そのため、複雑な形状の物体も定義することができます。
物体を置かない場合は、次のように StaticObjects 要素を定義します。
<StaticObjects> </StaticObjects>
Cameras 要素
<Cameras> <Camera name="Camera 0"> <TransformGroup Value11="0.8338244" Value12="0.12909822" Value13="-0.53672206" Value14="-1.4949298" Value21="-0.529671" Value22="0.4610073" Value23="-0.71198374" Value24="-2.0976896" Value31="0.15551695" Value32="0.87795556" Value33="0.45277873" Value34="1.1544305" Value41="0.0" Value42="0.0" Value43="0.0" Value44="1.0" /> </Camera> </Cameras>
画面に場面を映すためのカメラを配置します。カメラは複数は位置することができ、LMS のメニューから切り替えることができます。とりあえずは、上の例の通りで十分です。
個々のカメラは、Camera 要素で定義します。name 属性で、カメラの名前を設定します。
Camera 要素では、TransformGroup 要素を定義することでカメラの位置を設定します。その属性は、StaticObjects 要素の ParentTransformGroup 要素や ChildTransformGroup 要素と同様です。ただし、回転行列R に次の行列Sを乗じる(R × S)と、カメラをズームすることができます。
Value11 = z | Value12 = 0 | Value13 = 0 |
Value21 = 0 | Value22 = z | Value23 = 0 |
Value31 = 0 | Value32 = 0 | Value33 = z |
z は、ズームする倍率です。
参考文献
- Lego Mindstorms Simulator Creating LMS Scenes 上の例はここにある例に少し手を加えたものです。