覚え書きブログ

usb_camノードのインストール

ROSのusb_camノードをインストールしてみた。

> cd ~/catkin_work/src
> git clone https://github.com/bosch-ros-pkg/usb_cam.git
> cd ..
> catkin_make
...
Linking CXX executable /home/hachiya/catkin_ws/devel/lib/usb_cam/usb_cam_node
/home/hachiya/catkin_ws/devel/lib/libusb_cam.so: `av_frame_alloc' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
make[2]: *** [/home/hachiya/catkin_ws/devel/lib/usb_cam/usb_cam_node] エラー 1
make[1]: *** [usb_cam/CMakeFiles/usb_cam_node.dir/all] エラー 2
make: *** [all] エラー 2

リンクのエラーが出たので、以下を参考にusb_cam/CMakeLists.txtに以下を追加して、リンクしているavcodecのバージョンを確認する。
http://answers.ros.org/question/198018/pkg_check_modules-doesnt-get-the-right-libavcodec/

> vi src/usb_cam/CMakeLists.txt
MESSAGE(STATUS "@@@@@@@@@@@@@@@@@ " ${avcodec_LIBRARIES})
MESSAGE(STATUS "@@@@@@@@@@@@@@@@@ " ${avcodec_LIBRARY_DIRS})
MESSAGE(STATUS "@@@@@@@@@@@@@@@@@ " ${avcodec_LDFLAGS})
MESSAGE(STATUS "@@@@@@@@@@@@@@@@@ " ${avcodec_INCLUDE_DIRS})
MESSAGE(STATUS "@@@@@@@@@@@@@@@@@ " ${avcodec_CFLAGS})
MESSAGE(STATUS "@@@@@@@@@@@@@@@@@ " ${avcodec_VERSION})
MESSAGE(STATUS "@@@@@@@@@@@@@@@@@ " ${avcodec_PREFIX})
MESSAGE(STATUS "@@@@@@@@@@@@@@@@@ " ${avcodec_INCLUDEDIR})
MESSAGE(STATUS "@@@@@@@@@@@@@@@@@ " ${avcodec_LIBDIR})
> catkin_make
...
-- ==> add_subdirectory(usb_cam)
-- @@@@@@@@@@@@@@@@@ avcodec
-- @@@@@@@@@@@@@@@@@ /usr/local/lib
-- @@@@@@@@@@@@@@@@@ -L/usr/local/lib-lavcodec
-- @@@@@@@@@@@@@@@@@ /usr/local/include
-- @@@@@@@@@@@@@@@@@ -I/usr/local/include
-- @@@@@@@@@@@@@@@@@ 56.41.100
-- @@@@@@@@@@@@@@@@@ /usr/local
-- @@@@@@@@@@@@@@@@@ /usr/local/include
-- @@@@@@@@@@@@@@@@@ /usr/local/lib
...

バージョン56.41.100で問題ないと思うが、とりあえず、バージョン57にリンクするように以下をusb_cam/CMakeLists.txtに追加する。
set(avcodec_LIBRARIES /usr/local/lib/libavcodec.so.57)を追加する。

> vi src/usb_cam/CMakeLists.txt
...
find_package(PkgConfig REQUIRED)
pkg_check_modules(avcodec libavcodec REQUIRED)
pkg_check_modules(swscale libswscale REQUIRED) 

set(avcodec_LIBRARIES /usr/local/lib/libavcodec.so.57)
...
> catkin_make
...
[ 80%] Built target usb_cam
Linking CXX executable /home/hachiya/catkin_ws/devel/lib/usb_cam/usb_cam_node
[100%] Built target usb_cam_node

これで、エラーがでずにmakeが完了した。

次に、roscoreを立ち上げてから、rosrunでusb_cam_nodeを実行してみる。

> roscore
> rosparam set /usb_cam/pixel_format yuyv
> rosrun usb_cam usb_cam_node
> rostopic list
/rosout
/rosout_agg
/usb_cam/camera_info
/usb_cam/image_raw
/usb_cam/image_raw/compressed
/usb_cam/image_raw/compressed/parameter_descriptions
/usb_cam/image_raw/compressed/parameter_updates
/usb_cam/image_raw/compressedDepth
/usb_cam/image_raw/compressedDepth/parameter_descriptions
/usb_cam/image_raw/compressedDepth/parameter_updates
/usb_cam/image_raw/theora
/usb_cam/image_raw/theora/parameter_descriptions
/usb_cam/image_raw/theora/parameter_updates

次に、rvizを起動し、「Add」をクリックし、「By Topic」から「Image Raw」を選択する。

> rosrun rviz rviz

f:id:hirotaka_hachiya:20170713120945p:plain

catkin_makeのエラー

cv_bridgeを用いたプロジェクトを、cakin_makeしようとしたところ、以下のようなopencv2.4.8のライブラリへのリンクエラーがでた。

>cakin_make
...
make[2]: *** No rule to make target /usr/lib/x86_64-linux-gnu/libopencv_videostab.so.2.4.8', needed by/home/sanghoon/catkin_ws/devel/lib/dpptam/dpptam'. Stop.
make[1]: *** [dpptam/CMakeFiles/dpptam.dir/all] Error 2
make: *** [all] Error 2
Invoking "make -j8 -l8" failed

opencvは、/usr/local/libにopencv2.4.11が入っていて、2.4.8が無いのになぜこのようなエラーがでるのかが分からず途方にくれていたいが、以下のサイトに解決方法が紹介されていた。
http://myzharbot.robot-home.it/blog/software/ros-nvidia-jetson-tx1-jetson-tk1-opencv-ultimate-guide/

具体的には、下記のファイルのopencv2.4.8のパスを、/usr/local/libにあるopencv2.4.11に書き換えことにより解決した。
/opt/ros/indigo/share/cv_bridge/cmake/cv_bridgeConfig.cmake
/opt/ros/indigo/share/image_geometry/cmake/image_geometryConfig.cmake
/opt/ros/indigo/lib/pkgconfig/image_geometry.pc
/opt/ros/indigo/lib/pkgconfig/cv_bridge.pc

Linuxコマンド覚え書き

  • 1日以内に書き換えたpythonファイルの検索
> find . -name "*.py" -mtime -1 -ls
  • ファイルの「xxx」を「xxx」に置き換える
> cat kanbanz100a.xml | sed -e 's/<xmin>\([0-9]*\)<\/xmin>/\1/g'
<filename>kanbanz100a.png</filename>
	<object>
		<name>kanban</name>
		<pose>Unspecified</pose>
		<truncated>1</truncated>
		<difficult>0</difficult>
		<bndbox>
			588
			<ymin>364</ymin>
			<xmax>862</xmax>
			<ymax>987</ymax>
		</bndbox>
		<position>
			<x>0</x>
			<y>0</y>
			<z>1</z>
		</position>
		<rotation>
			<x>0</x>
			<y>180</y>
			<z>0</z>
		</rotation>
	</object>
</annotation>