読者です 読者をやめる 読者になる 読者になる

AKHrobotics

tips for robotics

ubuntuにrt-preemptカーネルを導入する

基本的に以下のサイトを参考にして導入した.
RT PREEMPT HOWTO - RTwiki

環境

$lsb_release -r
Release 14.04

$uname -r
3.13.0-66-generic

$cat /proc/cpuinfo | grep "model name"
model name : Intel(R) Core(TM) i3-4170 CPU @ 3.70GHz

パッチを当てる

$ zcat ../patches-3.12.66-rt88.patch.gz | patch -p1

エラーが出ず "patching..." のように表示されればOK.

カーネルのconfigure

$ make menuconfig

RT PREEMPT HOWTOのページには,

・enable CONFIG_PREEMPT_RT
・activated the High-Resolution-Timer Option
・disabled all Power Management Options like ACPI or APM (Since rt patch 2.6.18-rt6 you will probably have to activate ACPI option to activate high resolution timer.)

と書かれているので, 以下のように設定.

Kernel Features
---> Preemption Model (Fully Preemptible Kernel (RT))
---> [*] Fully Preemptible Kernel (RT)

General setup
---> Timers subsystem
---> [*] High Resolution Timer Support **デフォルトでチェック済み

Power management and ACPI options
---> [*] ACPI (Advanced Configuration and Power Interface) Support **>2.6.18の場合はチェック

Kernel hacking
---> Memory Debugging
---> [ ] Check for stack overflows #Already deselected - do not select

あとは, RTAIでの設定についても反映. これは要るかどうかわかりません.
RTAI installation for ubuntu 14.04 · GitHub

Processor type and features
---> Processor family = Select yours **Generic-x86-64に設定

---> Maximum number of CPUs (NR_CPUS) = Set your number **4に設定

---> [ ] SMT (Hyperthreading) scheduler support = DISABLE IT **チェックを外す

ビルド

$ sudo make
$ sudo make modules_install
$ sudo make install
$ sudo grub-update
$ sudo reboot

3.12.66-rt88がgrubの画面に出ていればOK.

結果

アナログ出力波形をオシロで確認しましたが, low-latencyカーネルと比較してlatencyが低減できています.
RTAIやRT-Linuxよりは導入が簡単で, low-latencyカーネルより精度が高いのでオススメです.
(rtカーネルとrt-preemptカーネルの比較はできていません)

FTDI USBドライバを利用したLinuxでのシリアル通信メモ

Linuxでシリアル通信のプログラムを作成する際のメモ.
PythonのpySerialライブラリや, QtのQtSerialPortクラス, ROSではrosserialがあるので需要は少ないかもしれないが, C/C++FTDIを利用してシリアル通信する必要があったのでメモを残しておく.

C/C++でのシリアル通信プログラミング

最近のLinuxディストリビューションでは, シリアル通信のためのドライバFTDIがデフォルトで組み込まれており利用が可能である.
FTDIを利用したC/C++用の解説サイトとして下記のサイトが非常に分かりやすい.
xanthium.in

また, サンプルコードがGitHubで公開されている.
github.com

ボーレートのカスタム設定

通常のFTDI用APIでは, ボーレートの設定に不都合があるらしい.
例えば307.2kbpsのボーレートに設定しようとするとコンパイルの段階でエラーとなる.
その点に関して下記のサイトで議論されており, また解決策も提示されている.
stackoverflow.com

対策用のソースコードココ.

サンプルコード

以上のコードを参考にしてゴテゴテくっつけただけのプログラムは以下の通りです.
ポートを開いて書き込んで読むだけです.
github.com

参考

qpOASESメモ

二次計画問題を解くためのライブラリ.
https://projects.coin-or.org/qpOASES

  • インストール

https://projects.coin-or.org/qpOASES/wiki/QpoasesInstallation

インストールから使用までの手引きは以下のpdfファイルに記載してある.
http://www.coin-or.org/qpOASES/doc/3.2/manual.pdf

zipファイルをDLして,

$ zip qpOASES-3.2.0.zip
$ cd qpOASES-3.2.0
$ vim make.mk

使用するOSに準じて変更する↓(Macを使用する例)
#include ${TOP}/make_linux.mk
#include ${TOP}/make_cygwin.mk
#include ${TOP}/make_windows.mk
include ${TOP}/make_osx.mk

次に, 対応するmkファイルを編集する.
$ vim make_osx.mk

例えば, XcodeMatlabのパスを自分の環境に合わせて変更する必要がある.

################################################################################
# user configuration

# include directories, relative
IDIR =   ${TOP}/include
SRCDIR = ${TOP}/src
BINDIR = ${TOP}/bin

# MacOSX SDK
SYSROOT = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/<b>MacOSX10.11</b>.sdk
SDK = -isysroot ${SYSROOT} -stdlib=libc++

# Matlab include directory (ADAPT TO YOUR LOCAL SETTINGS!)
MATLAB_IDIR   = /Applications/<b>MATLAB_R2015b.app</b>/extern/include/
MATLAB_LIBDIR =

最後に,

$ make

これでOK.

自分で使用するプロジェクト内で使用するために, 手動でincludeファイルとlinkファイルを以下のようにコピーした.

$ sudo cp ./include/* /usr/local/include
$ sudo cp ./bin/libqpOASES.* /usr/local/lib

  • 実行例

以下の2次計画問題を解く.
http://cvxopt.org/_images/math/7f776871eb1407c7fecdb53e4be9fc3e3826668e.png
Solving a quadratic program — CVXOPT
問題はcvxoptのドキュメントから拝借しました.
解は, (x1, x2)=(0.25, 0.75)です.

コードは以下の通りです.
github.com

#include <qpOASES.hpp>

int main( )
{
    USING_NAMESPACE_QPOASES

    /* Setup data of QP. */
    real_t H[2*2] = { 4.0, 1.0, 1.0, 2.0 };
    real_t A[2*1] = { 1.0, 1.0 };
    real_t g[2] = { 1.0, 1.0 };
    real_t lb[2] = { 0.0, 0.0 };
    real_t ub[2] = { 10000.0, 10000.0 };
    real_t lbA[1] = { 1.0 }; // lbAとubAを等しくすることで等式制約として設定可能
    real_t ubA[1] = { 1.0 };

    /* Setting up QProblem object. */
    QProblem example( 2,1 );

    Options options;
    example.setOptions( options );

    /* Solve first QP. */
    int_t nWSR = 10;
    example.init( H,g,A,lb,ub,lbA,ubA, nWSR );

    /* Get and print solution of first QP. */
    real_t xOpt[2];
    real_t yOpt[2+1];
    example.getPrimalSolution( xOpt );
    example.getDualSolution( yOpt );
    printf( "\nxOpt = [ %e, %e ];  yOpt = [ %e, %e, %e ];  objVal = %e\n\n",
            xOpt[0],xOpt[1],yOpt[0],yOpt[1],yOpt[2],example.getObjVal() );

    example.printOptions();
    example.printProperties();

    return 0;
}

Makefileの中で以下のようにリンクすればOK.

CPP = clang++
CFRAGS = -stdlib=libstdc++ -O3 -Wall -lm -g
QPOASES_INCLUDE_DIR = -I/usr/local/include/
QPOASES_LIB_DIR = -L/usr/local/lib -lqpOASES

OBJS_MAIN = main.o

main : $(OBJS_MAIN)
	$(CPP) -o main $(CFLAGS) $(QPOASES_INCLUDE_DIR) $(QPOASES_LIB_DIR) $(OBJS_MAIN)

# main program
main.o: main.cpp
		$(CPP) -c $(CFLAGS) $(QPOASES_INCLUDE_DIR) $(QPOASES_LIB_DIR) main.cpp


ODEで弾性関節を作成する

(過去ブログの転載)

最近ODEでロボットを作成しては制御する, という作業を繰り返しています. 今回は, RHexライク(とい
うかそのもの)をつくってみました.

youtu.be

脚部が弾性のある素材で構成されていますので, ODEのBoxを弾性関節でつないで実現します.

下記サイトでは, 関節に弾性を持たせて連結し, 蛇ロボットを実現しています.

ODEのジョイントで角度ばねを実現する
http://ktaobo.blogspot.jp/2013/05/ode-damper-spring.html

作成した結果, 上記の画像のようになりました.

各脚は9個のBoxで構成しています.

Base Bodyと連結するjointだけ通常のHingeJointとし, それ以外のJointには上記サイトの例のよう

に弾性と粘性を設定して, 駆動範囲を制限しています.

jointの設定部のコードは以下の通りです.

dReal angle1 = 0.0;
dReal h = dt;  // タイムステップ
dReal kp = 40;  // バネ係数
dReal kd = 1.0;  // ダンパー係数
dReal erp = h * kp / (h * kp + kd);
dReal cfm = 1.0 / (h * kp + kd);
for(int i = 0; i < 9; i++){
    joint[i] = dJointCreateHinge(world, 0); // ヒンジ関節生成
    if(i == 0){
        dJointAttach(joint[i], base_robot[0].body, link_robot[i].body); // 関節の取付け
        dJointSetHingeAnchor(joint[i], anchor_x[i], anchor_y[i], anchor_z[i]); //関節中心の設定
        dJointSetHingeAxis(joint[i], 0, 1, 0); // 関節回転軸の設定
    }
    else{
        dJointAttach(joint[i], link_robot[i-1].body, link_robot[i].body); // 関節の取付け
        dJointSetHingeAnchor(joint[i], anchor_x[i], anchor_y[i], anchor_z[i]); //関節中心の設定
        dJointSetHingeAxis(joint[i], 0, 1, 0); // 関節回転軸の設定
        dJointSetHingeParam(joint[i], dParamLoStop, angle1);
        dJointSetHingeParam(joint[i], dParamHiStop, angle1);
        dJointSetHingeParam(joint[i], dParamStopERP, erp);
        dJointSetHingeParam(joint[i], dParamStopCFM, cfm);
    }
}

制御に関しては, 根元の関節の回転を制御するだけなので非常に簡単です.

今回は難しく考えず, 支持脚・遊脚の位相をπだけずらして回転させるようにしました.

動画は以下の通りです.

vimeo.com

CMakeメモ

!昔のブログからの加筆転載

ROSを触っていて, CMakeで躓いている自分がいたので, まずCMakeを勉強することにした.

Learning CMake
http://www.wakayama-u.ac.jp/~chen/cmake/cmake.html

を参考にして一通り勉強した.
OpenGL, Qt, OpenCVとリンクしてビルドする例が載っているので, 理解を深めることができた.
ここでは, CMakeListsの書き方についてまとめておく.

CMakeListsの書き方まとめ

パスを指定して書く

  • ソースファイル

add_executable
add_executable(myapp src1.cpp src2.cpp)

ソースファイルは変数に一度に入れておく.

  • インクルードパス

include_directories
include_directories(/path/to/include)

CMakeLists.txt中のどこに置いても有効。

  • ライブラリパス

link_directories
link_directories(/path/to/lib)

それ以降に作成されたターゲットに対してのみ有効.

  • オプションの指定

set(CMAKE_CXX_COMPILER "/usr/bin/clang++") # C++コンパイラ指定
set(CMAKE_CXX_FLAGS "-Wall -std=c++HOGE") # コンパイルオプションの指定
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -ggdb") # デバッグモードのオプション
set(CMAKE_CXX_FLAGS_RELEASE "-O3") # リリースモードのオプション

  • ライブラリ

target_link_libraries
target_link_libraries(myapp foo)

ターゲット作成後でないと指定できない.
呼ぶ順番はとりあえず以下のようにしておけばよい.

cmake_minimum_required(VERSION 2.8)
add_definitions(-Dhoge -Dhogege)
include_directories(/path1/to/include /path2/to/include)
link_directories(/path1/to/lib /path2/to/lib)

set(CMAKE_CXX_FLAGS "-g -Wall -O3 -std=c++HOGE") # コンパイルオプションの指定
#デバッグ/リリース区別して書きたい場合は下記の通り
#set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -ggdb") # デバッグモードのオプション
#set(CMAKE_CXX_FLAGS_RELEASE "-O3") # リリースモードのオプション

add_executable(myapp main.cpp sub1.cpp)
target_link_libraries(hoge hogege)

また、include_directories、link_directories、target_link_librariesは複数回使って追加することができる.
target_link_libraries()は, -lmや-lglutなどの-l(hoge)の(hoge)の部分を入れる.
add_definitionsには-Dhogeをそのまま入れる.

find_packageを使う

find_package(HOGE REQUIRED)

という記述を使えば, ライブラリへのリンクやインクルードパスの追加が楽になる.

/usr/share/cmake-2.8/Modules の中身を見てfind_packageで探せるライブラリを確認して見ると,

$ls /usr/share/cmake-2.8/Modules | less

FindALSA.cmake
FindASPELL.cmake
FindAVIFile.cmake
FindArmadillo.cmake
FindBISON.cmake
FindBLAS.cmake
FindBZip2.cmake
FindBoost.cmake
FindBullet.cmake
FindCABLE.cmake
FindCUDA
FindCUDA.cmake
FindCURL.cmake
FindCVS.cmake
FindCoin3D.cmake

...

色々出てきた.

冒頭の参考サイトの例題prog6のCMakeListsを引用すると下記の通り.

cmake_minimum_required (VERSION 2.6)

project(prog6)

find_package(GLUT)
find_package(OpenGL)

set(CMAKE_CXX_FLAGS "-g -Wall")

add_executable(prog6 prog6.cc)
target_link_libraries(prog6 ${GLUT_LIBRARY} ${OPENGL_LIBRARY} m)

find_packageを使えば, 陽にパスを指定せず, インクルードディレクトリの指定も不要になるっぽいです.

コンパイル

cmake ./
#デバッグ/リリース区別する場合は下記の通り
cmake -DCMAKE_BUILD_TYPE=Debug ./ # デバッグモードのコンパイルオプションつかいたいときはこっち
cmake -DCMAKE_BUILD_TYPE=Release ./ # リリースモード
make

以上.

google chromeのブックマークをevernoteに移す手順

evernoteを使いながらも, google chromeのブックマークも使うという状況が続いていたので, ココを参考に全部evernoteに移植した.
chromeからexportしたhtmlをevernoteでimportできる形式に変換してくれるコードが公開されており, そのまま利用すれば良い.

手順は以下の4つだけ.

1. chromeのブックマークマネージャを開き, 「管理」をクリックして, 「HTMLファイルにブックマークをエクスポート」をクリック
2-3. ココを開いて, 下記の手順の処理を行う

f:id:szmlb:20160111204550p:plain

4. evernoteを開いて, 「ファイル」-> 「ノートをインポート」で, 作成した.enexファイルを読み込む

以上で完了.
2800くらいノートが増えた.

論文の整理の仕方について

読んだ論文の数が多くなってくると, フォルダ分けでの管理が非常に効率が悪い. そこで, mendeleyを導入したので, 覚書を残しておく.

データはDropboxで保存

データはDropbox上で保存し, クラウド上で同期できるようにする.
例えば, 保存フォルダを Dropbox/mendeley として作成しておく.
このフォルダは, 後のFile Organizerで指定するフォルダとする.

pdfファイルは, ファイル名を year_conference name_title のような規則に従って, 任意のフォルダに保存しておく.
ex. 2011_ICRA_szmlb_wheeled-mobile-robots.pdf
結局, mendeleyで取り込めば情報は抽出されるので, もう少し抽象度が高い名前でもいいかもしれない.

保存したフォルダは, 後のWatched Folderで指定する.
フォルダの階層分けは行わず, 1つのフォルダにpdfファイルをぶち込む形の方がいいと思われる.
そのあたりの自動分類はmendelayがやってくれるので.

mendeleyで管理

mendeleyを使えば, 発行年や論文誌名, タイトル, 著者情報を自動で抽出してくれる.
mendeleyのwatch folder機能を使って, Dropbox上のフォルダを設定し, 自動でmendeley上に情報が抽出されるようにする.

  • 同期の解除

mendeleyの設定として, クラウド上にpdfが同期されないように設定しておく.
All Documents上で右クリックして, Edit settingsを開き, Syncronize attached filesのチェックを外す.
自分の場合は, My Publicationフォルダのみ選択的に同期することにした.

f:id:szmlb:20160101130247p:plain

  • File Organizerの設定

File Organizerの機能を使えば, mendeley上で登録したpdfファイルから, 任意のフォルダにファイルをコピーしてくれる.
Preference->File Organizerから, 下記のように設定した. (conference paperがjournalの情報が抜けがちだったので, 後でyear-authorの順でフォルダ分けするように変更した)

f:id:szmlb:20160101134614p:plain

  • Watched Folderの設定

最後に, mendeley上で自動的にpdfファイルを登録するフォルダを設定する.
Preference-> Watched Folder で, 登録したいフォルダを設定する.
外付けHDD上のフォルダを指定したかったのだが, 選択肢に現れないので, 仕方なくローカル上にフォルダを作成してコピーした.

結果

f:id:szmlb:20160102112400p:plain

かなり便利だなという印象.
検索をかければ本文検索もかかるので, 論文へのアクセスがかなり効率化されそう.

日本語の昔の論文は, pdfに情報が埋め込まれていないので, 自分で入れる必要がある. これは仕方ない.
英語の文献に関しては, 著者情報や雑誌名が抜けるものは少なからずある.
必要な時に検索して修正を加えていけばまとまっていくと思う.