hidefumiiのロボット技術つまみ食い日記

アレも食べたいコレも食べたいちょっとずつ

「ROS2ではじめよう」第1章ROS1ツアー #9

「ROS2ではじめよう次世代ロボットプログラミング」

1-4 センシング

1-4-2 距離センサー

とある事情で前回の投稿から半年以上も間が空いてしまってUSBカメラの使い方とかほぼ忘れてしまったのだが過去は振り返らずに次にいくことにする。

距離センサーの出力データを表すメッセージはsensor_msgs/PointCloud2.msgで定義されています。

聞いたことあるある。あと「sensor_msgs/PointCloud.msgってのもあるけど古いので使うな」とも。合点承知之助。

ここでは、近年ロボット技術者の間で普及しているIntel製RealSense D435iを使います。距離画像を表示するだけでなく、可視化ツールを使って3次元のポイントクラウドを描画する方法も説明します。

ちょ、ちょっと待って、そんなの急に言われても普通の人はRealSense D435i持ってないでしょ!

・・・と思って探してみたらなぜかちょうどD435があったのでコレ使うか。とりあえず今はIMU要らないよね。

本に書かれていたRealSenseのドライバの場所がIntelRealSenseからRealSenseAIに移動しててしかも現行は(当たり前だけど)ROS2用で「ROS1用はもうメンテしてないよ」となってはいるが、それでもイイので使わせて!

[https://github.com/realsenseai/realsense-ros/tree/ros1-legacy:embed:cite]

「ROS2ではじめよう」第1章ROS1ツアー interlude "E" 〜 usb_camも使ってみる

前回、

まわり道しすぎて肝心の「ROS2ではじめよう次世代ロボットプログラミング」が全然進んでないので次回こそは本に戻るつもり。

と書いたけど、やっぱ気になるのでusb_camの方も使っておこう、という話。

参考にしたのはコチラ。感謝。

qiita.com

ではまずはusb_camのインストール。

$ sudo apt install ros-melodic-usb-cam

上記サイト(ってボーキサイトと語感が似てるな。どうでもいいけど)を読んで途中はすっ飛ばして以下のようなlaunchファイル(usb_cam_test.launch)作ってみた。

<?xml version="1.0"?>
<launch>
  <node pkg="usb_cam" type="usb_cam_node" name="mycam2">
    <param name="image_width" value="352"/>
    <param name="image_height" value="288"/>
    <param name="framerate" value="30"/>
    <param name="pixel_format" value="mjpeg"/>
  </node>
  <node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
    <remap from="image" to="/mycam2/image_raw"/>
    <param name="autosize" value="true"/>
  </node>
</launch>
$ roslaunch ./usb_cam_test.launch

出た出た。ちゃんと352x288になってる。今日は部屋が明るい。ピンボケ感があるのは手ブレしてるせい。たぶん。

image_viewのウインドウキャプチャ(352x288)

というわけで前回前々回とUSBカメラ扱えるROSノード?3つ試してきたけど、usb_camが一番よさげ、という結論。Melodicの場合。それ以外のディストロでどうかは知らね。

  • uvc_camera 簡単だけど解像度などの設定ができない
  • libuvc_camera 解像度などの設定が可能だがちょいめんどい
  • usb_cam 簡単で解像度などの設定もできちゃう

よし!usb_camの使い方もマスターした(言い過ぎ)!今日はこれで終わり!このUSBカメラシリーズも終わり!

次回こそ「ROS2ではじめよう次世代ロボットプログラミング」を再開するつもり!


p.s. ちなみに書き忘れてたけど使ってたカメラはロジクール ウェブカメラ C270nでした。

「ROS2ではじめよう」第1章ROS1ツアー interlude "D" 〜 libuvc_camera使ってみる

2ヶ月前に「uvc_camera」ではデフォルト設定でしかカメラ映像取り込めないっぽいことを発見してガックシしてしばらく寝込んでたんだが気を取り直してlibuvc_cameraってのを使ってみることにする。

手順はこちらを参考に。

blog.ketus-ix.work

$ sudo apt install ros-melodic-libuvc-camera
$ rosrun libuvc_camera camera_node
/opt/ros/melodic/lib/libuvc_camera/camera_node: error while loading shared libraries: libuvc.so: cannot open shared object file: No such file or directory

う、これは上のサイトには載ってないまた新手のエラーですよ、困った困った、とググるとそのまんま同じ現象について対策が書かれたページあって感謝。

qiita.com

ちなみに元ネタはこれらしい。

stackoverflow.com

この通りにやってlibuvc.soが見つからないエラーは解消。

$ rosrun libuvc_camera camera_node
[ INFO] [1748072676.546010910]: Opening camera with vendor=0x0, product=0x0, serial="", index=0
[ERROR] [1748072676.547399696]: Permission denied opening /dev/bus/usb/003/002

今度は想定通りのエラーなのでUSBデバイス調べてパーミッションを確認。

$ lsusb
Bus 002 Device 003: ID 08ff:168b AuthenTec, Inc. 
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 002: ID 046d:0825 Logitech, Inc. Webcam C270 ←これがカメラね
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ ll /dev/bus/usb/003/002
crw-rw-r-- 1 root root 189, 257  5月 24 15:02 /dev/bus/usb/003/002

ユーザに書き込みパーミッションがないのが原因らしいのでとりあえず手動で追加する。

$ sudo chmod a+w /dev/bus/usb/003/002
$ ll /dev/bus/usb/003/002
crw-rw-rw- 1 root root 189, 257  5月 24 16:41 /dev/bus/usb/003/002

これだと一回こっきり有効でカメラ切断→再接続するとまた元に戻っちゃうんだけど今はお試しだからこのまま進めることに。

$ rosrun libuvc_camera camera_node
[ INFO] [1748073287.086039530]: Opening camera with vendor=0x0, product=0x0, serial="", index=0
unsupported descriptor subtype VS_COLORFORMAT
unsupported descriptor subtype VS_COLORFORMAT
attempt to claim already-claimed interface 1
[ WARN] [1748073289.316515613]: Unable to set scanning_mode to 0
[ WARN] [1748073289.326024011]: Unable to set exposure_absolute to 334
[ WARN] [1748073289.327852803]: Unable to set auto_focus to 1
[ WARN] [1748073289.329606679]: Unable to set focus_absolute to 21860
[ WARN] [1748073289.333114353]: Unable to set iris_absolute to 0
[ WARN] [1748073289.334954133]: Unable to set pantilt to 0, 0
Controls callback. class: 17, event: 0, selector: 4, attr: 0, data_len: 4
Controls callback. class: 18, event: 0, selector: 4, attr: 0, data_len: 2
Controls callback. class: 18, event: 0, selector: 10, attr: 0, data_len: 2
Controls callback. class: 17, event: 0, selector: 4, attr: 0, data_len: 4
Controls callback. class: 18, event: 0, selector: 10, attr: 0, data_len: 2
[ INFO] [1748073289.612939629]: using default calibration URL
:

ノード起動できたっぽい。ではビューワをば。

$ rosrun image_view image_view image:=/image_raw

出た出た・・・んだけど、キャプチャサイズとか設定したかったからlibuvc_camera使ったんだがそれはどうやれば?

・・・と思ったらちゃんとつづきの記事があるじゃないですか素晴らしい。

blog.ketus-ix.work

というわけでコレ読んで以下のようなlaunchファイル(libuvc_camera_test.launch)作ってみた。

<?xml version="1.0"?>
<launch>
  <node pkg="libuvc_camera" type="camera_node" name="mycam">
    <param name="width" value="544"/>
    <param name="height" value="288"/>
    <param name="frame_rate" value="30"/>
    <param name="video_mode" value="mjpeg"/>
  </node>
  <node name="image_view" pkg="image_view" type="image_view" >
    <remap from="image" to="/image_raw"/>
  </node>
</launch>
$ roslaunch ./libuvc_camera_test.launch

出た出た。ちゃんと544x288になってる。絵が暗いのはカメラと部屋のせい。

image_viewのウインドウキャプチャ

てことでlibuvc_cameraの使い方をマスターした(言い過ぎ)ので今日はこれで終わり。

まわり道しすぎて肝心の「ROS2ではじめよう次世代ロボットプログラミング」が全然進んでないので次回こそは本に戻るつもり。


他に参考にしたサイトあれこれ:

Linux: 利用できるWebカメラの情報を取得する

ROS講座120 WebCameraのパラメーターを指定して起動する。 #webcam - Qiita

noetic/ROS、libuvc_cameraでUSBカメラを使う - 自由帳

「ROS2ではじめよう」第1章ROS1ツアー interlude "C" 〜 USBカメラ用パッケージいろいろあるのね

前回はuvc-cameraをインストールしてrqt_image_viewで/image_rawトピックを拾って映像表示してみた。

$ rosrun uvc_camera uvc_camera_node
[ INFO] [1743324090.891681032]: using default calibration URL
<中略>
opening /dev/video0
pixfmt 0 = 'YUYV' desc = 'YUYV 4:2:2'
  discrete: 640x480:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 160x120:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 176x144:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 320x176:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 320x240:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 352x288:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 432x240:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 544x288:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 640x360:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 752x416:   1/25 1/20 1/15 1/10 1/5 
  discrete: 800x448:   1/20 1/15 1/10 1/5 
  discrete: 800x600:   1/20 1/15 1/10 1/5 
  discrete: 864x480:   1/20 1/15 1/10 1/5 
  discrete: 960x544:   1/15 1/10 1/5 
  discrete: 960x720:   1/10 1/5 
  discrete: 1024x576:   1/10 1/5 
  discrete: 1184x656:   1/10 1/5 
  discrete: 1280x720:   2/15 1/5 
  discrete: 1280x960:   2/15 1/5 
pixfmt 1 = 'MJPG' desc = 'Motion-JPEG'
  discrete: 640x480:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 160x120:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 176x144:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 320x176:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 320x240:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 352x288:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 432x240:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 544x288:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 640x360:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 752x416:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 800x448:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 800x600:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 864x480:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 960x544:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 960x720:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 1024x576:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 1184x656:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 1280x720:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 1280x960:   1/30 1/25 1/20 1/15 1/10 1/5 
  int (Brightness, 0, id = 980900): 0 to 255 (1)
  int (Contrast, 0, id = 980901): 0 to 255 (1)
  int (Saturation, 0, id = 980902): 0 to 255 (1)
  bool (White Balance Temperature, Auto, 0, id = 98090c): 0 to 1 (1)
  int (Gain, 0, id = 980913): 0 to 255 (1)
  menu (Power Line Frequency, 0, id = 980918): 0 to 3 (1)
    0: Disabled
    1: 50 Hz
    2: 60 Hz
    3: Auto
  int (White Balance Temperature, 16, id = 98091a): 0 to 10000 (10)
  int (Sharpness, 0, id = 98091b): 0 to 255 (1)
  int (Backlight Compensation, 0, id = 98091c): 0 to 1 (1)
  menu (Exposure, Auto, 0, id = 9a0901): 0 to 3 (1)
  int (Exposure (Absolute), 16, id = 9a0902): 1 to 10000 (1)
  bool (Exposure, Auto Priority, 0, id = 9a0903): 0 to 1 (1)
select timeout in grab
$ rqt_image_view /image_raw
あるいは
$ rqt_image_view /image_raw/compressed

絵が出るには出るんだけど、画像サイズが640x480にしかならない。 パラメータで設定できる?と思ったけどサイズっぽいパラメータがない。

$ rosparam list
/image_raw/compressed/format
/image_raw/compressed/jpeg_quality
/image_raw/compressed/png_level
/image_raw/compressedDepth/depth_max
/image_raw/compressedDepth/depth_quantization
/image_raw/compressedDepth/png_level
/image_raw/theora/keyframe_frequency
/image_raw/theora/optimize_for
/image_raw/theora/quality
/image_raw/theora/target_bitrate
<以下略>

で、uvc_cameraでググって見つけたこちらのサイトに、

uvc_cameraではデフォルトのフォーマットでしか起動できません。

と衝撃的な情報が。まじすか。

qiita.com

上のサイトを続けて読むと、uvc_cameraではサイズ、フレームレート、フォーマットを変えられなくて、

細かい設定をするにはlibuvc_cameraを使う必要があります。

なんだそうです。へー。

…と思ったけどもう少しUSBカメラ(Webカメラ)をROSで使う方法について調べてみると、

まずWebカメラとROSをつなぐドライバーが必要です。uvc_cameraとusb_camが主流でしたが、現在後者のみがnoetic対応をしているのでそちらを使いましょう

という新情報(ワタシにとって)が!

qiita.com

てことは何ですかつまり少なくとも3つやり方がある?

  • uvc_camera
  • usb_cam
  • libuvc_camera

ていうかこの分だともっとある?これ以上はお腹いっぱいなので、とりあえずこの3つについてそれぞれ何がどう違うのかどっかにまとめ情報ないのかーと思ったら、こちらのサイトに

現状、メンテナンスされているUSBカメラのnodeはlibuvc-cameraの様子。 uvc-cameraはnoeticをサポートしてないし、usb-camはnoeticでも動くけどメンテされてないらしい。 そのため、libuvc-cameraを使っていく。

と書かれてたので、やはりlibuvc_cameraを使ってみることにするかな。

ma38su.hatenablog.com

と思ってros indexでlibuvc_cameraを調べてみると、

Last Updated     2021-02-20
Dev Status  UNMAINTAINED 

って書いてあるんですけど!?どゆこと!?

index.ros.org

まあ、ROS Melodicで使えるのは間違いなさそうなので、やってみるか。

続きは次回。

「ROS2ではじめよう」第1章ROS1ツアー #8

「ROS2ではじめよう次世代ロボットプログラミング」

1-4 センシング

1-4-1 画像センサー

中古PCにUbuntuインストールしてUSBカメラ繋いでCheeseで画像キャプチャできることを確認して安心してたら3ヶ月も経っててクリビツテンギョウ。

改心して今日からROS1ツアー再開。気を取り直してカメラ認識からやり直し。

まずは以下をインストール。

$ sudo apt install ros-$ROS_DISTRO-uvc-camera ros-$ROS_DISTRO-rqt-image-view

インストールは無事成功。

WebカメラをPCに接続し、uvc_camera_nodeを実行してみましょう。

はい。てことで、そのへんに転がってたUSBカメラを指して、

$ ls /dev/video*
/dev/video0  /dev/video1

出た出た。1台しか繋いでないのになぜか2つ出た出た。

$ rosrun uvc_camera uvc_camera_node
[ INFO] [1742817059.324550305]: using default calibration URL
<中略>
opening /dev/video0
pixfmt 0 = 'YUYV' desc = 'YUYV 4:2:2'
  discrete: 640x480:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 160x120:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 176x144:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 320x176:   1/30 1/25 1/20 1/15 1/10 1/5 
  discrete: 320x240:   1/30 1/25 1/20 1/15 1/10 1/5 
<以下略>

/dev/video0で認識してるっぽい。video1の方は何なのかまだ謎。

これだけでWebカメラから画像のストリーミングが開始されます。トピックの一覧を取得するrostopic listコマンドやrqt_image_viewノードを実行してストリーミング結果を確認してみましょう。

はい。

$ rostopic list
/camera_info
/image_raw
/image_raw/compressed
/image_raw/compressed/parameter_descriptions
/image_raw/compressed/parameter_updates
/image_raw/compressedDepth
/image_raw/compressedDepth/parameter_descriptions
/image_raw/compressedDepth/parameter_updates
/image_raw/theora
/image_raw/theora/parameter_descriptions
/image_raw/theora/parameter_updates
/rosout
/rosout_agg

$ rqt_image_view /image_raw

rqt_image_viewお試し

出た!ヨシ!

これでOpenCVもステレオカメラもVisualSLAMもYOLOもやり放題!(勉強すればな)

…というわけでまだリハビリ中なので今日はこんなところで終了。

「ROS2ではじめよう」第1章ROS1ツアー interlude "B"

前回は中古PCにUbuntu入れてROS入れたところまで。何で今更そんなことしたのかと言うと、ROSでカメラ使いたかったのにWSLだとカメラ認識しなかったから。

てことで、まずネイティブUbuntu PCでUSBカメラが使えるかチェック。

部屋に(正確には机の上に)転がってたUSBカメラを繋いでみる。

$ ll /dev/video*
crw-rw----+ 1 root video 81, 0 12月 28 00:23 /dev/video0
crw-rw----+ 1 root video 81, 1 12月 28 00:23 /dev/video1

ちゃんと認識してる。1つしか挿してないのになぜか2つ見えてるのがやや謎だが。

確認用にチーズをインストール。 DirectShowについてくるAMCapみたいな感じのツールっぽい。

$ sudo apt install cheese

(略)

$ cheese

Cheeseのウインドウキャプチャ

出た出た。おっけおっけ。ガ○ダムにピントが合ってないのは距離近過ぎるせいなので気にしない。

解像度を1920x1080にするとカックカクになるのはマシンパワーが貧弱なせいだろうから黙って枕を涙で濡らすことにする。640x480くらいならまあまあ。

ヨシ!まだ何も始まってないけどとりあえず今日はヨシ!

「ROS2ではじめよう」第1章ROS1ツアー interlude "A"

「ROS2ではじめよう次世代ロボットプログラミング」

1-4 センシング

1-4-1 画像センサー

ROSは、主要なセンサーの出力の定義を.msgのメッセージファイルであらかじめ規定しています。これにより、画像センサーであれば、それがたとえ

…のところを読んでて、UVCカメラ繋ぐか!と思ったらWSL上のUbuntuだとそもそもUSB機器がうまいこと認識されない的な問題があるらしくて中断してたのが前回。

hidefumii.hateblo.jp

「WSL」「USB」「カメラ」とかでググるとUSB機器を認識させるためにはなんちゃらなんちゃらをあーしてこーしてカーネルをアップデートして…なことを書いておられる先人がたくさんいてそれはそれで凄いと思ったけど正直めんどいし今後も「WSLならでは」のトラブルで引っかかるのはやだなーと思ったので、Ubuntuネイティブ機を用意することにした。今更だけど。

仕事帰りにふらっとリサイクルショップに行ったら法人向けPCでさんざ使われて会社内での役割を終えて第二の人生を待ってそうな中古品が7990円で(税別)で売られてたのでさくっと確保。

スペックはこんな感じ:

  • CPU: Intel Core i5-3320M @ 2.60GHz(まあそこそこ)
  • RAM: 8GB(古い割に悪くない)
  • SSD: 256GB(じゅうぶん)
  • 画面: 1366x768(ちょい狭いけどまあいいでしょ)
  • OS: Windows 10 Pro(HomeじゃなくてProなあたりが会社用だったっぽい雰囲気プンプン)

で、これにUbuntu 18.04インストールしたいので、こちらのサイトを参考にしてセットアップ。

qiita.com

GNOME TweaksでCapsをCtrlに変えるのを忘れずに。

で、お次はこちらのサイトを参考にROS Melodicのインストール。

qiita.com

で、無事にroscore起動するところまで行きましたとさ。

$ roscore

<中略>

SUMMARY
========

PARAMETERS
 * /rosdistro: melodic
 * /rosversion: 1.14.13

NODES

auto-starting new master
process[master]: started with pid [32545]
ROS_MASTER_URI=http://Hogehoge:11311/

setting /run_id to c4899ce4-c2d6-11ef-ac17-74e5438278ac
process[rosout-1]: started with pid [32556]
started core service [/rosout]

これでROS1ツアー再開できるはず。めでたしめでたし。