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
- Broadcast khung tọa độ
- 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_makesource devel/setup.bashrosrun learning_tf tf_publisher _name:=robot1 /robot1