ROS Indigo + C++11 使用時のPCLのエラー [未解決]
ROS IndigoではPCL1.7が利用されているのですが,C++11のコンパイラ使用時にpcl/filter内の関数を利用しようとしてヘッダをインクルードすると,コンパルは通っても実行時にSegmentation faultで死んでしまいます.
rosrun your_pkg your_node -> segmentation fault (core dumped)
既に数人困っている方がいるようで,下記でディスカッションされていますが,結局のところPCL1.7自体に含まれるバグが原因のようです.
従って,上のサイトに書かれている通り,バグを避ける正当な方法は,PCL1.8を自分でビルドしPCL1.7の代わりとして利用することだと思います.
In the CMakeLists.txt of the latest PCL:
CMakeLists.txt: SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11"
In the CMakeLists.txt of your catkin package:
find_package(PCL 1.7 REQUIRED) -> find_package(PCL 1.8 REQUIRED) (Instead of depending ros_pcl etc...)
この方法,PCLのみを利用した単体のプログラムでは決定的な解決法になると思いますが,ROSを利用している場合,PCL1.8を利用する自作パッケージとPCL1.7を利用しようとする他の(Built-in)パッケージとの間で競合が起こり,ライブラリへのリンクエラーが発生してしまう?ようです.
warning: libpcl_common.so.1.7, needed by /usr/lib/libpcl_kdtree.so, may conflict with libpcl_common.so.1.8
不勉強なため上記の解釈が正しいのか自信がありませんが,試行錯誤してもリンクエラーが解消できないため,現在はお手上げ状態です.
ROS自身がPCL1.8を取り込むのを待つしかないかなぁ。。。
[追記]
どうやらDebugモードでビルドした時のみのエラーのようです.CMAKE_CXX_FLAGS_DEBUG に -O1 オプションをつけることで何故か回避できるとの情報あり.stackoverflow.com
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.cmakeAdd 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の導入を進めましょう.
- Eclipse Downloadsにて"Eclipse IDE for C/C++ Developers"をダウンロード(現行はeclipse-SDK-4.2.1-linux-gtk.tar.gz)
- $ sudo mv eclipse-SDK-4.2.1-linux-gtk.tar.gz /opt/
- $ cd /opt/
- $ sudo tar xzvf eclipse-SDK-4.2.1-linux-gtk.tar.gz
- $ 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に相当)
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] を選択しておいてください.
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やだ。。。