EnsekiTT Blog

EnsekiTTが書くブログです。

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

前回までのえんせき

ORB_SLAM2にターゲットチェンジして、あっさり動いた。次はWebカメラからの入力でORB_SLAM2をやるために、ROSから動かしてみることにした。
ensekitt.hatenablog.com

つまりなにしたの?

Ubuntu16.04上のROS KineticでORB_SLAM2を動かしてiPhoneで撮影した動画を取り込んでみた。
f:id:ensekitt:20170819152346p:plain

ROSで使えるようにする準備

github.com
README.mdの最後の方にROS Examplesがあったのでこれをやってみる。

export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$HOME/orb-slam2_ws/ORB_SLAM2/Examples/ROS
cd ~/orb-slam2_ws/ORB_SLAM2
chmod +x build_ros.sh
./build_ros.sh

cd ~/orb-slam2_ws/ORB_SLAM2/Examples
rosws init . /opt/ros/kinetic   
rosws set ~/orb-slam2_ws/ORB_SLAM2/Examples/ROS -t .  
echo "source ~/dev/orb_slam2_ws/ORB_SLAM2/Examples/setup.bash" >> ~/.bashrc
bash
cd ~/orb-slam2_ws/ORB_SLAM2/Examples/ROS
rosmake ORB_SLAM2

なんかこのへん、本当にこうなんですか?って感じがするのでもっといい方法ないのか模索してるけど、
とりあえずすすめる。

ROSから動画を流して、ORB_SLAM2で自己位置推定させてみる

Terminal1 
roscore

Terminal2
cd ~/orb-slam2_ws/ORB_SLAM2
rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml 

Terminal3
cd ~/orb-slam2_ws/dataset
wget http://vmcremers8.informatik.tu-muenchen.de/lsd/LSD_room.bag.zip
unzip LSD_room.bag.zip
rosbag play LSD_room.bag /image_raw:=/camera/image_raw

iPhoneで撮影した動画をORB_SLAM2に読み込める状態にして自己位置推定してみる

iPhoneで撮影した動画をUbuntuに取り込む(僕はDropboxから放り込みました。

video_stream_opencv

video_stream_opencvで録画済みの動画を扱えるようなので、
video_stream_opencv - ROS Wiki
をインストールする(OpenCVで読み込める画像をROSにストリーミングするもの)

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws
catkin_make_isolated
source devel_isolated/setup.bash
cd ~/catkin_ws/src

git clone https://github.com/ros-drivers/video_stream_opencv.git
rosdep update
rosdep install --from-path ~/dev/catkin_ws/src/video_stream_opencv --ignore-src
cd ~/catkin_ws
catkin_make_isolated
echo "source ~/catkin_ws/devel_isolated/setup.bash" >> ~/.bashrc
bash

Launchファイルを編集して動画を扱えるようにする

.launchファイルを作る。launchファイルっていうのはrosrunで1つ1つ丁寧に引数を指定するのが大変だから一気にいろんなノードを立ち上げるためにあるみたい。
video_stream_opencvは引数は多いし、ビュアーとかも立ちあげなきゃいけないのでlaunchを使っているのかな。

というわけで、
~/catkin_ws/src/video_stream_opencv/launch
にいくつか.launchファイルがあるので、その中からvideo_file.launchをコピーして一部改変する。

cd ~/orb_slam2_ws/dataset/
cp ~/catkin_ws/src/video_stream_opencv/launch/video_file.launch ./
mv video_file.launch my_video_file.launch
nano my_video_file.launch

my_video_file.launchに以下のような内容を記述する
再生したい動画のパスはこちら
/home/myhome/orb_slam2_ws/dataset/IMG_0000.MOV

<launch>
   <!-- launch video stream -->
   <include file="$(find video_stream_opencv)/launch/camera.launch" >
   		<!-- node name and ros graph name ここでカメラの名前を変えておく(ORB_SLAM2側が/camera/image_raw固定っぽいのでvalueをcameraにする-->
	  	<arg name="camera_name" value="camera" />
	  	<!-- full path to the video file ここにiPhoneで撮った動画のパスを入れる(フルパスがいいのかな) -->
	  	<arg name="video_stream_provider" value="/home/myhome/orb_slam2_ws/dataset/IMG_0000.MOV" />
	  	<!-- throttling the querying of frames to -->
	  	<arg name="fps" value="30" />
	  	<!-- setting frame_id -->
	  	<arg name="frame_id" value="videofile_frame" />
	  	<arg name="camera_info_url" value="" />
	  	<!-- flip the image horizontally (mirror it) -->
	  	<arg name="flip_horizontal" value="false" />
	  	<!-- flip the image vertically -->
	  	<arg name="flip_vertical" value="true" />
	  	<!-- visualize on an image_view window the stream generated -->
	  	<arg name="visualize" value="true" />
   </include>
</launch>

僕は、~/orb_slam2_ws/dataset/直下に動画と、さっきのLaunchファイルをおいた。

動画をROSを通じでORB_SLAM2が受け取れるようにする。

Terminal1
roscore

Terminal2
cd ~/orb_slam2_ws/ORB_SLAM2
rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/Monocular/calib.yaml

Terminal3
cd ~/orb_slam2_ws/dataset
roslaunch video_file.launch

youtu.be
できました!!日比谷公園を歩いてみた。
この時のYamlファイルはこちら→
iPhoneでも使えたっぽいORB_SLAM2の設定ファイル · GitHub

iPhoneでもうまく撮れてると使えるので試してみてね)

色々実験してみて、方向転換と逆光がいまいちなことがわかった。
広角とかジンバルに乗せて撮るべきなのかもしれない。
全天球カメラとかジンバルだれかください。

次どうするか

iPhoneに寄り道してしまったので、キャリブレーションもやりやすそうなWebカメラをさっさと試す。

参考

ここまでで使ったROSの使い方

ROSのパッケージの中にはノードがある。

rosrun [package_name] [node_name]

パッケージ[package_name]の中のノード[node_name]を起動する。node_nameのあとに引数をいくつかつけることがある

rosnode list

起動しているnodeプロセスが一覧できる

rosnode info [起動してるnode_name]

[起動してるnode_name]の情報が見られる

rosrun [package_name] [node_name] __name:=my_node

ノード名を/my_nodeとして起動することができる→rosnode listで見るとmy_nodeが出てくる

rosnode ping my_node(:例)

/my_nodeにpingを送って起動中か確認できる

roslaunch [launch file]

launch file にしたがってROSのノードたちを立ち上げる

rosrun rqt_graph rqt_graph 

ノード間の関係性とかをグラフで表示してくれる

sudo apt-get install ros-kinetic-rqt
sudo apt-get install ros-kinetic-rqt-common-plugins

でインストールして使える。

次回

Webカメラから動画を取り込んで動かしてみます
ensekitt.hatenablog.com

Day1はこちら
ensekitt.hatenablog.com