การใช้งาน Time และ TF

ในแพกเกจ rosserial_arduino นั้นจะมี libraries สำหรับการซิงค์ Time stamp กันระหว่าง Arduino กับ PC ซึ่งรัน roscore อยู่ ในส่วนนี้ จะมาทำความเข้าใจวิธีการใช้งาน และตัวอย่างการ publish tf transform ด้วย

ให้เราเปิดไฟล์ตัวอย่างใน Arduino IDE โดยเข้าไปที่ File -> Examples -> ros_lib -> TimeTF


/* 
 * rosserial Time and TF Example
 * Publishes a transform at current time
 */

#include <ros.h>
#include <ros/time.h>
#include <tf/transform_broadcaster.h>

ros::NodeHandle nh;

geometry_msgs::TransformStamped t;
tf::TransformBroadcaster broadcaster;

char base_link[] = "/base_link";
char odom[] = "/odom";

void setup()
{
    nh.initNode();
    broadcaster.init(nh);
}

void loop()
{
    t.header.frame_id = odom;
    t.child_frame_id = base_link;
    t.transform.translation.x = 1.0;
    t.transform.rotation.x = 0.0;
    t.transform.rotation.y = 0.0;
    t.transform.rotation.z = 0.0;
    t.transform.rotation.w = 1.0;
    t.header.stamp = nh.now();
    broadcaster.sendTransform(t);
    nh.spinOnce();
    delay(10);
}


เราจะต้อง include ไฟล์ ros/time.h กับ tf/transform_broadcaster.h เข้ามาถ้าต้องการ publish tf


geometry_msgs::TransformStamped t;
tf::TransformBroadcaster broadcaster;

char base_link[] = "/base_link";
char odom[] = "/odom";


ต่อไปประกาศตัวแปร TranformStamped เอาไว้เก็บ message ที่จะใช้ และประกาศตัวแปร btoadcaster สำหรับเอาไว้ publish tf frame ในส่วนของชื่อเฟรม เราจะต้องกำหนดเอาไว้ว่าชื่ออะไร


    broadcaster.init(nh);


ในฟังก์ชั่น setup() จะต้องทำการเรียก init() ของ TransfromBroadcaster โดยใส่พารามิเตอร์เป็น Node handle ถ้าไม่เรียก init() จะทำให้ไม่สามารถ publish tf frame ได้

    
    t.header.frame_id = odom;
    t.child_frame_id = base_link;
    t.transform.translation.x = 1.0;
    t.transform.rotation.x = 0.0;
    t.transform.rotation.y = 0.0;
    t.transform.rotation.z = 0.0;
    t.transform.rotation.w = 1.0;
    t.header.stamp = nh.now();


ส่วนในฟังก์ชั่น loop จะเป็นการตั่งค่า transform โดยการใส่ชื่อเฟรม ใส่ค่าระยะ translation กับการหมุน rotation (quaternion) และค่า Timestamp โดยการเรียก nh.now() ซึ่งจะให้ค่าเวลาปัจจุบันออกมาเป็น instance ros::Time เหมือนกับ ros::Time::now() ใน roscpp

    
    broadcaster.sendTransform(t);
    nh.spinOnce();
    delay(10);


จากนั้นก็สั่งให้ publish tf transform ออกมา เมื่อเราทำความเข้าใจแล้วก็อัพโหลดโปรแกรมไปยังบอร์ด Arduino ได้เลย

เมื่ออัพโหลดเสร็จ ให้เรารัน roscore และเปิด rosserial ตามปกติ

$ roscore
$ rosrun rosserial_python serial_node.py /dev/ttyACM0


จากนั้นเปิด Terminal ขึ้นมา โดยเราสามารถเช็ค transform ได้โดยการใช้คำสั่ง

$ rosrun tf tf_echo odom base_link

โดย default จะแสดงค่า transform ออกมาทุกๆ 1 วินาที Translation (X,Y,Z) Rotation (X,Y,Z,W)


หรือเราสามารถใช้คำสั่ง

$ rosrun tf view_frames


คำสั่งนี้จะใช้เวลาประมาณ 5 วินาทีในการสร้างไฟล์ frames.pdf ขึ้นมา เพื่อแสดงการ transform frame ต่างๆ



สอนการใช้งาน ros::Time และ TF ในการสร้างตัว publish tf บน Arduino
Views
125 Total Views
1 Members Views
124 Public Views
Actions
0 Likes
0 Dislikes
0 Comments
Share on Social Networks
Share Link
Use permanent link to share in social media
Share by mail

Please login to share this webpage by email.