TransformBroadcaste r

Một phần của tài liệu Luận văn tốt nghiệp triển khai thuật toán định hướng trên ROS cho robot tự hành trong nhà (Trang 73 - 76)

14- Tổng quát về bản thuyết minh:

4.2. TransformBroadcaste r

Nhƣ đã trình bày trong phần 3.1.2 về khái niệm hệ tọa độ và chuyển đổi hệ tọa độ trong ROS. Việc chuyển đổi hệ tọa độ trong ROS đƣợc thực hiện dựa trên khái niệm sơ đồ phép chuyển đổi hệ tọa độ. Sau đây ta sẽ trình bày rõ hơn về khái niệm phép chuyển đổi hệ tọa độ và các thao tác cơ bản để lập trình một node cung cấp các phép chuyển đổi hệ tọa độ cho Navigation Stack và các chƣơng trình khác trên ROS.

Giả sử ta có một robot với cảm biến có hệ tọa độ “base_sensor” và mô hình di động “base_link” tại tâm của mỗi phần nhƣ hình thứ nhất. Khoảng cách giữa tâm cảm biến và tâm mobile base đƣợc mô tả trong hình thứ hai. Nếu ta có dữ liệu về một điểm trong không gian có tọa độ (0.3, 0.0, 0.0) trong hệ tọa độ base_sensor nhƣ hình thứ ba, ta cần chuyển đổi dữ liệu từ hệ base_sensor về hệ base_link để robot có thể tránh đƣợc các vật cản trong môi trƣờng. Tóm lại, ta cần phải định nghĩa quan hệ giữa base_link và base_laser qua tf.

Hình 4.1: Ví dụ về hai hệ tọa độ trên robot

Để định nghĩa và lƣu trữ quan hệ giữa base_link và base_sensor bằng tf, ta cần bổ sung chúng vào sơ đồ cây phép chuyển đổi. Quy luật chung cho sơ đồ cây phép chuyển đổi là mỗi node tƣơng ứng

base_sensor

con. Sơ đồ cây đảm bảo chỉ có một mạch liên kết giữa hai tọa độ bất kì và tất cả các nhánh đều hƣớng từ hệ tọa độ mẹ sang con.

Hình 4.2: Giá trị của điểm trong hệ tọa độ cảm biến, cây tọa độ đơn giản và giá trị chuyển đổi trong hệ tọa độ của mobile base.

Hình 4.3: Sơ đồ cây các hệ tọa độ chính của robot tự hành

Đoạn chƣơng trình sau minh họa cho một node làm nhiệm vụ publish một phần của sơ đồ cây phép chuyển đổi hệ tọa độ trên ROS.

#include <ros/ros.h>

#include <tf/transform_broadcaster.h>

int main(int argc, char** argv) {

ros::init(argc, argv, "robot_tf_publisher"); ros::NodeHandle n;

double tilt_angle;

double camera_height;

n.param("tilt_angle", tilt_angle, 0.2705); n.param("camera_height", camera_height, 0.4);

ros::Rate r(50); tf::TransformBroadcaster broadcaster; while(n.ok()) { broadcaster.sendTransform ( tf::StampedTransform ( tf::Transform ( tf::Quaternion(tilt_angle, 0, 0), tf::Vector3(0.0, 0.0, camera_height)

), //A spacial transform

ros::Time::now(), //parent frame

"ngatalie_base", //child frame

"camera_link" ) ); r.sleep(); } }

Trong chƣơng trình trên ta tạo hai thông số cho node robot_tf_publisher là tilt_angle

vàcamera_height. Hai thông số này đƣợc đăng ký với node master của ROS, và có giá trị mặc định là 0.2705 radiance và 0.4 mét. broadcaster là một đối tƣợng có nhiệm vụ publish phép biến đổi kiểu StampedTransform.

Argument đầu tiên của StampedTransform là phép biến đổi kết hợp giữa phép xoay

tf::Quaternion(tilt_angle, 0, 0) và phép tịnh tiến tf::Vector3(0.0, 0.0, camera_height). Quaternion là một cách mô tả khác của phép xoay có ƣu điểm số học trong lập

đủ các constructor và method chuyển đổi qua lại với phƣơng pháp mô tả phép xoay không gian với bộ ba góc raw, pitch, yaw. Argument kế tiếp của StampedTransform là time stamp lấy từ kernel hệ thống của ROS, cuối cùng là tên của hệ tọa độ mẹ và hệ tọa độ con. Đối tƣợng

ros::Rate r là một timer delay tự chỉnh giúp duy trì tần số publish của phép biến đổi với tần số là argument khi khởi tạo ros::Rate r.

Một phần của tài liệu Luận văn tốt nghiệp triển khai thuật toán định hướng trên ROS cho robot tự hành trong nhà (Trang 73 - 76)