忍者ブログ
[1] [2]

DATE : 2017/04/26 (Wed)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


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 要素は属性が共通しています。それぞれの属性は、変換行列の要素を表します。

Value11Value12Value13Value14
Value21Value22Value23Value24
Value31Value32Value33Value34
Value41Value42Value43Value44

何も変換を行わない、つまり、中心に物体を配置する場合は次のような変換行列になります。

Value11 = 1Value12 = 0Value13 = 0Value14 = 0
Value21 = 0Value22 = 1Value23 = 0Value24 = 0
Value31 = 0Value32 = 0Value33 = 1Value34 = 0
Value41 = 0Value42 = 0Value43 = 0Value44 = 1

例えば、x, y, z 軸に沿った移動は、Value14, Value24, Value34 の値を変えることで行います。

Value11 = 1Value12 = 0Value13 = 0Value14 = dx
Value21 = 0Value22 = 1Value23 = 0Value24 = dy
Value31 = 0Value32 = 0Value33 = 1Value34 = dz
Value41 = 0Value42 = 0Value43 = 0Value44 = 1

ここで、dx, dy, dz は、メートル単位で指定します。

物体を回転させるには、以下の要素(回転行列R)を変更します。

Value11Value12Value13
Value21Value22Value23
Value31Value32Value33
x軸上の回転行列(RX)
Value11 = 1Value12 = 0Value13 = 0
Value21 = 0Value22 = cosφValue23 = -sinφ
Value31 = 0Value32 = sinφValue33 = cosφ
y軸上の回転行列(RY)
Value11 = cosφValue12 = 0Value13 = sinφ
Value21 = 0Value22 = 1Value23 = 0
Value31 = -sinφValue32 = 0Value33 = cosφ
z軸上の回転行列(RZ)
Value11 = cosφValue12 = -sinφValue13 = 0
Value21 = sinφValue22 = cosφValue23 = 0
Value31 = 0Value32 = 0Value33 = 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 = zValue12 = 0Value13 = 0
Value21 = 0Value22 = zValue23 = 0
Value31 = 0Value32 = 0Value33 = z

z は、ズームする倍率です。

参考文献

PR

DATE : 2007/04/09 (Mon)

これまで LMS (Lego Mindstorms Simulator) 上で動作していたものを実機上で動作させてみました。

LMS 上では Java を使ってプログラムを組んでいたのですが、実機向けに NQC に移植しました。

( ^ω^)さすがにマインドストーム専用だけあって、NQC は組みやすいです。

やはり、LMS と実機とではかなり動作が違います。例えば、LMS がマインドストームをシミュレートする速度は実機の速度と同じではありませんし、それが一定に保たれる保証はありません。

(;^ω^)もっと高性能なマシン上でシミュレートすれば話は別かもしれませんが。

なので、経過時間に依存する処理は、LMS と実機とではその経過時間の閾値が異なってきます。

また、光センサーの取得する明るさも LMS と実機とでは異なります。実機では、床画像のピクセル値の明るさが光センサーの取得する明るさとなります。実機の場合、完全に白い紙や黒い部分、光源は存在しないので、光センサーの取得する値は実際に床へかざして確かめる必要があります。

さらに、床が黒い部分から白い部分に光センサーが移った場合、取得する明るさが一瞬のうちに暗い値から明るい値へと切り替わるわけではありません。連続的に、暗い値→少し明るい値→明るい値へと変化します。変化する速度は瞬間的なものですが、光センサーから明るさを取得するタイミングによっては中途半端な値が出てくることもあります。

今回、白い紙の上で黒い線をライントレースした後、線上にある灰色の領域に触れると90°回転するという動作を実機上で行いました。すると、ライントレースの最中に回転が始まってしまうという事態が頻発しました。これは、ちょうど光センサーの変わり目の値を読んでしまったことで起きた現象でした。

( ^ω^)結局は、黒い線を灰色に、回転するための領域を黒とすることで、ライントレース中に灰色を検出しないようにしました。

(;^ω^)これはなかなか、実機でないと気付かない現象ですね。


DATE : 2007/04/05 (Thu)

LMS のプロジェクト設定ファイルの中身は、次のようになっています。

プロジェクト全体は、Project 要素として記述します。

<?xml version="1.0" encoding="UTF-8"?>

<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="../../Config/Project/Project.xsd">

  <Scene>scenario/example/scene.xml</Scene>

  <RCX>scenario/example/rcx.xml</RCX>

</Project>

ここで重要な点は、プロジェクト設定ファイル内の相対パスは LMS のインストールディレクトリが基点となるということです(LMS 1.41時点)。つまり、パスは絶対パスで記述するか、LMS のインストールディレクトリからの相対パスで記述しなければなりません。

例えば、Project 要素の xsi:noNamespaceSchemaLocation 属性には「../../Config/Project/Project.xsd」というパスが設定されています。これは、「<LMS のインストールディレクトリ>/Config/Project/Project.xsd」を表します。

そのため、プロジェクトを格納するディレクトリの場所には注意が必要です。特に、ディレクトリを移動した場合はパスの書き換えが必要になる場合もあります。上の例では、LMS のインストールディレクトリの直下に scenario ディレクトリを作成して、その中に example ディレクトリを作っています。

上記の注意を踏まえた上で、プロジェクト設定ファイルには、以下の設定を記述します。

  • 場面設定ファイルのパス(Scene 要素)
  • 仮想 RCX ロボット設定ファイルのパス(RCX 要素)

なお、次のように RCX 要素を追加することで、複数の仮想 RCX ロボットをシミュレートすることもできます。

  <RCX>scenario/example/rcx.xml</RCX>
  <RCX>scenario/example/rcx.xml</RCX>
  <RCX>scenario/example/rcx.xml</RCX>

DATE : 2007/04/04 (Wed)

LMS のプロジェクトは、主に以下から構成されます。

  • プロジェクト設定ファイル
  • 場面設定ファイル
  • 床画像ファイル
  • 仮想 RCX ロボット設定ファイル
  • プログラムファイル
プロジェクト設定ファイル
プロジェクト全体の内容を記述するファイルです。場面設定ファイルと 仮想 RCX ロボット設定ファイルの場所を指定します。
場面設定ファイル
仮想 RCX ロボットの動きをシミュレートする場面を記述するファイルです。床の模様や障害物の位置などの設定を行います。また、シミュレーションの様子を見るための光源やカメラの位置の設定もあります。
床画像ファイル
床の模様を描画した画像ファイルです。ライントレースをシミュレートする場合は、そのラインを描いた画像ファイルになります。
仮想 RCX ロボット設定ファイル
シミュレートするマインドストームの構成を記述するファイルです。モータやセンサーの位置や接続状態の設定を行います。また、シミュレートを行うプログラムファイルの場所を指定します。
プログラムファイル
マインドストームの動作を記述したプログラムファイルです。leJOS 向けに Java で記述したクラスファイルを JAR 化したものを設定します。leJOS 向けのソースコードは、JDK 1.4 以降の言語拡張を使わないように書きます。

参考文献


DATE : 2007/04/03 (Tue)

前回の記事で、lejosc コマンドの中身は javac コマンドを leJOS 環境向けに実行していることがわかりました。

lejosc コマンドを実行した後、LMS 向けのマインドストームをビルドするにはクラスファイルを JAR ファイルにまとめる必要があります。この時に使う jar コマンドも JDK 付属のツールです。

そこで、Apache Ant のビルドファイルを作ってみました。このビルドファイルを使用すると、LMS 向けマインドストームを格納した JAR ファイルを ant コマンド一発で生成できます。マニフェストファイルは Apache Ant 側で生成するため、用意する必要はありません。

LMS 向けマインドストームをビルドする Apache Ant ビルドファイルを以下に掲載します。Apache Ant 1.6.5 で動作を確認しました。

<?xml version="1.0" encoding="UTF-8" ?>

<project name="example_robot_project" default="jar" basedir=".">


  <!-- プロパティ一覧 -->
    
<!-- leJOS のインストールディレクトリ -->
<property name="lejos_home" location="c:/lejos" />

<!-- ソースコードのトップディレクトリ -->
<property name="java_src" location="src/main/java" />

<!-- ビルド結果を格納するディレクトリ -->
<property name="target" location="target" />

<!-- メインクラス(完全修飾名で指定) -->
<property name="main_class" value="com.example.ExampleRobot" />

<!-- 生成する JAR ファイルの名前(拡張子は不要) -->
<property name="jar_name" value="example_robot" />
    
<!-- ソースコードの文字エンコーディング -->
<property name="src_encoding" value="UTF-8" />


  <!-- ターゲット一覧 -->
    
<target name="init">

  <mkdir dir="${target}/classes" />

</target>


<target name="compile" depends="init">

  <javac srcdir="${java_src}" destdir="${target}/classes"
      bootclasspath="${lejos_home}/lib/classes.jar;${lejos_home}/lib/rcxrcxcomm.jar"
      encoding="${src_encoding}" target="1.1" source="1.3" />

</target>

<target name="jar" depends="compile">

  <manifest file="${target}/MANIFEST.MF">
    <attribute name="Main-Class" value="${main_class}" />
   </manifest>
  
  <jar destfile="${target}/${jar_name}.jar" basedir="${target}/classes"
      includes="**.class" manifest="${target}/MANIFEST.MF"
      compress="false" index="false" />

</target>

<target name="clear">

  <delete dir="${target}" />

</target>

</project>

プロジェクト名(project 要素の name 属性)や各種プロパティは、開発環境に応じて設定してください。

なお、このビルドファイルはプロジェクトディレクトリのトップに置いてください。

ビルドが成功すると、生成されたJAR ファイルが、<プロジェクトのトップディレクトリ>/<ビルド結果を格納するディレクトリ> 内に出力されています。

ビルドファイルのファイル名を「build.xml」としておくと、プロジェクトのトップディレクトリで次のコマンドを実行するだけで JAR ファイルが生成されます。

> ant

次のように clear ターゲットを実行すると、ビルド結果を格納するディレクトリを削除します。

> ant clear

参考文献

忍者ブログ [PR]
ブログ内検索
最近の状況
リンク
カレンダー
03 2017/04 05
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
T/O
(11/05)
ブログ内検索
最近の状況
リンク
カレンダー
03 2017/04 05
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
T/O
(11/05)