前回までのえんせき
VirtualBox上のUbuntu14.04でうまいことLSD-SLAMが動いた(リソース不足とキャリブレーション不足でまともな動作ではない)
Ubuntu14.04のマシンを持っていない僕は16.04上に環境を作ってみることにした。
ensekitt.hatenablog.com
つまりなにしたの?
Ubuntu16.04上でLSD-SLAMを動かそうとして盛大にハマり大幅な方針転換を行った。
簡単に言うと、LSD-SLAMをUbuntu16.04上で動かすのをやめました。(※解決編の見込みないです。)
悪あがきの軌跡
ROS Kineticの環境構築
ja/kinetic/Installation/Ubuntu - ROS Wiki
こちらを参考に進めていく。方針変更後にも使うのでこれは入れて良かった。
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116 sudo apt-get update sudo apt-get install ros-kinetic-desktop-full
再起動
sudo rosdep init rosdep update echo "source /opt/ros/kinetic/setup.zsh" >> ~/.zshrc source ~/.zshrc sudo apt-get install python-rosinstall
Day-3とほとんど同じ。
LSD_SLAMの環境構築
こちらもDay-3とほとんど同じで、
github.com
を参考に進めていく
cd ~ mkdir rosbuild_ws cd rosbuild_ws rosws init . /opt/ros/kinetic mkdir package_dir rosws set ~/rosbuild_ws/package_dir -t . echo "source ~/rosbuild_ws/setup.bash" >> ~/.bashrc bash cd package_dir sudo apt-get install ros-kinetic-libg2o ros-kinetic-cv-bridge liblapack-dev libblas-dev freeglut3-dev libqglviewer-dev libsuitesparse-dev libx11-dev
kineticに変えただけ。
git clone https://github.com/tum-vision/lsd_slam.git lsd_slam
Day-3と同じ修正を加える(クォートを置き換える)
rosmake lsd_slam
よゆーっしょ(へらへら
ハマり1
/usr/include/QGLViewer/frame.h:188:7: note: initializing argument 1 of ‘void qglviewer::Frame::getPosition(qreal&, qreal&, qreal&) const’
void getPosition(qreal& x, qreal& y, qreal& z) const;
と
/home/myhome/dev/rosbuild_ws/package_dir/lsd_slam/lsd_slam_viewer/src/PointCloudViewer.h:136:26: error: invalid initialization of non-const reference of type ‘qreal& {aka double&}’ from an rvalue of type ‘qreal {aka double}’
frame.getPosition(x,y,z);
などと怒られる。
各軸の座標にfloatを使わなくなったのかな〜qreal(Double)を使えって書いてあるわ。直そ。
./lsd_slam/lsd_slam_viewer/src/PointCLoudViewer.cpp:
326行目の
//from: float x, y, z; //to: qreal x, y, z;
./lsd_slam/lsd_slam_viewer/src/PointCLoudViewer.h:
135行目の
//from: float x, y, z; //to: qreal x, y, z;
にそれぞれ変更した。
調べてみたら同じことをやってる人がいた。
github.com
ハマり2
次は
# warning Detected X11 'Status' macro definition, it can cause build conflicts. Please, include this header before any X11 headers.
って怒られる。
こんどはOpenCVのStatusってマクロがコンフリクトしてるからX11のヘッダーより先に読み込んでくれってことらしい
ソースを見てみると
https://github.com/tum-vision/lsd_slam/blob/master/lsd_slam_viewer/src/KeyFrameDisplay.cpp
OpenGL(X11使ってそうなとこ)よりもあとにOpenCVを読み込んでるみたいなので、
OpenGLよりもあとにOpenCVを読み込んでるみたいなので、
31行目の#include "opencv2/opencv.hpp"
を
26行目に移動して
#include "KeyFrameDisplay.h" #include <stdio.h> #include "settings.h" #include "opencv2/opencv.hpp" #include <GL/glx.h> #include <GL/gl.h> #include <GL/glu.h>
こんな感じにした。
再度
rosmake lsd_slamすると
つらつらとrosmakeのログが流れて、
[ rosmake ] Built 46 packages with 0 failures.
が表示された!これでとりあえずは通るようになった!
Day3と同じように実行してみた(OpenCVのNonFree系は後でやる)
ハマり3
# Terminal1 roscore # Terminal2 rosrun lsd_slam_viewer viewer 中略 *** Error in `/home/ensekitt/dev/rosbuild_ws/package_dir/lsd_slam/lsd_slam_viewer/bin/viewer':│ realloc(): invalid pointer: 0x00007f1954755820 ***
invalid pointer出てしまった。
ぐぐるとQtのバージョン問題があるみたいでQt4のglviewerが必要そう。
sudo apt remove libqglviewer-dev sudo apt install libqglviewer-dev-qt4 cd /usr/lib/x86_64-linux-gnu sudo ln -s libQGLViewer-qt4.so libQGLViewer.so rosmake --pre-clean lsd_slam rosrun lsd_slam_viewer viewer
X Error: BadValue (integer parameter out of range for operation) 2
Extension: 154 (Uknown extension)
Minor opcode: 3 (Unknown request)
Resource id: 0x0
QGLTempContext: Unable to create GL context.
こんなエラーに変わった。
GLがそもそもないってことか?と思って一旦戻して、mesa関連のパッケージを入れ直してみた。
sudo apt remove libqglviewer-dev-qt4 sudo apt install libqglviewer-dev sudo apt install --reinstall libgl1-mesa-glx libgl1-mesa-dri sudo apt autoremove rosmake --pre-clean lsd_slam rosrun lsd_slam_viewer viewer
ダメポ...
(正直invalid pointer出た当たりで薄々、表層的な解決は無理なんじゃないかって気はしていたものの悪あがきを続けてしまっていた。)
バージョンの問題かも…と中国の方のサイトなども「2外中国語で良かったわー!!!」って思いながらグーグル翻訳の力で読み漁り…
sudo apt-get purge --autoremove libqglviewer-dev wget http://libqglviewer.com/src/libQGLViewer-2.6.3.tar.gz tar -zxf libQGLViewer-2.6.3.tar.gz cd libQGLViewer-2.6.3 qmake make sudo make install rosmake --pre-clean lsd_slam rosrun lsd_slam_viewer viewer
なども試して見たが、ダメポ
みぐるしい、いいわけ
どちらかと言うとKinetic上でLSD-SLAMを動かすのがダメだったっぽいので、16.04にindigoを入れたり(できるのか知らない)したらうまくいくのかもしれない。
ただ今回はVisual SLAMができてROSで亀よりリッチなことをするのが目的なので、解決のために深入りしなかったというのが本当のところです。
強いROSエンジニアならできないわけはないと思うのですが、弱い僕がやることではないのでやめたという話です…