4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ROSでtfからロボットの自己位置を取得するスクリプト

Last updated at Posted at 2021-03-09

背景

ROSで自律走行ロボットを作っていて定期的にロボット位置をcsvに書き出したかったので自分用にメモ。

実装

ロボットの原点をmapフレームから見た値に変換

# !/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function

import rospy
import tf2_ros
import csv
import tf.transformations as T
import tf2_geometry_msgs

file_path="保存先"

if __name__ == '__main__':
    rospy.init_node('get_robot_pose')
    tfBuffer = tf2_ros.Buffer()
    listerner = tf2_ros.TransformListener(tfBuffer)

    while not rospy.is_shutdown():
        robot_pose = tf2_geometry_msgs.PoseStamped()
        robot_pose.header.frame_id = "base_link"
        robot_pose.header.stamp = rospy.Time(0)
        # Orientationも変換したい場合はwを1.0にする。
        robot_pose.pose.orientation.w = 1.0

        try:
            # base_linkフレームの原点をmapフレーム上の座標に変換
            global_pose = tfBuffer.transform(robot_pose, "map")
        except (tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationException):
            print("WARNING: tf map to base_link not found.")
            rospy.sleep(1)
            continue

        print("Success getting tf!")

        quaternion_rotation = [
            global_pose.pose.orientation.x, global_pose.pose.orientation.y, global_pose.pose.orientation.z, global_pose.pose.orientation.w
        ]
        euler_rotation = T.euler_from_quaternion(quaternion_rotation)
        with open(full_pose_file_path, 'a') as f:
            writer = csv.writer(f)
            writer.writerow([
                global_pose.header.stamp,
                global_pose.pose.position.x, global_pose.pose.position.y, global_pose.pose.position.z,
                quaternion_rotation[0], quaternion_rotation[1], quaternion_rotation[2], quaternion_rotation[3],
                euler_rotation[0], euler_rotation[1], euler_rotation[2]
            ])
     # 取得間隔に合わせて調整
        rospy.sleep(0.1)

実装(間違い)

※ 結果はほぼ同じになるがやっていることは、base_linkフレームの値をmapフレームの値に変換するための変換行列の算出。

# !/usr/bin/python
# -*- coding: utf-8 -*-

from __future__ import print_function

import rospy
import tf2_ros
import csv
import tf.transformations as T

file_path="保存先"

if __name__ == '__main__':
    rospy.init_node('get_robot_pose')
    tfBuffer = tf2_ros.Buffer()
    listerner = tf2_ros.TransformListener(tfBuffer)

    while not rospy.is_shutdown():
        try:
            trans = tfBuffer.lookup_transform("map", "base_link", rospy.Time(0), rospy.Duration(1.0))
        except (tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationException):
            print("WARNING: tf map to base_link not found.")
            rospy.sleep(1)
            continue

        translation = [
            trans.transform.translation.x, trans.transform.translation.y, trans.transform.translation.z
        ]
        quaternion_rotation = [
            trans.transform.rotation.x, trans.transform.rotation.y, trans.transform.rotation.z, trans.transform.rotation.w
        ]
        euler_rotation = T.euler_from_quaternion(quaternion_rotation)
        with open(file_path, 'a') as f:
            writer = csv.writer(f)
            writer.writerow([
                trans.header.stamp,
                translation[0], translation[1], translation[2],
                quaternion_rotation[0], quaternion_rotation[1], quaternion_rotation[2], quaternion_rotation[3],
                euler_rotation[0], euler_rotation[1], euler_rotation[2]
            ])
        # 取得間隔に合わせて調整
        rospy.sleep(0.1)

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?