เริ่มต้นการเขียน Publisher node

        หลังจากเราได้ติดตั้ง rosserial และสร้าง ros_lib เอาไว้ใน Arduino IDE เรียบร้อยแล้ว ต่อไปเรามาลองสร้าง Publisher Node อย่างง่ายกัน เริ่มจากให้เราเปิดโปรแกรม Arduino IDE แล้วเปิดไฟล์ตัวอย่างโปรแกรม โดยการกดที่  File -> Examples -> ros_lib -> HelloWorld


เมื่อเราเปิดขึ้นมาแล้วจะเห็นโค้ดหน้าตาประมาณนี้ใน Arduino IDE

/*
 * rosserial Publisher Example
 * Prints "hello world!"
 */

#include <ros.h>
#include <std_msgs/String.h>

ros::NodeHandle  nh;

std_msgs::String str_msg;
ros::Publisher chatter("chatter", &str_msg);

char hello[13] = "hello world!";

void setup()
{
  nh.initNode();
  nh.advertise(chatter);
}

void loop()
{
  str_msg.data = hello;
  chatter.publish( &str_msg );
  nh.spinOnce();
  delay(1000);
}


เรามาดูกันดีกว่าว่า ข้างในโปรแกรมอันนี้มันทำอะไรบ้าง


#include <ros.h>
#include <std_msgs/String.h>


ทุกครั้งที่เราเขียนโปรแกรม Arduino ให้เชื่อมต่อกับ ROS นั้นเราจะต้อง include header ros.h เข้ามาก่อนทุกครั้ง แล้วหลังจากนั้นจึง include  header message สิ่งที่เราอยากจะใช้เพิ่มเติมมาทีหลัง ในที่นี้เป็น standard message String 


ros::NodeHandle nh;


ต่อไปเราจะต้องสร้าง Node handle ขึ้นมา หน้าที่ของตัวนี้คือ การทำให้โปรแกรมของเราสามารถสร้าง publisher และ subscriber ได้ อีกทั้งมันยังเป็นตัวช่วยในการจัดการและดูแลการเชื่อมต่อผ่าน Serial port


std_msgs::String str_msg;
ros::Publisher chatter("chatter", &str_msg);

char hello[13] = "hello world!";


ต่อไปเค้าประกาศตัวแปร str_msg ขึ้นมาสำหรับไว้เก็บ message จากนั้นได้สร้าง Publisher ชื่อว่า chatter โดยมีพารามิเตอร์ topic เป็น "chatter" กับ message เป็น str_msg ที่เราสร้างขึ้นมา ถัดไปเป็นการประกาศตัวแปรชื่อ hello เก็บข้อความว่า "hello world!"


void setup()
{
    nh.initNode();
    nh.advertise(chatter);
}


ในส่วนนี้เป็นฟังก์ชั่น setup เราจะต้องทำการ initialize ตัว Node handle จากนั้นก็บอกว่าจะมีการ publisher ตัวไหนบ้าง หรือ subscriber ตัวไหนบ้าง ในโค้ดบอกว่า มี publisher อยู่ 1 ตัวชื่อว่า chatter นะ


void loop()
{
    str_msg.data = hello;
    chatter.publish(&str_msg);
    nh.spinOnce();
    delay(1000);
}


และในส่วนของฟังก์ชั่น loop นั้น จะทำการ publish คำว่า "hello world!" ทุกๆ 1000 ms

ือย่าลืม nh.spinOnce() เพราะมันคือฟังก์ชั่นที่ทำให้ Node handle ทำการเรียก callbacks ต่างๆ

เมื่อเราทำความเข้าใจกับโค้ดเรียบร้อยแล้ว ต่อไปจะเป็นการ Compile ซึ่งวิธีการก็ไม่ต่างจาก Arduino sketch อื่นๆ โดยการกดที่เครื่องหมายถูก Verify เมื่อกดแล้วก็รอสักแปปนึง ก็จะเห็นข้อความหน้าตาประมาณนี้


ถ้าขึ้นแบบนี้แสดงว่า Complie ผ่านไม่พบ Error แต่ถ้าเจอมันจะขึ้นสีส้มๆแล้วบอกว่า Error ตรงจุดไหน ยกตัวอย่างผมลอง ลบตัว o ตรงคำว่า hello ออกไป แล้วกด Verify ผลลัพธ์ที่ได้ก็จะเป็นตามภาพนี้


ต่อไปจะเป็นการ Upload โปรแกรมเข้าไปยังบอร์ด Arduino โดยเริ่มจากต่อบอร์ด Arduino เข้ากับคอม แล้วกด Upload ที่เป็นรูปลูกศรชี้ไปทางขวา ซึ่งอยู่ข้างๆปุ่ม Verify


ก่อนจะ Upload เราจะต้องตั้งค่า Port ก่อน โดยให้กดที่ Tools -> Port -> แล้วเลือกว่า Port อะไร 

Serial port ใน Windows จะเป็น COMXX แต่ใน Linux จะเป็น /dev/ttyUSBX หรือ /dev/ttyACMX

เมื่อกด Upload แล้วเราก็จะรอจนมันขึ้นคำว่า Done uploading


ตอนนี้บอร์ด Arduino ของเราก็พร้อมที่จะคุยกับ ROS แล้ว ให้เราเปิด Terminal ขึ้นมาแล้วพิมพ์ roscore

$ roscore


จากนั้นเปิด Terminal ขึ้นมาใหม่ เราจะรัน rosserial โดยใช้คำสั่ง

$ rosrun rosserial_python serial_node.py /dev/ttyACM0


ตอนนี้บอร์ด Arduino ของเรา ก็ได้ทำการเชื่อมต่อกับ ROS เรียบร้อยแล้วต่อไปเราจะมาลองทดสอบดู ว่ามี topic อะไรอยู่บ้าง โดยให้เราเปิด Terminal ขึ้นมาใหม่แล้วรันคำสั่ง

$ rostopic list


เราจะเห็นว่ามี topic ที่เป็นชื่อ /chatter ขึ้นมา คราวนี้เรามาลองดูดีกว่ามันมี message อะไรส่งเข้ามาใน topic /chatter อันนี้ โดยให้เรารันคำสั่ง

$ rostopic echo /chatter


ถ้าไม่มีปัญหาอะไร เราจะเห็นข้อความ "hello world!" แสดงออกมา เพียงเท่านี้เราก็สามารถเขียนโปรแกรม Publisher node ได้แล้ว

สอนการสร้าง publisher node ด้วย arduino โดยใช้ rosserial
Views
148 Total Views
1 Members Views
147 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.