Goodbye, World

日々のプログラミングで得た経験を個人的な備忘録としてまとめてます.他のブログ・ページを参考させて頂いている部分が多いので,参考ページへのリンクを併記しております.

Eclipse のメモリ設定

Eclipseの初期設定では,起動時・稼働時に割り当てられるメモリ量が小さく,ヘッダやソースファイルの多い大規模なプログラムを読み込むと直ぐにフリーズしてしまいます.Eclipseに割り当てるメモリの設定は,Eclipseのディレクトリ内の"eclipse.ini"に書かれているので,中身を変更して快適に動作させましょう.

[参考サイト]:
eclipseで使用するメモリを増量する。 - 素人のアンドロイドアプリ開発日記
eclipse起動時に設定するメモリ設定 - newta(にゅーた)の日記


変更するのは"-Xms" と "-Xmx" の値です.それぞれEclipseが起動時に確保するメモリ量と,使用する最大メモリ量を表します.
この値,小さすぎるとEclipseがフリーズしやすくなり,大きすぎると起動しなくなるようです.

初期設定では

  • Xms40m
  • Xmx512

となっているので,今回は

  • Xms1024m
  • Xmx1024m

へ変更しました.使用しているPCのスペックに合わせてメモリ量を調整すれば良いと思います.

ROS IndigoでのEigen利用時のエラー

以前ROS Hydroで開発したプログラムをROS Indigoに移行しているのですが,IndigoでEigenを使おうと単純にCMakeLists.txtにfind_package(Eigen REQUIRED)を書くと下記のエラーが.

CMake Error at test_pkg/CMakeLists.txt:23 (FIND_PACKAGE):
By not providing "FindEigen.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "Eigen", but
CMake did not find one.

Could not find a package configuration file provided by "Eigen" with any of
the following names:

EigenConfig.cmake
eigen-config.cmake

Add the installation prefix of "Eigen" to CMAKE_PREFIX_PATH or set
"Eigen_DIR" to a directory containing one of the above files. If "Eigen"
provides a separate development package or SDK, be sure it has been
installed.

どうやらHydroからIndigoに移行する際にFindEigen.cmakeがcatkinにdefaultで含まれなくなったようです.
従って,Hydroで開発されたEigenを利用するプログラムは,そのpackage.xmlとCMakeLists.txtを一部書き換えてあげる必要があります.

現在のROS wikiの記述は間違っているようなので*1,IndigoのMigrationページを参考にpackage.xmlとCMakeLists.txtを修正します.

[参考サイト]
indigo/Migration - ROS Wiki
cmake_modules/README.md at 0.3-devel · ros/cmake_modules · GitHub



package.xml:

<?xml version="1.0"?>
<package>
  <!-- ... -->
  <build_depend>cmake_modules</build_depend>
</package>

CMakeLists.txt:

find_package(catkin REQUIRED COMPONENTS ... cmake_modules ...)
...
find_package(Eigen REQUIRED)


これでEigenのcmakeエラーが消えました.上記の方法に加え,catkin_make eigen indigo - ROS Answers: Open Source Q&A Forumではpackage.xml

<run_depend>cmake_modules</run_depend>

も加えるべきと書かれていますが,私の環境ではなくても動いています.

ROS indigo for Ubuntu 14.04へのOpenCV nonfree moduleの導入

Ubuntu 14.04 用のROS indigoをインストールすると,どうやらOpenCVのnonfree moduleが含まれていないよう.
このことはLSD-SLAMのREADMEにも記述されている.

Note for Ubuntu 14.04: The packaged OpenCV for Ubuntu 14.04 does not include the nonfree module, which is required for openFabMap (which requires SURF features). You need to get a full version of OpenCV with nonfree module, which is easiest by compiling your own version. We suggest to use the 2.4.8 version, to assure compatibility with the current indigo open-cv package.

このままではSURF等の機能が利用できないので,上記のアドバイスに従い手動でOpenCV2.4.8をmakeしてインストールしましょう.

参考サイト:Pepperめも~SLAMに挑戦~ (前編) - Qiita
Installing OpenCV 2.4.9 in Ubuntu 14.04 LTS – Sebastian Montabone
OpenCV Lover: Install OpenCV 2.4.8 on Ubuntu 13.10

続きを読む

ROSのコーディングのためのIDE:Eclipse編

ROSを使ったプログラム開発を行っていますが,やはりIDEによるコードコンプリートやデバッグ機能は必須だと感じます.

そこで今回はIDEの定番Eclipseの導入方法をまとめました.使用した環境はUbuntu 14.04,ROS indigo,対象言語はC++です.

参考サイト:IDEs - ROS Wiki, Installing Eclipse to Ubuntu 13.10, 13.04, 12.04 | The Software Notes


IDEs - ROS Wikiに記載されている方法をなぞりながらEclipseの導入を進めましょう.

  1. Eclipse Downloadsにて"Eclipse IDE for C/C++ Developers"をダウンロード(現行はeclipse-SDK-4.2.1-linux-gtk.tar.gz)
  2. $ sudo mv eclipse-SDK-4.2.1-linux-gtk.tar.gz /opt/
  3. $ cd /opt/
  4. $ sudo tar xzvf eclipse-SDK-4.2.1-linux-gtk.tar.gz
  5. $ sudo gedit /usr/share/applications/eclipse.desktop で下記を入力
[Desktop Entry]
Name=Eclipse
Type=Application
Exec=/opt/eclipse/eclipse ####要変更:後述####
Terminal=false
Icon=/opt/eclipse/icon.xpm
Comment=Integrated Development Environment
NoDisplay=false
Categories=Development;IDE
Name[en]=eclipse.desktop
Exec=env UBUNTU_MENUPROXY=0 /opt/eclipse/eclipse ####要変更:後述####

最後に /usr/share/applications/eclipse.desktopを左のDASH BARにドラッグアンドドロップしてショートカットを登録しましょう.

基本的なEclipseの導入は以上です.
しかしこちらのPC環境では下記のようなエラーが出ました.

A Java Runtime Environment (JRE) or Java Development Kit (JDK) must be available in order to run Eclipse.
No Java virtual machine was found after searching the following locations: /opt/eclipse/jre/bin/java
java in your current PATH

どうやらJava関連のファイルが不足しているとのことなので,次のコマンドで関連ファイルをインストールするとエラーが消えました.

$ sudo apt-get install default-jre


また,現状ではROS関連のインクルードファイル・ライブラリへのパスが通っていませんので,eclipse.desktopの4行目と11行目を一部書き換えます.

Exec=bash -i -c "/opt/eclipse/eclipse"
Exec=env UBUNTU_MENUPROXY=0 bash -i -c "/opt/eclipse/eclipse"


最後に,catkin_wsの各パッケージのEclipse projectファイルを生成します.

$ catkin_make --force-cmake -G"Eclipse CDT4 - Unix Makefiles"
$ awk -f $(rospack find mk)/eclipse.awk build/.project > build/.project_with_env && mv build/.project_with_env build/.project


あとは,Eclipseメニューの File -> Import... -> C/C++ -> Existing Code as Makefile Project で catkin_ws/build を選択すれば,[Source directory]@buildプロジェクトに各パッケージのファイルが現れます.
個別に読み込みたい場合は,Import対象をcatkin_ws/src/packageとすればいいです.


Eclipseプロジェクトを読み込んだだけでは未定義等のエラーがたくさん出ていると思いますので,iostream等の基本的なインクルードファイルへのパスを通すため,buildプロジェクトを右クリックして,
properties -> C/C++ general -> Preprocessor Include Paths, Macros etc. -> Tab:Providers -> CDT GCC Built-in Compiler Settings [Shared]
properties -> C/C++ general -> Code Analysis -> Use project settings
を選択しておいてください.


インストール終了後は,Eclipseに割くメモリの設定も忘れずに.
coffeegkgk.hatenablog.com



追記:
新しいプロジェクトをcatkin_wsに追加する度にEclipse projectファイルを生成する必要がありますが,コマンドを覚えるのは面倒なので,下記aliasを.bashrcに登録しておきましょう!
これで catkin_eclipse と打つだけで catkin_make と Eclipseファイルの生成を同時に行ってくれます.

alias catkin_eclipse='cd ~/catkin_ws && catkin_make --force-cmake -G"Eclipse CDT4 - Unix Makefiles" && awk -f $(rospack find mk)/eclipse.awk build/.project > build/.project_with_env && mv build/.project_with_env build/.project'

Eclipseでのインクルードファイルやライブラリファイルパスの設定方法

Eclipse上でBuildするには,使用する外部ファイル(includeやlibraryファイル)へのパスを通してあげる必要があります.
基礎的な内容ですが,Eclipse特有なところもあるので備忘録としてまとめておきます.

参考サイト:Eclipseで自動Makeするときのincludeや外部ライブラリの設定 - HongoWiki

includeパスの設定(gccの-Iに相当)

C/C++ General -> Paths and Symbols -> Tab:Include -> Languages:GNU C++(もしくはAll languagesを選択) -> Addで対象のファイルパスを入力.

ライブラリパスの設定(gccの-Lに相当)

GCC General -> Paths and Symbols -> Tab:Library Path ->Addで対象のファイルパスを入力.

ライブラリの設定(gccの-lに相当)

C/C++ Build -> Settings -> Tab:Tools Settings -> C++ LinkerからLibrariesを選択 -> Libraries(-l)から対象のライブラリを追加.*1


ちなみに,iostream等の基本的なインクルードファイルへのパスを通すには,対象のプロジェクトを右クリックして,
properties -> C/C++ general -> Preprocessor Include Paths, Macros etc. -> Tab:Providers -> CDT GCC Built-in Compiler Settings [Shared] を選択しておいてください.

*1:gccの-lでの指定と同様に,接頭辞と拡張子を外す必要あり.例:libopenxxx.o -> openxxx

glReadPixelsによるalpha channelを含んだ画像保存

OpenGLレンダリングした3次元モデルを仮想視点からキャプチャする際にハマったのでメモ.

glReadPixelsを用いてキャプチャを行う場合,まずピクセルの格納情報を宣言しておく必要がある.

glPixelStorei (GL_PACK_ALIGNMENT, 4);

 

ここで,第1引数は保存に用いる命令に依って要選択 GL_PACK_ALIGNMENT or GL_UNPACK_ALIGNMENT

第2引数は保存対象のチャンネル数に応じた値を与える.

 

今回は"glReadPixels"を用いて"4 channel"の画像を保存するので上記の命令になる.

(実際には第2引数は2の累乗しか許されないので,標準的なBGR画像を作成する際でも切り捨ての"1"を与える.気持ち悪いですね。。。)

 

その後,画像用の適当な入れ物(ここではcv::Mat)を用意して下記の命令により保存完了!

glReadPixels(0, 0, width, height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, cvMat);

 

 

。。。と思ったんですが,何故かalpha channelが常に255になっている.

レンダリング自体は上手くいっているのに,保存の際にのみ正しい値が反映されず.

原因不明過ぎて死にたくなりましたが,色々探っていると,原因はglutInitDisplayModeにあることが判明.

glutInitDisplayMode(... GL_RGBA ...)  ->  glutInitDisplayMode(... GL_ALPHA ...) 

 

で一応解決.どうやらGL_RGBA と GL_RGB は内部的に定義が同じなようで.

もうOpenGLやだ。。。

 

Eigenの導入

通常はOpenCV内のクラス・関数を利用していますが,今回3次元空間でのベクトル・行列計算が必要になったので使い勝手の良さそうなEigenを導入しました.

 

1. http://eigen.tuxfamily.org/index.php?title=Main_Page からEigenのファイルをダウンロード(今回はEigen 3.2.2を利用)

2. 解凍して C:\Eigen3.2.2 に格納

3. ソースコード内で以下のヘッダをインクルード(とりあえず)

    #include <C:\Eigen3.2.2\Eigen\Core>

    #include <C:\Eigen3.2.2\Eigen\Eigen>

    #include <C:\Eigen3.2.2\Eigen\Dense>

 

お手軽ですね.(使い方はこれから要勉強ですが。。。)