ROS:サービスを使った点群の座標変換
この記事ではROS
のサービスを使って点群等を座標変換する方法について説明します.
環境
Ubuntu18.04
ROS(Melodic)
Python 2.7.x
前準備
本記事では事前に静的な座標変換を行っていることを前提としています.
各センサを起動するlaunch
ファイルにstatic_transform_publisher
を用いて座標変換を記述してください.
概要
ROS
ではlink
同士の座標変換を行うときには主にtf
と呼ばれるライブラリを使用します.これを用いるとsource
とtarget
を指定するだけで座標変換をすることができます.前回,Python
で任意の一点を座標変換する方法について投稿しましたが,これを全部の点に使用するとかなりの時間がかかります.また,tf2
を使うとdoTransform
でPython
内で変換することができますが,これもまた時間がかかります.そこで,ROS
のサービスを使ってC++
内でpcl_ros
を用いて座標変換をしてPython
で変換結果を受けとります.サービスの説明についてはGoogle
してください.
本準備
以下のパッケージをダウンロードしてください.
$ cd ~/catkin_ws/src/
$ git clone https://github.com/HHorimoto/transform_pointcloud_srv.git
$ cd ~/catkin_ws
$ catkin_make
使い方
-
transform_pointcloud_srv
を起動してください.これが変換するサービス側です.
$ rosrun transform_pointcloud_srv transform_pointcloud_srv
- サンプルプログラミング(
client_py.py
)を起動してください.これが変換結果を受け取るクライアント側です..
このプログラムのトピック名及びリンク名を変える必要があります.
$ rosrun transform_pointcloud_srv client_py.py
サンプルプログラムの説明
- 初めに,サービスの名前を見てください.
---
で区切られた上2つはリクエストの引数で下1つはリスポンスの結果です.
$ roscd transform_pointcloud_srv/srv
$ cat TransformPointcloud.srv
std_msgs/String topic_name # 1st Request argument
std_msgs/String target_frame # 2nd Request argument
---
sensor_msgs/PointCloud2 cloud_out # Response value
-
TransformPointcloud
サービスをインポートしてください.
from transform_pointcloud_srv.srv import TransformPointcloud
- サービスが起動するまで待ちます.
rospy.wait_for_service('transform_pointcloud')
- サービスを引数を指定して呼び出して結果を受けてください.
# call
client = rospy.ServiceProxy('transform_pointcloud', TransformPointcloud)
frame_msg = std_msgs.msg.String()
frame_msg.data = "base_link"
topic_name = std_msgs.msg.String()
topic_name.data = "/camera/depth/color/points"
# get
resp1 = client(topic_name, frame_msg)
- あなたの用途に合わせて変換結果を以下のように使用してください.
# print PointCloud data's frame_id, height, and width.
rospy.loginfo("info : frame_id = %s, height = %d, width = %d", resp1.cloud_out.header.frame_id, resp1.cloud_out.height, resp1.cloud_out.width)