EnsekiTT Blog

EnsekiTTが書くブログです。

【7Days自由研究】Visual SLAMとROSを使えるようになる話 Day-3

前回までのえんせき

VirtualBox上のUbuntu14.04でうまいことLSD-SLAMが動いた(リソース不足とキャリブレーション不足でまともな動作ではない)
Ubuntu14.04のマシンを持っていない僕は16.04上に環境を作ってみることにした。
ensekitt.hatenablog.com

つまりなにしたの?

Ubuntu16.04上でLSD-SLAMを動かそうとして盛大にハマり大幅な方針転換を行った。
簡単に言うと、LSD-SLAMをUbuntu16.04上で動かすのをやめました。(※解決編の見込みないです。)
f:id:ensekitt:20170814231350p:plain


悪あがきの軌跡

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
OpenGLX11使ってそうなとこ)よりもあとに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エンジニアならできないわけはないと思うのですが、弱い僕がやることではないのでやめたという話です…

今後の方針

ORB_SLAMにしよっと
github.com


Day1はこちら
ensekitt.hatenablog.com