About this Blog

This Blog has English posts and Japanese posts. About Mac, iOS, Objective-C, and so on.

2013年6月22日土曜日

ParrotのARDrone. ホバリングが安定しない時は

最近いじっているParrotのARDrone2.0。
どうもホバリングが安定しないな~と思っていろいろ調べていたら、こんなページを見つけました。

Indoor Flying Tips - Drone Flyers : Drone Flyers

見出しだけ意訳すると、
  1. 柔らかい素材は高度センサーの超音波を吸収しちゃうよ
  2. 床面に模様があったほうがいいよ
  3. 天上に近づきすぎると、ARDroneが吸い付くよ
  4. 室内の時は室内用ハルを着けよう
  5. アプリ設定で、挙動を控えめにしよう
とのこと。

ホバリングに関係があるのは1番と2番。
ARDroneは下向きカメラの画像をホバリング時の位置制御に使っているので、
硬質で非光沢で模様がある床の上で飛ばしたほうがよさそうです。

上の情報の裏を取ろうと思って調べたら、こんな記事も見つかりました。
ケータイゲームの世界で“ゲーム機”を再発明――セドゥCEOに聞く「AR.Drone」 - ITmedia Mobile
姿勢制御には、加速度センサーやジャイロセンサーからの情報に加え、機体底部に設けた垂直カメラの映像を活用している。
だそうです。

[メモ]Eclipseの日本語化、JRE7の導入など

自分用メモ

Eclipseの日本語化
メニューの「Help」→「Install a new software」を開き、
URLに「http://download.eclipse.org/technology/babel/update-site/R0.10.1/juno」
と入れる。
Japaneseを選んでインストール。


JRE7の導入
Eclipseを一旦終了して、 Java SE Runtime Environment 7 Downloads
から32bit・64bitに対応したjre7をダウンロードしてインストール。
ダウンロード前に「Accept License Agreement」を選択する必要がある。

Eclipseを起動し、「ウィンドウ」→「設定」を開く。
「Java」→「インストール済みのJRE」をクリック。
「追加」をクリック。
「標準VM」を選択して、「次へ」をクリック。
「JREホーム」の横の「ディレクトリ」をクリック。
JRE7をインストールした場所を選択(おそらくC:\Program Files\java\jre7)
「完了」をクリック。
「インストール済みのJRE」の欄のにjre7が追加されているはず。
jre7にチェックを入れて、「OK」をクリック。


プロジェクトのJavaコンパイラーをJRE7に切り替える方法
プロジェクト・エクスプローラーの中の「JREシステム・ライブラリー[jre6]」(または他の古いシステムラ・ライブラリー)を「ビルドパスから削除」する。
プロジェクトを右クリックして「ビルドパス」→「ビルドパスの構成」を選択。
「Javaのビルドパス」をクリック。
「ライブラリー」をクリック。
「ライブラリーの追加」をクリック。
「JREシステム・ライブラリー」を選択して「次へ」
「代替JRE」を選択して、「jre7」を選択。
プロジェクトに「JREシステム・ライブラリー[jre7]」が追加されていたらOK。

EclipseでProcessingを使う(プラグイン非使用)

必要に迫られて使うことになったProcessing。
どうせ書くなら、リッチな開発環境を使いたいものです。

Java系言語ならEclipse!
プラグインもいくつかありますが、
Eclipse Plug In - Processing
Proclipsing
最近のProcessingはバージョンがころころと変わるのでちょっと不便(この間2.0のstableが出ましたが)

というわけで、手動でアーカイブをインポートして使うことにします。

前提として、日本語化されたEclipse環境、JavaコンパイラーはJRE7です。
また、ProcessingはCドライブの直下、「C:\processing-*」にあることにします。


プロジェクトを作成
メニューの「ファイル」→「新規」から、「Javaプロジェクト」を選択します。
プロジェクト名はなんでもいいです。JREは「jre7」にしておいてください。


プロジェクトにアーカイブ(*.jar)をインポート
プロジェクト・エクスプローラーを右クリックして、インポートを選択。
「選択」のウィンドウで「一般」→「ファイルシステム」を選択して「次へ」。
「次のディレクトリーから」という所に「C:\processing-*\core\library」を入力してEnter。
・core.jar
・gluegen-rt.jar
・jogl-all.jar
の3つをチェックして、
「拡張」をクリックし、「ワークスペースにリンクを作成」にチェックをいれます。
「完了」をクリックします。
プロジェクトに*.jarファイルが3つ追加されるので、右クリックして「ビルドパス」→「ビルドパスに追加」を選択、をそれぞれ行います。
(アーカイブをリンクとしてインポートするのは、*.jarがフォルダ内にあるdllに依存して動作するためです)

Webカメラも使いたいので、同様のことを
「C:\processing-*\modes\java\libraries\video\library」にある
・gstreamer-java.jar
・jna.jar
・video.jar
についても行います。


クラスを作成し、それをProcessingのJavaアプレットにする
プロジェクト内に、ProdessingTestというクラスを新規作成します。
このようになっているはずです。
public class ProcessingTest {

}

これを、以下のように修正します。
import processing.core.*;//!!!
import processing.video.*;

public class ProcessingTest extends PApplet{//!!!
 public void setup(){
 }
 public void draw(){
 }
}//!!!
これで、Processing sketchのひな形ができました。
「実行」ボタンをクリックすれば、Javaのアプレットとして実行できます。
適宜関数などを追加してください。

Processing標準のエディタ(PDE)で開発するときとの違いは以下のとおりです。
・関数の頭にpublic(またはprivate)をつけないといけない。
・color という型が使えないので、int型を使う(color 型はint 型のtypedef。中身は一緒)
・型チェックが厳しい。float 型を使う時は0.5f というように書いたり、関数に渡すときには(float), (int)とキャストしたりすればOK.


Eclipseで書いたスケッチをPDEに持っていく時は、上記のひな形の//!!!の行を削除すれば大丈夫です。
関数につけたpublicやcolor型をintで代用している箇所などは修正しなくても動きます。
Eclipseの標準の文字コードがCP932(MS932)というあまり見ないエンコーディングなので若干注意が必要です。
画像のファイルパスも適宜修正してください。

2013年5月19日日曜日

自作ペイントソフトで筆のような効果を出す

学校の課題で簡単なペイントソフトを作りました。
1つオリジナルの味付けをとのことだったので、書道っぽくマウスの移動速度に応じて描く線の太さを変えるようにしました。
基本的には、一定時間ごとに検出されるマウスの位置情報から、移動量を速度とみなして、その逆数に比例した線の太さを設定します。
こうすると、ゆっくり動かした時には太い線が、早く動かした時には細い線が描けます。
が、1回ごとの移動量だけを元に計算すると、変動が大きく線がボコボコになってしまいます。
そこで、過去の移動量もストアしておき、平均移動量を使うことにしました。


計算としては、以下のようになります。
 最新の移動量 = { (1つ前のX座標 - 現在のX座標)の絶対値 + (1つ前のY座標 - 現在のY座標)の絶対値 } * 0.5
 新しい平均移動量 = { (過去の平均移動量)*重み + 現在の速度} / (重み+1)
 筆の太さ = 適切なパラメータ / 新しい平均移動量

2点間の距離の計算は、近似して計算の負荷を減らしています。


実行結果は以下の通り。左が平均化していないもの、右が平均化したものです。



ソースコードは以下の通り。Ruby + GTK2です。(課題自体はCだったのですが、コードが膨大だったので)
コード中では「移動量」ではなく「速度」(velocity, v)としています。厳密には正しくないですがまあ気にしないで。

calligraphy.rb
require 'gtk2'

# 筆に関するパラメータ
# いろいろ変えてみてください。
INIT_FUDE_VELOCITY = 2 # 筆の平均速度の初期値
FUDE_PARAM = 50        # 速度の逆数に乗ずる定数
WEIGHT = 5             # 平均速度算出のための重み

# 筆に関する変数を用意
$velocity = INIT_FUDE_VELOCITY
$x0 = 0
$y0 = 0
$x1 = 0
$y1 = 0

# ウィンドウとドローイングエリアの作成など
window = Gtk::Window.new
window.set_size_request(640, 640)
window.set_app_paintable(true)
window.set_events(Gdk::Event::BUTTON_PRESS_MASK | Gdk::Event::BUTTON_RELEASE_MASK | Gdk::Event::BUTTON_MOTION_MASK)
window.realize
drawable = window.window

# グラフィックコンテキスト(GC)の用意
gc = Gdk::GC.new(drawable)
black = Gdk::Color.new(0, 0, 0)
colormap = Gdk::Colormap.system
colormap.alloc_color(black, false, true)
gc.set_foreground(black)

window.signal_connect('motion_notify_event') do |win, evt| #マウスが動いた時
  $x1 = evt.x
  $y1 = evt.y
  v = (($x1-$x0).abs + ($y1-$y0).abs)/2.0             # 最新の速度を計算
  $velocity = (WEIGHT*$velocity + v)/(WEIGHT+1).to_f  # 平均速度を計算し直す
  fude_width = FUDE_PARAM/$velocity                   # 筆の太さを決定する
  gc.set_line_attributes(fude_width,Gdk::GC::LINE_SOLID,Gdk::GC::CAP_ROUND,Gdk::GC::JOIN_BEVEL) # 筆の太さを設定する
  drawable.draw_line(gc, $x0, $y0, $x1, $y1)
  $x0 = evt.x
  $y0 = evt.y
end

window.signal_connect('button_press_event') do |win, evt| #マウスボタンが押された時
  $x0 = evt.x
  $y0 = evt.y
end

window.signal_connect('button_release_event') do |win, evt| #マウスボタンが離された時
  $v = INIT_FUDE_VELOCITY
end

window.signal_connect('destroy') do
  Gtk.main_quit
end

window.show_all

Gtk.main


参考
 gtk2-tut - Ruby-GNOME2 Project Website
 Ruby/GTK - Ruby-GNOME2 Project Website
 ウインドウへの直接描画(Gdk::Drawable編) - Ruby-GNOME2 Project Website
 [Ruby] Ruby-GNOME2(Ruby/GTK2) 線を引く
 [Ruby] Ruby-GNOME2(Ruby/GTK2) マウスのイベントを拾う


ちなみに、GtkのRubyバインディングは
$sudo gem install gtk2
でインストールできます。(Ruby1.9.3で確認)

最後にもう1枚。

2013年5月15日水曜日

ruby-openglの立体をGithubに公開しました。

まだまだドキュメンテーションはじめ不備が多いですが、ひとまずお知らせ。
ykuramata/ruby-opengl-glut-shapes · GitHub

公開したのは、以下の通り。
・楕円体 (GLUT.Ellipsoid)
・回転角度によって半径を変えられる回転体 (GLUT.Cocoon)
・曲線周りの回転体 (GLUT.Macaroni)
・レゴブロック (GLUT.Legoblock)

一部は記事として紹介しています。
enthusiastick coding: ruby-openglで楕円体を描いてみた
[ruby-opengl] 回転体 Advanced(回転角度によって半径を変えられる)

2013年5月8日水曜日

Ubuntu+Ruby1.9.3+OpenGL+joystick(Xboxのコントローラ)

enthusiastick coding: Ubuntu+RubyでX-BOXのコントローラを使う(gem不使用)で接続したXboxのコントローラでの入力をOpenGLに反映させてみます。

参考にしたのは、
Pablotron: Joystick-Rubyで落としてきたtarボールに入っていたサンプルコードのxo.rb
require 'opengl'
require 'glut'
require 'joystick'
INTERVAL = 50
# 中略
$joy = Joystick::Device::open "/dev/input/js0" # 環境に応じて書き換えてください。
$foo = 0.0 # ジョイスティックからの入力を反映させたい変数。
timer_func = Proc.new{
  foo_diff = 0
  while $joy.pending?
    ev = $joy.next_event
    case ev.type
      when Joystick::Event::AXIS
        case ev.num
        when 0
          foo_diff = ev.value/1000.0 #AXISの値は-32767から32767
        end
      when Joystick::Event::BUTTON
        case ev.num
        when 0
          puts ev.value #=> ボタンが押された時: 1, ボタンが離された時: 0
          # ボタンに反応させたい時はここに具体的な処理を書いてください。
        end
      end
  end
  $foo += foo_diff
}
# 中略
GLUT.TimerFunc(INTERVAL, timer_func, 0)
# 後略
joystickからの入力値はバッファにためられるので、ただ一定時間ごとに値を取得してOpenGLの描画に反映させてもうまく動きません。
そこで、毎回バッファをクリアして最新の値を取得してするようにしています。
joystickの入力をトリガにするという手もありますが、今回はこれで。