【ROS】 gazeboの中にカメラを固定して移動ロボットの動きを追跡したい
gazeboのセンサプラグインを使って、地面にカメラを固定して定点観測する狙いでカメラ付きロボットのサンプルを参考にしながらあちこち試した。
◆gazeboのチュートリアルで見つけたrrbotをベースにした例
https://classic.gazebosim.org/tutorials?tut=ros_gzplugins#Laser
最初はこれでやってみた。rrbotのアームの先にカメラとLIDARを取り付けてセンサのトピックを見るというもの。
githubからrrbotをチェックアウトしたら、すでにカメラがくっついていた。
棒のようなロボットを地面に固定する方法はなんとなくわかった。
冒頭の部分で、worldというのが出てくる。robotをGazeboに固定するためにbase_linkというのを使う。というコメントがある。これはロボットのベースになるような部分、アームなら幹とか土台の部分と考えたら良いだろうか。
その次のjointタグのところでworldにlink1を固定している。
link1がrrbotの土台ということか。base_linkというラベルは一度も出てきていない。
<!-- Used for fixing robot to Gazebo 'base_link' -->
<link name="world"/>
<joint name="fixed" type="fixed">
<parent link="world"/>
<child link="link1"/>
</joint>
<!-- Base Link -->
<link name="link1">
ここの内容は省略
</link>
◆カメラ付きロボットやURDFの例
http://joe.ash.jp/program/ros/cbot/index.htm
まさに求めていたwebcamを備えた2輪ロボットのサンプルがあったので、ありがたく使わせてもらいました。
これを改造して行けば作れると思った。しかし地面に固定して使うカメラを想定しているのならrrbotをベースにしたほうが良かったのだろうかまだわからない。
冒頭に出てくるのが
<link name="base_footprint"/>
で、これを単純にworldに変えて、base_footprintを全部worldに変えたらいいと思った。
ところがこれをやるとgazeboにカメラが出てこなくなったので混乱した。エラーは出ていなかったにもかかわらずだ。
色々弄くり回した挙句、すべてをworldに固定しようとするとうまく行かないことがわかった。worldを親とするjointは一個だけにして、子をbase_linkにしたらうまく行った。
```
<joint name="base_joint" type="fixed">
<origin xyz="0 0 0.045" rpy="0 0 0" />
<parent link="world" />
<child link="base_link" />
</joint>
```
base_link以外の、ホイール、カメラはbase_linkを親にした。
webcam.urdf.xacroはマクロの作用でurdfに変換されたときにwebcam_0というリンクになり、webcam_0_jointというジョイントで親をbase_link、子をwebcam_0として設定する。
これがわかってからは割とスムーズに行くようになった。カメラ以外のリンクをざっと消去して、base_linkとwebcam_0だけにしてもgazeboに表示されるようになり、カメラの表示もできるようになった。
rostopic list
すると、
/webcam_0_camera/image_raw
が配信されていることがわかったのでrvizで設定すると見ることができた。
gazebo座標のど真ん中x=0,y=0でz=3mのところにカメラ土台を固定し、真下を向けたときのrvizの画面。
どっち向きに配置されているかを確かめるためにブロックとcoke_canを置いてみた。
cbotからの変更点のおさらい
◎cbot_rviz.launch
・x_pos,y_posをゼロにする。
・あとfindのcbotになっている箇所をcbot_cam_onlyに変える。
◎cbot.urdf.xacro
・robot name="cbot_cam_only"に変える
・includeをcommonとwebcamだけにする。
・base_footprintというリンクをworldという名前に変える。
・base_linkのboxサイズを好きなのに変える
・body Definitionからcaster Definitionまでを削除
・最後のgazeboタグを削除
・base_jointのxyz,rpyを好きなのに変える
・webcamのタグのparentをbase_linkに変える。
あとはプロジェクトの名前に合わせてちょこっと編集したらいけるはず。
◆画像処理をメインにした例。カメラを地面に固定
https://qiita.com/srs/items/463bac79564c6bec97f3
◆vscodeでURDFのプレビューを表示する。
vscodeのROSのエクステンションをインストールする。
Ctrl+Shift+Pで検索ボックスを開いて、ROSと打つと下記のような項目が出てくる。
ROS: Preview URDF
URDFファイルを開いた状態でこれを実行するとプレビューが見えるようになる。
なのだが、xacroで作成していたらすぐにはプレビューを見られない。なのでxacroをurdfに変換する作業が必要。これはツールが用意されていて、
rosrun xacro xacro cbot_cam_only.urdf.xacro --inorder > cbot_cam_only.urdf
これでURDFが出せる。上記のファイルをvscodeで開いた状態でROS: Preview URDFを実行すると、たしかにモデルが表示された。
gazoboの世界の空中に固定した土台と、どの土台についたカメラ(緑色の立方体)が出てきている。
xacroファイルを編集してrosrun xacroを実行すると、urdfファイルが更新されてviewerの画面も更新される。ちょっとタイムラグがあるか、スクロールしたら表示が変わった。
カメラの土台base_linkをworld(gazebo空間)に固定すればカメラを空中に固定できる。そしてpitch軸で90度回転すればカメラは真下を向く。
```
<joint name="base_joint" type="fixed">
<origin xyz="0 0 5" rpy="0 1.57 0" />
<parent link="world" />
<child link="base_link" />
</joint>
```
起動時にconfigのrvizファイルが読み込まれるようになっているので、launchすればいきなりフィールド全体が視野に入った状態で起動する。ヤッタネ
◆他のプロジェクトに入れ込みたいとき
座標系の名前が違ってるとうまくspawnできない。そんなときはベースの座標系が何と言う名前か調べる必要がある。下記コマンドでtfのグラフをPDFで出力し、一番上の親が何と言う名前か見られる。
rosrun tf view_frames
odomだったりworldだったり色々あるみたいなのだがどこで設定しているかはまだわかっていない。