การใช้งาน Logging โดย rosserial

การ Logging ก็เหมือนกับการเขียนโปรแกรมทั่วๆไปด้วย เนื่องจากมันจะช่วยบอกเราได้ว่า โปรแกรมของเราทำงานไปถึงไหน เกิดอะไรขึ้นบ้าง อีกทั้งยังช่วยเราในการหาข้อผิดพลาดของโปรแกรมอีกด้วย

 ROS node ทุกๆอัน เราสามารถที่จะ log messages ได้หลายระดับ log level โดย rosserial นั้นก็เช่นกัน มันจะส่งข้อความ log ของไปยัง ROS network แล้วส่งไปยัง rosout และเก็บเป็นไฟล์ .log ไว้ด้วย

เราจะมาดูว่า Log level  ใน ROS นั้นมีอะไรบ้างและควรใช้งานเมื่อไหร่ เริ่มจาก Log level นั้นมีอยู่ 5 ประเภท ดังนี้

  • DEBUG: เลเวลนี้เรามักจะเห็นกันบ่อยๆตอนทดสอบ แต่เราไม่อยากแสดงขึ้นมาเวลาใช้งานจริง เลเวลนี้จึงมีเพื่อเอาไว้ debug โปรแกรมของเราตอนกำลังเขียนโปรแกรม อย่างเช่นแสดงค่าตัวแปร ค่าสถานะต่างๆ โปรแกรมทำงานไปถึงจุดไหน

  • INFO: เลเวลนี้จะใช้กันเยอะที่สุด เพราะเป็นการใช้บอกการเรียกใช้งานฟังก์ชั่นต่างๆ การบอกข้อมูลนู้นนี่นั่น เลเวลนี้ควรจะเป็นภาษาที่ทำให้คนใช้งานเข้าใจได้

  • WARN: เลเวลนี้เหมาะกับการบอกถึงเหตุการณ์ที่อาจจะทำให้เกิด Error

  • ERROR: เลเวลนี้จะใช้ในส่วนของการเกิด Error ซึ่งระหว่างเขียนโปรแกรม เราจะใช้ตัวนี้ร่วมกับพวก try except

  • FATAL: เลเวลนี้จะใช้กับส่วนที่มีความสำคัญมากๆ เช่น เหตุการณ์นี้ห้ามเกิดเด็ดขาด เราก็จะใช้เลเวลนี้บอกถึง หายนะ นั่นเอง

ถ้าหากเราทำการ Log ข้อมูลก่อนที่ระบบจะเชื่อมต่อกับ ROS สำเร็จ จะทำให้ข้อมูลเหล่านั้นหายไป

ต่อไปเราก็มาลองเขียนโปรแกรมเพื่อทดสอบการ Log ใน rosserial กัน โดยให้เราเปิด Arduino IDE ขึ้นมาแล้ว New file จากนั้นนำโค้ดนี้ใส่ลงไป


#include <ros.h>
ros::NodeHandle nh;

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

void loop()
{
  //wait until you are actually connected
  while (!nh.connected())
  {
nh.spinOnce();
}
  //Now you can send all of the statements you want
  //to be logged at the appropriate verbosity level
  nh.logdebug("Debug Statement");
  nh.loginfo("Program info");
  nh.logwarn("Warnings.");
  nh.logerror("Errors..");
  nh.logfatal("Fatalities!");

  delay(1000);
}


โดยในฟังก์ชั่นจะมีโค้ดที่จะรอจนกว่า Arduino จะเชื่อมต่อกับ ROS เสร็จ


while (!nh.connected())


และในส่วนที่เหลือจะมีการ log messege ด้วย log level ที่ต่างกันตามที่ได้กล่าวไปตอนต้นแล้ว จากนั้นก็ให้เราอัพโหลดโปรแกรมลงบอร์ด Arduino ตามปกติ

เมื่ออัพโหลดเสร็จ ให้เรารัน roscore

$ roscore

จากนั้นเปิดอีกหน้าต่างแล้วใช้คำสั่งรัน rosserial

$ rosrun rosserial_python serial_node.py /dev/ttyACM0

จะเห็นว่ามีข้อความ log  ของเราแสดงขึ้นมา แต่ถ้าหากสังเกตให้ดี ข้อความเหล่านี้จะไม่มีข้อความที่เป็น Debug level ออกมา แต่เพราะว่าทำไมหล่ะ ก็เพราะว่าโดยปกติแล้ว Log level จะเป็น INFO คือ แสดงผลตั้งแต่ INFO WARN ERROR และ FATAL ตามลำดับ

แต่เราสามารถที่จะตั้งค่า Log Level ได้โดยการใช้คำสั่งเรียก Service โดยการเปิดอีกหน้าต่างแล้วใช้คำสั่งรัน rosserial

$ rosservice call /serial_node/set_logger_level (กดTab2ที)
## logger: 'rosout'
## level: 'DEBUG'

เมื่อเราเซทค่าแล้วให้กลับไปดูที่หน้าต่างเดิมของเรา จะเห็นข้อความที่อยู่ใน Debug level แสดงขึ้นมา


เพียงเท่านี้เราก็สามารถที่จะ Logging โปรแกรมของเราได้แล้ว 



สอนการใช้งานฟังก์ชั่น logging ใน rosserial
Views
121 Total Views
1 Members Views
120 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.