- Project Tango
Development Kitでサンプルコードを動かす:Android Studio編
2015/02/13現在、開発を進めるにあたり日本語の情報が少なかったので書いておきます。
英語の情報はたくさんあります。
まずは、
Google
の元サイトを見て下さい。
前提条件
- Project Tango Development Kitを持っている(元サイトの前提と同じ)
- Androidアプリの開発経験がある(元サイトの前提と同じ)
→なくてもすぐに勉強できます。
ドット
インストールがおすすめです。
- Android Studioの基本設定が終わっている(元サイトと異なる)→元サ
イトはEclipseでの開発を説明しています。最近の開発環境であるAndroid Studioで
の開発について説明します。
- ソース開発環境はWindows 7である
方法
- ハードウェアの認識
以下からGoogle USB Driverをダウンロード。Android Studioのどこかにあるの
かもしれないが、見つけられなかった(失敗済み)。
http://developer.android.com/sdk/win-usb.html
コンピュータ→管理→デバイスマネージャ→ほかのデバイス...
→ADB Interface→ドライバの更新→上記からダウンロードしたドライバを入れ
る。usb_driverというフォルダを選択すること。その下のamd64などを選択したりし
てはならない(失敗済み)。成功すると、Android Composite ADB Interfaceが追加される。
-
Project Tangoのサンプルコードを入手する。
$ git clone https://github.com/googlesamples/tango-examples-java
- 「QuickStartJava」のインポート
今回は「QuickStartJava」を試すことにする。
まず、tango-examples-java/QuickstartJava/project.propertiesをエディタで開き、
以下の行をコメントアウトする。
#android.library.reference.2=../../../applications/android/tango-native-service-client-helperlib
次に、Android Studioを起動する。
File→Import Projectを選び、サンプルコード中の「QuickStartJava」を選択す
る。
なお、project.propertiesを編集せずに、Next→Nextとするとエラー(tango-native-service-client-helperlib could not
be found)を吐く(失敗済み)。
ダッシュ(-)をアンダースコア(_)に変えたり、パスを変えたり、いろいろやって
みたがだめだったので、行をコメントアウトした。
- 実機テスト
USB経由でProject Tango Development Kitが接続されていることを確認する。
Runボタンを押してしばらくするとポップアップが上がるのでOKを押す。
さらにしばらく待つと実機でサンプルコードが実行される。
以上でAndroid Studioによる開発準備が整った。
- 注意
現時点ではエミュレータ用のファイルは提供されていないので、エミュレー
タでRunしようとしてもアプリを起動できない(Tango独自の設定を読み込むところで
落ちる)。
- プレゼン上達法のアイディア
対象:学部生が講義でプレゼンする
- カンペを見ない
- 他の同じレベルの学生の発表を見てよい部分を取り入れる。
- 時間をN分と決めて発表練習を行う。制限時間内に終わるようにする。
- 他の学生からコメントをもらう。この層は時間をかけた分だけプレゼンのスキルが上がる層でもある。数回コメントをもらうだけで見違えるようにプレゼンがうまくなる。
対象:修士過程学生(情報系に限る)が学会発表する
- たとえ朝一番の発表だとしても、会場には1時間前に着いて機材のチェックを行う。発表直前に着いて接続チェックをしないようなプレゼンは絶対にしないこと。たとえ接続チェックをしても本番で動作しないこともある。
- 文字は大きく。「大きく」と聞いてすぐ修正できる人は問題ない。
問題は「大きく」と言っても、そもそも文字を大きくすることが重要であると思っ
ていない人である。学会ではプロジェクタやスクリーンが見えないこともある。
また、会場には推薦する論文を決める担当者がいることがあるが、遠くに座って
いた場合、文字が見えない発表は非常に印象が悪い。20ポイント以
下の文字を使わないでスライドを作るゲームをプレイしていると仮定してみる。
- 1つの図、1つの言い回しにも十分に時間をかける。それを聞いて修正できる人は問題ない(1つ前参照)。
問題は、少ない時間しかかけていないのに、十分にかけたと思っている人である。
杉浦は、50人が聞きに来る20分発表だとしたら、50x20x2=2000分程度は準備に使ってよいはずと考える。自分の時間が聴衆と同等だと仮定するとしても、50x20x1=1000分であるが、人の時間の価値は自分より2倍高いと仮定している。
- スマホで発表練習を録画して、話し方などをチェックする。
- 重要なことをスライド下部に書かない。前の人の頭で見えないことがある。
- 発表に対する質問を終わってからノートに全て書き出す。その質問に対してじっくり考えた答えを同時に書いておく。書き溜めていくと、自分の発表に足りない部分が見えてくる。
- 実験のビデオを見せる。1分程度に編集できるとよい。
- 音声を使う発表であれば、自分のスピーカを必ず用意すること。会場の音響機材はボリュームをすぐに変えられないなど使いにくい可能性が高い。学会はほぼボランティアで運営されている。スタッフは懸命に努力しているが、お膳立てが完璧だと誤解しないこと。
対象:博士過程学生〜ポスドク(情報系に限る)がプレゼンする
- 自分の講演を録音する。学会の帰りに繰り返し聞いて悪い点を分析する。次回の発表の前の移動中に再度聞いて、今回直す点を決める。
- 始まって1分以内にビデオを見せる。5分以上スライドだけを見せられると辛い。自分の知っている背景を聞かされる人はメールや内職を始める。
- 始まって1分以内にデモを見せる。それが難しい研究テーマはビデオでもよ
いが、とにかく音声・映像をうまく使う。
- 発表中のデモは大正義。デモはうまくいけば、聴衆に納得してもらえる。うまくいかなくても笑いをとれる。聴衆は人の失敗が大好きである。つまり、デモはうまくいってもいかなくてもプラスになる稀有な方法である。
- スライドのタイトルを「背景」「結果」などにしない。そのスライドで言い
たいことを1行で書くこと。たとえ、背景を説明したスライドであったと
しても、「背景」とそのスライドのまとめを両方書く。例:「背景:ロボット対話の開発において、音声認識や合成が低コスト化を妨げている」
- 何回も練習していると、スライドには書いていないが口で追加している説明が必ず出てくる。その説明はスライドに書いていない重要なことである可能性が高いのでスライドに書き足す。また、スライドの言葉と口での説明が少しずれた場合もスライドを直す合図である。なお、口頭での付加情報と本当は重要なのに書いていないことの区別には気をつける。このレベルの人であれば分かるはず。
- 理系英語の勉強方法: Reading
語彙を増やす(TOEIC600-800を目標とする人向け)
単語を文単位で覚えます.
受験生なら,単語とその意味のセットでも効果的ですが,文単位でも覚え
ておきます.
私の暗記法
- 速読英単語などで,見開きページ(ページ1-2など)中で覚える文(単
語なら20単語)を10文選ぶ.
これらを,上から文1, 2, ..., 10とする.
単語ならmention, endow, disappear, ...と20単語リストアップ.
本が手元になければ自分でリストを作る
- ページを閉じて文1, 2,...と覚えている文まで続けて口に出す.
- (例えば)3文目で詰まったら,ページ1-2を開いて文3を見ながら覚
える.
- 再度ページを閉じて,文1, 2,...と覚えている文まで続けて口に出
す.
このときカタカナ英語にならないように発音記号にしたがって発音すること.
例文の再生機能がある辞書やインターネット上のコンテンツなら,
ネイティブの発音をまねるのが効果的.
- 文10まで言えれば終わり.途中で詰まったら何度でも,文1に戻っ
て文1,2,...,(例えば)6のように口に出す(そのため文1や2は,何十
回も口に出すことになる).
- 次の日は,ページ3-4に進む.ページ3-4で10文覚えるまで同じこと
の繰り返し.
- 今度はページ1-4に載っている20文を,1,2,...20文まで口に出す.
この場合も(例えば)13文目で詰まったら,一度ページを開いて覚え
た後,再度1文目に戻って文1,2,...と口に出す.
- 上記の要領でページ1-4, 5-8, ...をセットで覚える.
1冊終わったら始めに戻ってもう一度.
1冊につき2周やれば十分です.
英語の小説を読む(TOEIC600-800を目標とする人向け)
興味のある小説や本を1日10ページ程度読みます.
和訳せずにわからない単語は読み取ばす.
同じ(わからない)単語が3回以上出てきたら辞書で調べる.
通勤・通学中に英語を聞きながら読むと効果的です.
私はシャーロックホームズなど推理小説を読みました.
和訳しなくても理解できる人向けです.
- flvファイルから静止画を切り出すには
ffmpegを使えば,コマンドラインでflashビデオから静止画を切り出すことができる.
ただし,出力ファイルを警告なしで上書きするので注意..
fedora 11なら,ffmpegはyumを使ってインストールできる.
方法
"入力.flv"というflashビデオから"出力.jpg"を作成する例. 1分29秒の時点を640x480でjpg化する.
$ ffmpeg -ss 00:01:29 -vframes 1 -i 入力.flv -f image2 -s 640x480 出力.jpg
- 無音のwavファイルを作るには
無音のwavファイルをコマンドラインから作る方法.
長さはmsec単位で指定できる.
ただし,soxはバージョンによって挙動が異なるので注意が必要であり,動作
確認を行った環境ではsox-12.18.1 (vine-4.2)であった.
方法
まず作成したい長さの純音のファイルを作成する.
例えば,以下のようにして,0.5秒の純音(10000Hz)のwavファイルを作成する.
次段階でボリュームを0にするので,音程の高低は関係ない.
$ sox -t nul /dev/null sine.wav synth 0.5 sine 10000
以上により,44.1kHzステレオの純音ファイルが作成された.
次にボリュームを0にする.
$ sox -v 0 sine.wav out.wav
16kHzモノラルの無音ファイルにしたい場合は以下のコマンド.
$ sox -v 0 -r 44100 -c 2 sine.wav -r 16000 -c 1 out.wav
- gnomeでログイン時にメーラ,ブラウザなどを決まった ワークスペースで起動させるには
devil's pieは,メーラなどを常に決まったワーク
スペースで起動させている人に便利なプログラムである.
これを使えば,ログイン時にいつも起動するプログラムを,決まったワークスペー
スにおいて位置・大きさを指定して自動起動させることができ
る.
ただし,devil's pieを常に起動させておくと設定したプログラム
(gnome-terminalとか)が常に決まっ
たワークスペースに配置されてしまうので不便.
自分はログイン時のみdevil's pieを起動させている.
方法
-
インストール
vine linuxならapt-get install devilspieでインストールできる.
-
devil's pieの設定
以下は,thunderbirdとfirefoxとgnome-terminalをワークスペース1,2,3で起
動する場合の設定ファイルの例である.
以下のファイルを~/.devilspie/test.dsという名前で保存する.
;; まず~/.devilspie/を作成する.
;; その中にtest.dsという名前のファイルを作る
(if
(is (application_name) "Thunderbird")
(begin
(set_workspace 1)
(geometry "1326x960+241+120")
)
(if
(is (application_name) "Firefox")
(begin
(set_workspace 2)
(geometry "1707x1103+106+55")
)
(if
(is (window_class) "Gnome-terminal")
(begin
(set_workspace 3)
;; (geometry "1045x1091+6+55")
)
)
)
)
-
ログイン時に自動起動する設定
いろいろ方法はあるが,例えば以下を~/bin/startup.shという名前で保存
して,
デスクトップ->設定->高度な設定->セッション->自動起動するプログラム
に登録すればよい.
以下の例では,ログイン後20秒たったらdevilspieをkillしている.
これで新たに起動するプログラムに関しては,起動したワークスペースで立ち
上がるようになる.
もっとエレガントな方法もあるが,シンプルな解.
#!/bin/bash
# ログイン時に起動するようにしておく
if [ -f /usr/local/bin/devilspie ] ; then
devilspie &
firefox &
thunderbird &
gnome-terminal --geometry=85x48+0+0 &
sleep 20
killall -q devilspie >/dev/null 2>&1
fi
失敗例
test.dsの構文を間違えるとひどい目にあう.
- Vine Linux 4.2でGoogle Desktopを使うには
vineにgoogle desktopをインストールする場合,
/opt/google/desktop/bin/gdlinuxの3行目に export
LD_PRELOAD="/usr/lib/libstdc++.so.6"を書く必要があるが,これだけでは
gdlinuxが起動しなかった.
方法
googleのサイトからrpmをダウンロードする.
$ sudo apt-get install libstdc++34 libstdc++34-devel
$ sudo rpm -Uvh google-desktop-linux-current.rpm
エラーが出る.
$ sudo cp /usr/lib/libstdc++.so.6 /opt/google/desktop/lib/
/opt/google/desktop/bin/gdlinuxの3行目に以下を追加.
export LD_PRELOAD="/usr/lib/libstdc++.so.6"
以下を実行.
gnomeを使っていれば次回からは起動時に実行される.
プロセスの中に,/opt/google/desktop/bin/gdl_fs_crawlerが出現していれば
動いている.
$ /opt/google/desktop/bin/gdlinux
失敗例
synapticを使って,google desktopの関係ファイルを全てアンインストールし
ようとすると,thunderbirdやfirefoxの関係ない拡張機能やテーマが使えなく
なるので注意.
具体的には,拡張機能のリストでgoogle desktopより下にあるものが,「再起
動後に削除されます」状態になる.
ただし,実際には再起動しても削除されず,「再起動後に...」のメッセージ
だけが消えずに残ることになる.
- USBデバイスを特定のデバイスファイルに固定するには
何が問題か?
USBオーディオデバイスやUSBプリンタなどUSBで接続するデバイスは接続時に
/dev以下にデバイスファイルが作られる.
例えばUSBオーディオデバイスなら/dev/audio, /dev/audio1, /dev/audio2,
...などのようなデバイス名が与えられるので,このデバイス名を指定すれば
望みのハードウェアにアクセスできる.(audio以外にもdspやmixerも同じ)
ただし,同種のUSBデバイスが起動時に接続されている場合は,特定のデバイスファ
イル名(/dev/audio1など)が同じハードウェアを指すとは限らない.
一方,プログラムからは常に同じデバイスファイル名でアクセスできると便利
である.
以下にYamaha NX-U10を例として,udevによりデバイスを特定のデバイスファ
イルを固定する方法を説明する.
udevルールの詳細な情報は
ここにある.
udevを用いたデバイスファイルの作り方は,USBデバイス以外にも使える.
方法
Yamaha NX-U10から音を出力させることを考える.
-
まずUSBデバイスを挿してできるファイルを確認する.
USBオーディオなら/sys/class/soundに挿した後に出現したディレクトリを見
付ける.
下の場合ならaudio2, dsp2などができている.
$ ls /sys/class/sound/
audio/ controlC0/ dsp/ mixer/ pcmC0D0c/ pcmC1D0p/ sequencer/
audio1/ controlC1/ dsp1/ mixer1/ pcmC0D0p/ pcmC2D0p/ sequencer2/
audio2/ controlC2/ dsp2/ mixer2/ pcmC1D0c/ seq/ timer/
-
udevinfoを使ってデバイスの情報を集める.
この情報の一部を使ってudevルールを作るが,全部必要な訳ではない.
$ udevinfo -a -p /sys/class/sound/dsp2
looking at device '/class/sound/dsp2':
KERNEL=="dsp2"
SUBSYSTEM=="sound"
DRIVER==""
SYSFS{dev}=="14:35"
looking at parent device '/devices/pci0000:00/0000:00:1d.1/usb4/4-1/4-1:1.0':
ID=="4-1:1.0"
BUS=="usb"
DRIVER=="snd-usb-audio"
SYSFS{modalias}=="usb:v08BBp2704d0100dc00dsc00dp00ic01isc01ip00"
つづく
-
上の情報にマッチするようなudevルールを作る.
/etc/udev/rules.d/10-local.rulesというファイルを作り,以下のような内容
を書く.
このルールは,「KERNEL, SUBSYSTEM, modaliasが指定した値にマッチし
た場合に,/dev/dsp_yamaha_nx_u10というデバイスファイルを作る」ことを表
す.
modaliasにはベンダ情報などが書かれているので,おそらくこれでNX-U10をマッ
チさせられるはず...
# /etc/udev/rules.d/10-local.rules
KERNEL=="dsp*", SUBSYSTEM=="sound", SYSFS{modalias}=="usb:v08BBp2704d0100dc00dsc00dp00ic01isc01ip00", SYMLINK+="dsp_yamaha_nx_u10", GROUP="audio"
-
以下のコマンドで音が出ることを確認.
ただし,sox-12.17.3がインストールされているとする.
他のバージョンのsoxでは再生されない場合がある.
$ sox -V
sox: Version 12.17.3
$ play --device=/dev/dsp_yamaha_nx_u10 音声ファイル
- 音声ファイルのピッチを上げるには
テンポを変えずに音声の高低を変化させる方法(コマンドライン).
方法
soundtouchのページからsoundtouch-1.3.1.tar.gzをダウンロード.
インストールは,解凍したディレクトリで以下のようにする.
$ ./configure;make;make check;sudo make install
ピッチの変換は以下のコマンドでできる.
音声の高低は-pitch=+?の部分で指定する.
$ soundstretch 入力ファイル 出力ファイル -pitch=+10
- Graphics::GnuplotIFモジュールのx-yプロットを少し強化する
GnuplotIF v1.4のgnuplot_plot_xyでは,xに対してy_1, y_2, y_3, ...はプロット
できるが,x_1に対してy_1, x_2に対してy_2というようなプロットができない.
v1.5以降で対応するらしいので,それまでのとりあえずの解決策.
方法
ここからGraphics-GnuplotIF-1.4.tar.gzをダウンロード.
解凍してできたGraphics-GnuplotIF-1.4/lib/Graphics/GnuplotIF.pmを編集し
て以下の関数gnuplot_plot_xysetを追加.
あとは次のコマンドでインストール.
$ cd Graphics-GnuplotIF-1.4;make;sudo make install
# 追加する関数
sub gnuplot_plot_xyset
{
my ($self, @xypairs) = @_;
die if scalar @xypairs % 2 != 0;
my $num_xypairs = (scalar @xypairs) / 2;
my $parnr = 1;
my $cmd = " '-' using 1:2 with $self->{style} title
,\\\n" x $num_xypairs;
$cmd =~ s/,\\\n$//s;
$self->$private_apply_plot_titles(\$cmd); # Honor gnuplot_set_plot_titles
return if $cmd eq q{};
$self->gnuplot_cmd( "plot \\\n$cmd\n" );
foreach my $j ( 0..($num_xypairs-1) ) {
$parnr++;
my $xref = $xypairs[2*$j];
my $yref = $xypairs[2*$j+1];
die "Graphics::GnuplotIF (object $self->{__objectnumber}): gnuplot_plot_xy - "
."$parnr. argument not an array reference\n"
if ref($xref) ne 'ARRAY' || ref($yref) ne 'ARRAY';
# there may be lesser y-values than x-values
my $min = $#{$xref} < $#{$yref} ? $#{$xref} : $#{$yref};
foreach my $i ( 0..$min ) {
$self->gnuplot_cmd( "$xref->[$i] $yref->[$i]" );
}
$self->gnuplot_cmd( 'e' );
}
$self->{__plotnumber}++;
} #-------- end of subroutine gnuplot_plot_xyset ----------
サンプル
#!/usr/bin/perl -w
# tmp2.plという名前で保存して実行権をつける.
# ./tmp2.plで実行.
use strict;
use Graphics::GnuplotIF qw(GnuplotIF);
my @x1 = ( -2, -1.50, -1, -0.50, 0, 0.50, 1, 1.50, 2 ); # 9 points
my @y1 = ( 4, 2.25, 1, 0.25, 0, 0.25, 1, 2.25, 4 ); # function 1
my @x2 = ( -1.1, -0.1, 0.9, 1.9, 2.9); # 5 points
my @y2 = ( 0.1, 0.2, 0.3, 0.4, 0.5); # function 2
my $plot1 = Graphics::GnuplotIF->new( title => "parabola",
style => "points" );
$plot1->gnuplot_plot_xyset( \@x1, \@y1, \@x2, \@y2 );
$plot1->gnuplot_pause( ); # hit RETURN to continue
- Perlスクリプト中からgnuplotを使ってグラフを描くには
Graphics::GnuplotIFモジュールを用いれば,Perlスクリプトから簡単にグラフ作成ができる.
グラフを描くモジュールとしては他にGD::Graphがあるが,論文にのせるよう
なグラフの作成には機能が足りないため,使うのをやめてしまった.
方法
ここからGraphics-GnuplotIF-バージョン.tar.gzをダウンロード
$ tar xvzf Graphics-GnuplotIF-バージョン.tar.gz
$ cd Graphics-GnuplotIF-バージョン
$ perl Makefile.PL;make;make test
$ sudo make install
サンプル
#!/usr/bin/perl -w
# tmp.plという名前で保存して実行権をつける.
# ./tmp.plで実行.
use strict;
use Graphics::GnuplotIF qw(GnuplotIF);
my @x1 = ( -2, -1.50, -1, -0.50, 0, 0.50, 1, 1.50, 2 ); # 9 points
my @y1 = ( 4, 2.25, 1, 0.25, 0, 0.25, 1, 2.25, 4 ); # function 1
my $plot1 = Graphics::GnuplotIF->new( title => "parabola",
style => "points" );
$plot1->gnuplot_plot_xy( \@x1, \@y1 );
$plot1->gnuplot_pause( ); # hit RETURN to continue
同じページにサンプルが置いてある.
補足
論文にのせるようなグラフ描画としては,現在以下のような方法を使っている
(2008年1月).
- 実験データ(形式自由) → 整形(Perl) → 描画用データ(.csv) → グラ
フ描画(gnuplot)
実験データに必要そうな情報をたくさん入れておく.
形式は,自分にとってわかりやすい独自のものや,json, xmlなどで構わな
い.
Perlで解析用の関数などを書いてグラフにのせるデータを取り出してから
gnuplotで描画.
- 実験データ(Matlabが読める形式) → 整形&グラフ描画
(Matlab)
実験データをMatlab用に出力できるようにしておく.
Matlabの組込み関数を使えるので,思考を中断せずにグラフが描ける.
ただし,Matlabでは文字列を扱いにくい...
- 実験データ(.csv) → グラフ描画(gnuplot)
簡単なデータなら最初から.csvで出力させる.
- 実験データ(形式自由) → 整形(cなど) → 描画用データ(.csv) → グ
ラフ描画(gnuplot)
大規模・高速ならこの方法.でもあまり使ってない.
- 実験データ(形式自由) → 整形&グラフ描画(Perl with
Graphics::GnuplotIF)
1.と同じだが,.csvを経由しないので楽.
念のため,出力先を画面と.csvにする.
- emacsでC/C++,Perlの基本インデントを3にするには
インデントが2では詰まりすぎだが,4だと空きすぎに感じる人におすすめ.
方法
Emacsの設定ファイル(~/.emacs.el)に以下を追加する.
;; C/C++のインデント設定
(add-hook 'c++-mode-hook
'(lambda()
(c-set-style "ellemtel") ; 基本インデント量は3
(c-set-offset 'comment-intro 0) ; commentが行頭に来ないように
(c-set-offset 'inclass 3) ;
(c-set-offset 'innamespace 0) ; namepsaceを行頭にする
(c-set-offset 'access-label -3) ; public:を行頭にする
))
(add-hook 'c-mode-hook
'(lambda()
(c-set-style "ellemtel") ; 基本インデント量は3
(c-set-offset 'comment-intro 0) ; commentが行頭に来ないように
))
;; Perlのインデント設定
;; perlの編集をperl-modeではなくcperl-modeで
(defalias 'perl-mode 'cperl-mode)
(add-hook 'cperl-mode-hook
(lambda ()
(cperl-set-style "BSD") ; 基本インデント量は4
(setq cperl-indent-level 3)
))
- perlを使ってpdf文書を編集するには
印刷した論文には,管理番号やメモなどを手書きで書いて本棚にしまうことが
多い.
また,論文の輪読会などでは出典などを書いた論文のコピーを配布してもらう
と後で調べたいときに助かる.
このような場合,電子的にpdfを編集して情報を書き込むには,acrobatを使うの
が最も簡単である.同じことをlinux上で面倒な方法で解決してみる.
方法
PerlのPDF::API2モジュールをインストールする.
詳細な使い方については,perl pdf api2などをクエリとしてgoogleなどで調
べればOK.
$ sudo perl -MCPAN -e shell
> install PDF
> install PDF::API2
サンプル
#!/usr/bin/perl -w
# 同じディレクトリにあるold.pdfに"T03 2007/1/23 HMMに関する論文"という
# ヘッダをつけてnew.pdfとして保存
#
# 使い方: temp.plという名前をつけて保存する.実行権をつけて./temp.plで実行
use strict;
use PDF::API2;
my $pdf = PDF::API2->new;
$pdf = PDF::API2->open('./old.pdf');
my $page = $pdf->openpage(1);
my $gfx = $page->gfx;
my $jfs = $pdf->cjkfont( 'KozGo' );
my $text = "T03 2007/1/23 HMMに関する論文";
$gfx->textlabel(30, 800, $jfs, 20, $text, -color=>'red');
$pdf->saveas("new.pdf");
- makeでTeX文書をコンパイルするには
以下のようなファイル構造になっているとする.
すなわち,main.texがメインの.texファイルで,その中でsection1.texなどをインクルー
ドしている.
これをmakeでコンパイルして,pdfファイルを作成する.
$ ls
Makefile main.tex references.bib section3.tex section6.tex
fig/ mediabb.sty section1.tex section4.tex tieice.bst
ieej.cls references-j.bib section2.tex section5.tex
$ make
方法
以下のファイルを.texファイルがあるディレクトリに置く.
以下のようなコマンドが使える.
- make viewpdf: pdfを作りacroreadで閲覧
- make: pdfを作る
- make ps: psを作る
- make dvi: dviを作る
#
# Makefile for tex 日本語用
#
.SUFFIXES: .tex .dvi .aux .log .toc .lof .lot .pdf .ps .bbl .bib .blg
# コンパイル対象
MAIN = main
TEXFILES = $(shell ls *.tex)
BIBFILES = $(shell ls *.bib)
# -interaction=nonstopmode: platexをサイレントモードで.
TEXOP = platex -interaction=nonstopmode 1>/dev/null
# -terse: jbibtexをサイレントモードで.
BIBTEX = jbibtex -terse
DVIPDF = dvipdfmx
DVIPS = dvips
PDFVIEWER = acroread
# make cleanで消す対象
TRUSH = $(MAIN).dvi $(MAIN).aux $(MAIN).lof $(MAIN).toc $(MAIN).lot $(MAIN).log $(MAIN).pdf $(MAIN).ps $(MAIN).bbl $(MAIN).blg
all: $(MAIN).pdf
pdf: $(MAIN).pdf
dvi: $(MAIN).dvi
bbl: $(MAIN).bbl
ps: $(MAIN).ps
$(MAIN).dvi: $(MAIN).tex $(TEXFILES) $(BIBFILES)
$(MAIN).pdf: $(MAIN).dvi
$(MAIN).ps: $(MAIN).dvi
$(MAIN).bbl: $(BIBFILES) $(TEXFILES)
$(MAIN).aux: $(MAIN).tex
.dvi.ps:
$(DVIPS) $*
.dvi.pdf:
$(DVIPDF) $*
.tex.dvi:
$(TEXOP) $*; $(BIBTEX) $*; $(TEXOP) $*; $(TEXOP) $*
.tex.aux:
$(TEXOP) $*; $(BIBTEX) $*; $(TEXOP) $*
# ユーティリティコマンド群
viewpdf: $(MAIN).pdf
$(PDFVIEWER) $< &
clean:
rm -f *~ $(TRUSH)
Appendix: キーバインドでacroreadが起動するようにする
YaTeXのように,emacsからviewerをキーバインドで起動できると楽.
smart-compileを使っている場合,以下を.emacsに書くと
"Ctrl-C r j"でacroreadが立ち上がるようになる.
(defun preview_mainpdf ()
(interactive)
(shell-command "make viewpdf")
)
(add-hook 'yatex-mode-hook
'(lambda ()
(local-set-key "\C-crj" 'compile)
(local-set-key "\C-crp" 'preview_mainpdf)
(setq compilation-window-height 0)
))
- ifupでzshの補完機能を使うには
bash_completionには,ifupを使うときに/etc/sysconfig/network-scripts/以
下にある"ifcfg-名前"を補完する機能がある.
zshで同じことを実現するテキトーな解決策.
方法
以下のファイルを~/.zsh/functions/Completion/_ifupという名前で保存す
る.
#compdef ifup
local expl list intf sep
local -a disp
case $OSTYPE in
aix*)
intf=( ${(f)"$(lsdev -C -c if -F 'name:description')"} )
if zstyle -T ":completion:${curcontext}" verbose; then
zstyle -s ":completion:${curcontext}:" list-separator sep || sep=--
zformat -a list " $sep " "$intf[@]"
disp=(-ld list)
fi
;;
darwin*|freebsd*) intf=( $(ifconfig -l) ) ;;
irix*) intf=( ${${${(f)"$(/usr/etc/netstat -i)"}%% *}[2,-1]} ) ;;
linux*) intf=( $(ls
/etc/sysconfig/network-scripts/ifcfg-*[a-zA-Z0-9]|sed -n
's/.*ifcfg-\(.*\)/\1/p') ) ;;
*) intf=( $(ifconfig -a|sed -n 's/^\([^ :]*\).*/\1/p') ) ;;
esac
_wanted interfaces expl 'network interface' \
compadd "$@" "$disp[@]" - "${(@)intf%%:*}"
- 間にマシンを経由してssh接続するには
家のコンピュータ(alpha) -> 会社のゲートウェイコンピュータ(beta) ->
社内のコンピュータ(gamma)のような関係になっているとき,alphaから
gammaに接続したいとする.
以下の2つのコマンド中のコンピュータ名を自分のものに書き換えればう
まくいくはずなので,説明などは無視してもよい.
方法
-
まずalphaのポート8022をbeta経由でgammaのポート22につなぐ
$ ssh -L 8022:gamma:22 beta
ユーザ名@beta's password: パスワードを入力
- 別のターミナルでalphaのポート8022にsshするとgammaにつながる
$ ssh -p 8022 localhost
ユーザ名@localhost's password: パスワードを入力
説明
上で用いたポート8022は仮のものなので,他の番号(10022とか)でもよい.
また,gammaのファイルをalphaのカレントディレクトリにコピーしたいときは,
1.の手順の後,以下のコマンドを用いる.
$ scp -P 8022 localhost:ファイル名 ./
ポートフォワーディングに関する他の機能についてはgoogleなどで検索してください.
- pngファイルを手軽に読み書きするには
Cでpngファイルを扱いたいが,libpngの学習コストをかけたくない人におすす
め.
インストール
apt-getなどでlibpngとfreetype2をインストールしておく.
ここから
pngwriter-0.5.3.tgzをダウンロード.
$ tar xzvf pngwriter-0.5.3.tgz
$ cd pngwriter-0.5.3
$ make; sudo make install
サンプル
pngwriter-0.5.3/examples以下にある例を見ればだいたい理解できる.
// test1.cpp : 同じディレクトリにある"img.png"の情報を表示する
// g++ test1.cpp `freetype-configcflags` -I/usr/local/include
-L/usr/local/lib -lpng -lpngwriter -lz -lfreetype
#include
#include
using namespace std;
int main()
{
pngwriter img(1,1,0,"img.png");
img.readfromfile("img.png");
cout << "img.png is "
<< img.getheight() << " pixels high and "
<< img.getwidth() << " pixels wide." << endl;
return 0;
}
pngwriterをWebots 4と共に使う場合
-
以下のような警告が出るので,pngwriterをlibpng10でコンパイルする必要が
ある.
(libpng12にそろえることはできない)
libpng warning: Application was compiled with png.h from libpng-1.2.8
libpng warning: Application is running with png.c from libpng-1.0.18
-
pngwriter-0.5.3/make.includeのCXXFLAGSとLIBSを以下のように変更
#CXXFLAGS= -O3 -Wall -Wno-deprecated $(FT_ARG)
CXXFLAGS= -O3 -Wall -Wno-deprecated $(FT_ARG) `libpng10-configcflags`
INC= -I../src/ -I$(PREFIX)/include/
#LIBS= -L../src -L$(PREFIX)/lib/ -lz -lpng -lpngwriter
LIBS= -L../src -L$(PREFIX)/lib/ -lz -lpng10 -lpngwriter
-
pngwriter-0.5.3/src/pngwriter.hの<png.h>をインクルードしてい
る部分を以下のように変更
//#include <png.h>
#include <libpng10/png.h>
-
コンパイルする際には以下のようなオプションをつける
// g++ test1.cpp `freetype-config --cflags` `libpng10-config --cflags` -I/usr/local/include -L/usr/local/lib -lpng10 -lpngwriter -lz -lfreetype
- 自分の論文作成ツール(2007年7月)
10年前,演習の授業で論文はemacs, tgif, gnuplotで作成することを教わった.
現在までの間に新しいツールがでてきているので,今使用している論文作成ツー
ルをまとめておく.
エディタ + 組版
●emacs + latex
補助的に,以下のものをインストールしておくと手間が省ける.
- ElScreen: タブで編集できるようにする
- smart-compile: キーバインドでtex文書をコンパイルしたり,
pdfを閲覧できるように設定しておく
(makeでTeX文書をコンパイルするには参照)
文献管理
データベースに追加したい文献の.bibは
google
scholar,
Lead2Amazon,
CiNiiなどからとってこれる.
これをBibTeX sourceタブに貼りつければOK.
以下のようなaliasを作ったり,デスクトップアイコンにしておくと楽.
alias jabref='java -jar ~/lib/JabRef-2.2.jar'
図作成
vineならapt-getでインストールできる.
inkscapeの基本の保存形式はsvgだが,tex文書に貼るときはpdfで保存して,
\usepackage{mediabb}を使う.
vine 4.1上のinkscape-0.44.1では,pdf形式でうまく保存できない場合があっ
たので,windows上のinkscape-0.45.1でpdf形式にした後,texに取り込んだ
ところうまくいった.
同じ図を発表のときに使う場合は,gifやjpg形式でエクスポートする.
グラフ作成
●gnuplot + inkscape
通常はこの組合せで使っている.
gnuplotで描いたグラフをeps形式で出力して,inkscapeでコメントなどを
書く.
文書に貼る方法は上と同じ.
●gnuplot + tgif
gnuplotで描いたグラフをtgif形式で出力して,tgifでコメントなどを
書き,epsで出力する.
tgifはtexの数式を貼るときは便利.
pdf作成
●dvipdfmx + Adobe Acrobat
dvipdfmxでdviをpdfに変換し,Acrobat上で「名前を付けて保存」して,ファイルサイズを小さくする.
- json-cで出力されたjsonファイルを見やすくするには
パラメータを変更してプログラムを実行する場合,プログラムを再コンパイル
したり,コマンドオプションで指定することもできるが,設定ファイルを読み
込んで勝手に型を決めてくれたりすると楽.
巨大なプログラムならXMLで設定ファイルを書くのがいいのだろうが
(xmlspyは便利そう),自分が簡単に編集できて機械が可読
な形式であると手間が減る.
JSON
やYAMLなどは,さまざまな言語
用のparserがあるので,これらの形式を使うのがおすすめ.
自分はcのparserをよく使うので,JSONを使っている(parser
はjson-c).
ただし,json-cは出力に改行文字を含まないのでそのままでは見にくい.
方法
以下のようなフィルタを使う.
ただし,perlのJSONモジュールは内部でハッシュに変換しているので,要素が
順番通りに格納されないことがある.
#!/usr/bin/perl -w
# JSONファイルを変換する.
#
# 例: file1を改行ありの読みやすいjsonファイルにする.
# rejson file1
use strict;
use JSON;
use Getopt::Std;
use vars qw($opt_h $opt_f $opt_s);
getopts('hfs');
&main();
sub main
{
if (scalar @ARGV < 1 || defined $opt_h){
&show_help();
exit;
}
foreach(@ARGV){
&convert_json_file($_);
}
}
sub convert_json_file
{
my ($filename) = @_;
open(FILE, "<$filename") or die "cannot open file $filename\n";
my $doc;
while(){
chomp;
$doc .= $_;
}
close FILE;
# my $json = jsonToObj($doc); # jsonオブジェクトに変換
my $json = from_json($doc); # jsonオブジェクトに変換
if(defined $opt_s){ # 改行無し
$doc = to_json($json);
}
else{ # 改行あり
$doc = to_json($json, {pretty => 1, indent => 3});
}
# 書き出し
if(defined $opt_f){ # 標準出力へ
print "$doc\n";
}
else{ # ファイルへ
open(FILE, ">$filename") or die "cannot open file $filename\n";
print FILE "$doc\n";
close FILE;
}
}
sub show_help
{
print <<__EOU__;
NAME
rejson - JSONファイルを読みやすいように変換する.
AUTHOR
Komei Sugiura
使い方
rejson [-hsf] file1 [file2 file3 ..]
オプション
-h: ヘルプを表示する
-f: フィルタモード
-s: 改行無しのファイルに変換する
__EOU__
}
- Sound Blaster Live!を/dev/dspに固定するには
[追記] udevルールを使って解決する方法は
USBデバイスを特定のデバイスファイルに固定するには
を参照.
以下で説明している方法より,udevルールを使った方が一般的.
サウンドカードが2枚以上ある場合,特定のカードに対応するデバイスファイ
ルの番号が,次回起動時にずれていることが有り得る.
つまり,/dev/dspだったのが/dev/dsp1とかになる.
ネットワークカードの場合も,eth0がeth1になるなど同様のことは起こり得る.
以下の方法は,問題を切りわけたりしてないので,どこまで一般的な問題なの
かわからない.
環境は,alsa-lib 1.0.12(Vine 4.1上)とSound Blaster Live! (Creative Technology CT4870 Sound Card),あとオンボードのIntelのサウンドカードがある.
他のケースでも,途中まで同様の問題が起こる場合もあるらしいが.
上記の環境で,他のページで推奨されている方法を使ってみた(rc.localとか,
optionsにsnd_index=0とか)が,効果はなかった.
alsactlがrestoreしてないように見えるが...
方法
/etc/modprobe.confの先頭に以下を書く.
3段落目は自動生成されたもの.
blacklist snd-emu10k1
blacklist snd-hda-intel
alias snd-card-0 snd-emu10k1
alias sound-slot-0 snd-emu10k1
alias snd-card-1 snd-hda-intel
alias sound-slot-1 snd-hda-intel
install snd-emu10k1 /sbin/modprobe --ignore-install snd-emu10k1 &&
/usr/sbin/alsactl restore >/dev/null 2>&1 || :
remove snd-emu10k1 { /usr/sbin/alsactl store >/dev/null 2>&1 || : ; };
/sbin/modprobe -r --ignore-remove snd-emu10k1
install snd-hda-intel /sbin/modprobe --ignore-install snd-hda-intel &&
/usr/sbin/alsactl restore >/dev/null 2>&1 || :
remove snd-hda-intel { /usr/sbin/alsactl store >/dev/null 2>&1 || : ; };
/sbin/modprobe -r --ignore-remove snd-hda-intel
/etc/rc.d/rc.localに以下を追加.
/sbin/modprobe snd-emu10k1 && /usr/sbin/alsactl restore >/dev/null 2>&1
/sbin/modprobe snd-hda-intel && /usr/sbin/alsactl restore >/dev/null 2>&1
~/.bash_profileに以下を追加.
# 気休め
/usr/sbin/alsactl restore >/dev/null 2>&1
# 音量をマニュアルで設定
/usr/bin/amixer set Master 80% unmute >/dev/null 2>&1
/usr/bin/amixer set Headphone 60% unmute >/dev/null 2>&1
/usr/bin/amixer set PCM 85% unmute >/dev/null 2>&1
/usr/bin/amixer set 'PC Speaker' 60% unmute >/dev/null 2>&1
/usr/bin/amixer set Mic 60% cap >/dev/null 2>&1
/usr/bin/amixer set Capture 60% unmute cap >/dev/null 2>&1
- gnome-terminalで複数のタブを開いてコマンドを実行するには
端末を複数起動して,各々でコマンドを打たなくてもいいように,1行のコマ
ンドで「端末の各タブでコマンドを実行する」方法.
方法
例: emacs, w3m, gnuplot, octaveを各タブで開くシェルスクリプト.
#!/bin/bash
command1="emacs -nw"
command2="w3m http://www.yahoo.co.jp/"
command3="gnuplot"
command4="octave"
gnome-terminal --tab -e "bash -c \"$command1;exec bash\"" \
--tab -e "bash -c \"$command2;exec bash\"" \
--tab -e "bash -c \"$command3;exec bash\"" \
--tab -e "bash -c \"$command4;exec bash\""
- Thunderbirdから右クリックで英辞郎を引くには
メールの中の英単語をドラッグし,右クリックのメニューで調べられるようにする.
結果はFirefoxで表示する.Linuxでは1.が必須.
方法
-
~/.thunderbird/ランダム.default/user.jsに以下を追加
user_pref("network.protocol-handler.app.http", "/usr/bin/firefox");
user_pref("network.protocol-handler.app.https", "/usr/bin/firefox");
user_pref("network.protocol-handler.app.ftp", "/usr/bin/firefox");
-
拡張機能の
dictionarysearchをインストール
拡張機能->設定で以下を設定
Text: Search Eijiro for "$"
URL:
Linux用URLまたは
Windows
用URLをコピーして貼る
- Firefox, Thunderbirdでヒラギノフォントを使うには
下記のやり方で他の商用/非商用フォント,TrueTypeフォントなどでも同様に
できる.
ただし,この方法は「ヒラギノフォントを持っている」こと以外にも,いくつ
か前提条件があるので注意.
方法
-
~/.fonts/ディレクトリにヒラギノフォントがあるとする.
$ cd ~/.fonts
$ fc-cache
-
Firefox,Thunderbirdの設定->コンテンツで「規定のフォント」をヒラギノフォントに指定する
-
印刷時にもヒラギノフォントが使われるようにする.
以下をuserChrome.cssに足す.
* {
font-size: 14px !important;
font-family: "Lucida Grande", "ヒラギノ丸ゴ Pro W4", sans-serif
!important;
}
userChrome.cssの場所は以下にある.
- ●firefoxなら ~/.mozilla/firefox/ランダム.default/chrome/
- ●thunderbirdなら ~/.thunderbird/ランダム.default/chrome/
- ●mozillaなら ~/.mozilla/ユーザ名/ランダム.slt/chrome/
- 「いくつかのパネル・アプレットは、もう利用できません」を消すには
aptでvineのアップグレードを行なったら,gnome起動時に以下のよ
うなメッセージがでるようになった.
「いくつかのパネル・アプレットは、もう利用できません....
このメッセージは1回だけ表示されます.」
しかし,起動時に毎回表示されるので困る.
検索したが↓の報告が見付かったのみ.(対策はホーム消去+再コピー)
https://bugs.launchpad.net/ubuntu/+source/gnome-session/+bug/6687
方法
- ~/.gconfと~/.gconfdを削除して再ログイン.
副作用としてgnomeの設定をやり直す必要がある.
(本当はgconf-editorで関係あるところだけを直す方が正しいはず.)
$ mv ~/.gconf ~/.gconfd /tmp/
- dynabook ssシリーズのディスプレイの輝度を調節するには
dynabookにLinuxをインストールしても,ファンクションキーでは
輝度調節ができない.
http://www.ioa.s.u-tokyo.ac.jp/~kmotohara/dynabookss-s5/
によると「Dynabookのファンクションキーは,ビデオ出力制御以外はソフトウェア制御になっている」らしい.
方法
-
fnfxをインストール
http://rpmfind.net/linux/rpm2html/search.php?query=fnfx
からfnfx-0.3-8.fc6.src.rpmをダウンロードしてリビルド
$ rpmbuild --rebuild fnfx-0.3-8.fc6.src.rpm
$ cd (できたrpmの場所)
$ sudo rpm -Uvh fnfx-0.3-8.i386.rpm
-
インストール後,/etc/init.d/に加わるので,起動時に勝手に立ち
上がるようになる.
インストール直後に手動で起動したいときは以下を実行.
$ sudo fnfxd
もちろん輝度以外のファンクションキー割り当ても有効になる.
- Webotsでシミュレーション中にロボットの形態を変えるには
シミュレーション中にロボットの形態を変化させる必要がある場合
には,ODEなどの動力学ライブラリを使用することが多い.
この場合,センサ関係のライブラリや既存のロボットの3次元形態
に関する情報(VRMLなどで書かれている)を,自分で用意する必要が
ある.
一方,汎用ロボットシミュレータWebotsは,デフォルトでは形態を
書き換えることを念頭に置いていない.
以下では,Webotsにおいて形態を書き換える方法(不完全)を説明する.
breveはフォローしてないけど,センサ関係用意してくれたらなぁ.
方法
supervisor_simulation_revert関数を使う.
ただし,パラメータ等を全部保存しても,完全にはシミュレーショ
ンを続行しながら形態を書き換えられる訳ではない.
Simple GAとかと一緒に使ってる分には問題ないけど.
サンプル: センサの数をシミュレーション中に変える
準備中
- National InstrumentsのデータロガーをVine Linux 4.1(kernel 2.6)で使うには
データロガーを使えば,AD変換ボードを作らずにセンサデータを
取得できる.
National Instrumentsのサイトから,RedHat Linux用のドライバ
もダウンロードできるが,kernel 2.6で使うには修正がいるよう
だ.(Fedoraで試した訳ではないが)
方法
-
http://digital.ni.com/worldwide/japan.nsf/main?readform
からダウンロード->ドライバとアップデート->データ収録ドライバを選択.
仮にNI6224を使っているとする.
NI6224のlinux版をクリック->ユーザとパスワードを入力し,
NIDAQ800_RedHat.isoをダウンロード.
-
以下に従い,./INSTALLのところでエラーがでるのを確認する
$ cd /lib/modules/$(kernelver)/source/include/asm/
$ sudo ln -s asm-offsets.h asm_offsets.h
$ sudo mkdir /mnt/tmp
$ sudo mount -t iso9660 -o loop NIDAQ800_RedHat.iso /mnt/tmp
$ cd /mnt/tmp/
$ ./INSTALL
-
$ cp -r /mnt/tmp ~
$ cd ~/tmp
$ chmod 755 .
$ tar xvzf nidaqmx-8.0.0f1.tar.gz
$ cd bin
$ chmod 644 installerUtility.sh
installerUtility.shの125行目がエラーを出しているので,return
$statusFailをコメントアウト
-
$ cd ~/tmp
$ chmod 644 nidaqmx-8.0.0f1.tar.gz
$ tar cvzf nidaqmx-8.0.0f1.tar.gz bin rpms
$ sudo ./INSTALL
yes/noを聞かれてくるが,何も答えずEnterを押せばよい.
(デフォルトの答えが選択される)
rebootはno.
-
/usr/local/natinst/nikal/src/nical.csの2772行目と3536行目をコメントアウト
/* usbDriver->owner = THIS_MODULE; */
/* URB_ASYNC_UNLINK */
- 以下を実行し,rebootでnを選択した後,手動で再起動
$ sudo /usr/local/bin/updateNIDrivers
- 以下で"Dev1"と表示されたらOK
$ /usr/local/bin/nilsdev
サンプル
ドライバ付属のContAcq-InClk.cをコンパイルし,実行するとセンサ値がとれる
- 三菱重工製ロボットアームPA-10をVine Linux 4.1(kernel 2.6)で使うには
三菱重工から配られているLinux用のPA-10ライブラリは,
RedHat Linux 9 (kernel 2.4) 用しかない.
しかも,配られているものはそのままでは動かない...
もしkernel 2.6用のパッチが必要な人がいたら連絡下さい.
方法
$ mv (配られているライブラリ) papatch-2.2.gz $PWD
$ gunzip -c papatch-2.2.gz | patch -p0 -d. -E
$ make clean; make; make install; sudo make insmod
サンプル
一番先端のリンクを動かすサンプルプログラム
// test.c
//
// To compile,
// gcc -O3 test.c -o test ../../lib/libpapci.a -I../../include
#include <stdio.h>
#include <pa.h>
#include <paerr.h>
main()
{
int err;
ANGLE angle;
angle.w1=1.57;
printf("ini %d\n",pa_ini_sys());
printf("opn %d\n",pa_opn_arm(0));
printf("sta %d\n",pa_sta_arm(0));
printf("rst %d\n",pa_rst_ctl(0));
printf("exe_axs%d\n",pa_exe_axs(0,W1,&angle,WM_WAIT));
printf("ext %d\n",pa_ext_arm(0));
printf("cls %d\n",pa_cls_arm(0));
printf("ter %d\n",pa_ter_sys());
}
- BarrettHandをLinuxで使うには
[追記]
linux用には
bhandlib
があり,こちらの方が高機能.
BarrettHand(けっこう古いロボットハンド)のプログラミング用に
は,Windows用APIがあるのみである.
しかし,シリアルのプロトコルの一部がわかっているのでLinuxに移植した.
フィンガーの制御関係のAPIは移植済み.
エラー関係は実装していない.
方法
ここからlinbhand-5.1.tar.gzをダウンロード
$ tar xvzf linbhand-5.1.tar.gz
$ cd linbhand-5.1
$ make clean; make
$ ./realtime
サンプル
シリアルポートが/dev/ttyS1のときの例.
関数の説明はBarrettHandのマニュアルを見てください.
#include
#include "Linbhand.hpp"
using namespace std;
int main()
{
Linbhand lbh("/dev/ttyS1");
lbh.rt_start_all();
int i=0;
while(i<10){
if(i % 2 == 1){
lbh.RTSetVelocity('1', 80);
}
else{
lbh.RTSetVelocity('1', -80);
}
lbh.RTUpdate(1,1);
cout << lbh.RTGetPosition('1') << endl;
printf("%d\n", lbh.RTGetVelocity('1') );
sleep(1);
i++;
}
lbh.RTAbort();
return 0;
}