Dec 19, 2018

การใช้งาน XV-11 Lidar บน ROS kinetic

XV-11 Lidar คือ Lidar ของหุ่นยนต์ดูดฝุ่น Neato รุ่น XV-11 นั่นเอง ซึ่งหุ่นยนต์รุ่นนี้ได้เปิดตัวมาแล้วในปี 2010 ณ ขณะนี้ทางบริษัทก็ได้เลิกผลิตหุ่นยนต์รุ่นนี้ไปแล้ว แต่ชิ้นส่วนบางอย่างของมัน โดยเฉพาะ Lidar ยังคงมีประโยชน์อย่างมากสำหรับนักสร้างหุ่นยนต์ ซึ่ง Lidar นี้จะเป็นเซนเซอร์สำคัญอันหนึ่งในการสร้างแผนที่และระบุตำแหน่งไปพร้อมกัน หรือเรียกว่า SLAM นั่นเอง (Simultaneous localization and mapping) ซึ่ง XV-11 Lidar นี้สามารถหาซื้อมือสองได้จาก eBay ในราคาไม่เกิน $90 และ Lidar รุ่นนี้สามารถใช้กับ ROS ได้เป็นอย่างดี เพราะมี driver รองรับ

การสร้างอุปกรณ์เชื่อมต่อ

XV-11 Lidar ที่ซื้อมาจาก eBay นั้นยังไม่พร้อมใช้งาน โดยเราจะต้องสร้างอุปกรณ์สำหรับเชื่อมต่อดังภาพด้านล่าง ซึ่งประกอบไปด้วย

1. USB to Serial module - อุปกรณ์ชิ้นนี้มีบทบาทสำคัญ เพราะจะเป็นตัวแปลงสัญญาณข้อมูลจาก Lidar ส่งมายัง PC ผ่านพอร์ต USB โมดูลนี้โดยส่วนใหญ่จะให้ output power สองระดับ คือ 3.3V และ 5V ซึ่ง 3.3V จะเป็นไฟเลี้ยงสายสัญญาณ Serial นั่นเอง ส่วน 5V จะต้องถูกแปลงโดย Step down เป็นไฟ 3V เพื่อเลี้ยงมอเตอร์ของ Lidar โดยจะต้องเท่ากับ 3V แบบไม่ขาดไม่เกิน

2. Step down module - โมดูลนี้จะแปลงไฟ 5V ให้เหลือ 3V เพื่อขับมอเตอร์ของ Lidar ควรเลือกโมดูลที่สามารถปรับค่าได้ละเอียด

3. JST 2.0 PH 2-Pin connector สำหรับสาย power ของมอเตอร์ และ JST 2.0 PH 4-Pin connector สำหรับสายสัญญาณ Serial



เราสามารถสร้างอุปกรณ์ตาม diagram ด้านบนได้ตามอิสระ เพื่อความสะดวกและคงทน เราควรบัดกรีอุปกรณ์บน prototype pcb หรือ แผ่นไข่ปลา และทำที่ยึดด้วยแผ่นอคริลิก ตัวอย่างอุปกรณ์ที่ทำสำเร็จแล้วแสดงตามภาพ




ติดตั้ง xv_11_laser_driver
เมื่อสร้าง hardware เรียบร้อยแล้ว ขั้นตอนต่อไปก็การติดตั้ง ROS package สำหรับ XV-11 Lidar ผมใช้ ROS kinetic ใน Ubuntu Mate 16.04 บน Raspberry Pi 3 B ดังนั้น คำสั่งในการติดตั้ง driver XV-11 คือ

$ sudo apt-get install ros-kinetic-xv-11-laser-driver

สร้าง udev rules (optional)

ขั้นตอนนี้ถือเป็น optional เพราะชื่อพอร์ตของ XV-11 จะขึ้นอยู่กับโมดูล USB Serial ที่เราใช้ โดยปกติจะเป็น /dev/ttyUSB0 หรือ /dev/ttyACM0 แต่เพื่อให้เกิดความสะดวกในการเรียกชื่อพอร์ตของ XV-11 เราจะสร้างไฟล์สำหรับ udev rule ดังนี้

- ใช้คำสั่ง $ lsusb เพื่อดู idVender และ idProduct ตามภาพ


- จากนั้นใช้คำสั่ง text editor อย่างเช่น $ sudo pluma ใน Ubuntu Mate เพื่อสร้างไฟล์และบันทึกลงใน /etc/udev/rules.d/52-lidar.rules แล้วใส่เนื้อหาตามตัวอย่าง โดย idVender และ idProduct ของแต่ละคนอาจจะไม่เหมือนกัน

SUBSYSTEMS=="usb", KERNEL=="ttyUSB[0-9]*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="lidar"

- เมื่อ reboot เราจะพบว่ามีพอร์ต /dev/lidar เกิดขึ้น

สร้าง launch file

ในกรณีที่เรามี ROS workspace อยู่แล้ว ให้สร้าง launch file ขึ้นมาเพื่อความสะดวกในการสร้างโหนด XV-11 Lidar สมมุติว่าชื่อ test_laser.launch ดังตัวอย่าง

<?xml version="1.0"?>

<launch>
    <node pkg="xv_11_laser_driver" type="neato_laser_publisher" name="xv_11_laser_driver">
      <param name="port" value="/dev/lidar"/>
      <param name="firmware_version" value="2"/>
      <param name="frame_id" value="laser"/>
    </node>
</launch>

ทดสอบ XV-11 lidar

เมื่อผ่านขั้นตอนต่างๆ มากมายมาแล้ว คราวนี้เราทดสอบ XV-11 Lidar ของเรากัน

- รันโหนดด้วยคำสั่ง

$ roslaunch package_name test_laser.launch

โดยที่ package_name ตามที่เราสร้าง

- ดูค่า scan ด้วย rviz

รันคำสั่ง rviz จากนั้น Add by topic เลือก /scan ดังภาพ


แก้ไขตรง Fixed Frame เป็น /laser เราก็จะเห็นข้อมูลที่ XV-11 Lidar สแกนได้ ดังภาพ



เอกสารอ้างอิง
http://wiki.ros.org/xv_11_laser_driver/Tutorials/Running%20the%20XV-11%20Node
http://meetjanez.splet.arnes.si/2015/08/22/neato-xv-11-to-ros-slam

No comments:

Post a Comment