Hướng dẫn sử dụng hệ thống quản lý tọa độ trong ROS

Quản lý hệ tọa độ trong ROS

Trong hệ thống robot, việc chuyển đổi giữa các hệ tọa độ là yếu tố then chốt để xác định vị trí và hướng của các thành phần. Dưới đây là các khái niệm cốt lõi:

1. Chuyển đổi tọa độ giữa các khung

Xét trường hợp một đối tượng có tọa độ (x, y, θ) trong khung A và B. Việc xác định mối quan hệ giữa các khung này dựa trên nguyên lý biến đổi tọa độ Euler.

2. Tính năng của gói TF

  • Xác định vị trí đầu cảm biến so với hệ tọa độ toàn cục sau 10 giây
  • Tính toán vị trí vật thể so với tâm robot
  • Xác lập quan hệ giữa khung robot và cảm biến radar

Cơ chế hoạt động

  1. Broadcast khung tọa độ
  2. Lắng nghe và truy xuất khung tọa độ

Lệnh cài đặt: sudo apt-get install ros-melodic-turtle-tf

Thực hành phát sóng và lắng nghe tọa độ trong ROS

1. Tạo package mới

cd ~/catkin_ws/src && catkin_create_pkg learning_tf roscpp rospy tf turtlesim

2. Code phát sóng tọa độ (C++)


#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <turtlesim/Pose.h>

std::string robot_id;

void positionCallback(const turtlesim::PoseConstPtr& msg) {
    static tf::TransformBroadcaster broadcaster;
    tf::Transform transform;
    transform.setOrigin(tf::Vector3(msg->x, msg->y, 0.0));
    tf::Quaternion q;
    q.setRPY(0, 0, msg->theta);
    transform.setRotation(q);
    broadcaster.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", robot_id));
}

int main(int argc, char** argv) {
    ros::init(argc, argv, "tf_publisher");
    if (argc != 2) {
        ROS_ERROR("Thiếu tham số tên robot");
        return -1;
    }
    robot_id = argv[1];
    ros::NodeHandle nh;
    ros::Subscriber sub = nh.subscribe(robot_id+"/pose", 10, &positionCallback);
    ros::spin();
    return 0;
}

3. Code lắng nghe tọa độ (Python)


import rospy
import tf
import turtlesim.msg

def pose_handler(msg, name):
    br = tf.TransformBroadcaster()
    br.sendTransform((msg.x, msg.y, 0),
                     tf.transformations.quaternion_from_euler(0, 0, msg.theta),
                     rospy.Time.now(),
                     name,
                     "world")

if __name__ == '__main__':
    rospy.init_node('tf_subscriber')
    robot_name = rospy.get_param('~robot')
    rospy.Subscriber('/%s/pose' % robot_name, turtlesim.msg.Pose, pose_handler, robot_name)
    rospy.spin()

4. Cấu hình build


add_executable(tf_publisher src/tf_publisher.cpp)
target_link_libraries(tf_publisher ${catkin_LIBRARIES})

add_executable(tf_subscriber src/tf_subscriber.cpp)
target_link_libraries(tf_subscriber ${catkin_LIBRARIES})

5. Triển khai

  • cd ~/catkin_ws && catkin_make
  • source devel/setup.bash
  • rosrun learning_tf tf_publisher _name:=robot1 /robot1

Thẻ: ROS TF C++ python turtlesim

Đăng vào ngày 30 tháng 7 lúc 12:36