การบันทึกตำแหน่งพิกัดจากอุปกรณ์ USB GPS โดยใช้ภาษา Python


บทความนี้จะนำเสนอวิธีการใช้งาน USB GPS ผ่านทางภาษา Python บนระบบปฏิบัติการ Linux (รวมถึง Raspberry Pi ด้วย) เพื่อให้สามารถอ่านค่าพิกัดปัจจุบันและบันทึกไว้ในไฟล์เพื่อนำไปประมวลผลต่อไป

สิ่งที่ต้องใช้

  • USB GPS – เพื่อใช้อ่านค่าพิกัดจากดาวเทียม ตัวอย่างที่ใช้ในบทความนี้คือของ DeLorme Earthmate LT-20
  • โปรแกรม gpsd พร้อมทั้งโปรแกรมทดสอบ และ api ใช้งานผ่าน Python  สามารถติดตั้งได้โดยใช้คำสั่ง
    sudo apt-get install gpsd gpsd-clients python-gps

ตรวจสอบ USB GPS

ขั้นแรกควรตรวจสอบก่อนว่า USB GPS ใช้งานได้หรือไม่ ซึ่งปกติแล้วอุปกรณ์นี้จะจำลองตัวเองเป็นพอร์ม serial ดังนั้นเมื่อเสียบอุปกรณ์เข้าไปก็มักจะปรากฏขึ้นชื่อว่า /dev/ttyUSB0 ให้ลองเข้าไปดูว่ามีไฟล์นี้หรือไม่ ในบางกรณีไฟล์อาจเป็นชื่ออื่น ซึ่งก็ต้องนำชื่อนั้นไปปรับใช้ในโปรแกรมด้วย

สำหรับท่านที่ใช้งาน Raspberry Pi สามารถตรวจสอบรายการรุ่น USB GPS ที่ทดสอบแล้วว่าใช้ได้ที่

http://elinux.org/RPi_VerifiedPeripherals#USB_GPS_devices

แต่หากอุปกรณ์ของท่านไม่ได้อยู่ในรายการก็ไม่ได้แปลว่าจะใช้ไม่ได้เสมอไป ตัวอุปกรณ์ที่ใช้ในบทความนี้ก็ไม่มีในรายการ แต่พอทดสอบก็พบว่าใช้งานได้ดี

gps setup

ลองอ่านค่าพิกัดผ่าน gpsd

ให้เรียกใช้โปรแกรม gpsd ซึ่งจะทำงานในพื้นหลังเพื่อค่อยติดต่อกับดาวเทียมและจัดการอุปกรณ์ให้ล๊อกตำแหน่งพิกัดปัจจุบัน

sudo gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock

หลังจากนั้นก็ลองเรียกใช้โปรแกรม cgps เพื่อดูว่า GPS สามารถระบุพิกัดได้หรือไม่

cgps -s

อย่าลืมว่าต้องวางอุปกรณ์ในที่โล่งสามารถเห็นท้องฟ้าได้ ไม่อยู่ใต้หลังคาหรือต้นไม้ อุปกรณ์ควรเห็นท้องฟ้าอย่างน้อย 70% ตัว USB GPS อาจไม่ฉลาดหรือหาตำแหน่งได้ไวเท่า GPS ในโทรศัพท์มือถือเพราะในระบบโทรศัพท์มือถือจะทำการระบุตำแหน่งโดยใช้ตำแหน่งเสาสัญญาณโทรศัพท์เข้ามาช่วยด้วย

เมื่อเรียกใช้งานและ GPS สามารถระบุพิกัดปัจจุบันได้จะเห็นหน้าจอลักษณะดังนี้

GPSD output

หมายเหตุ หากเรียกใช้โปรแกรม cgps แล้วแสดงหน้าจอข้างต้นเพียงไม่กี่วินาทีแล้วจบการทำงาน ท่านอาจต้องเรียกใช้ gpsd อีกครั้งหนึ่งโดยใช้คำสั่งต่อไปนี้

killall gpsd
sudo gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock

เขียน Python อ่านพิกัดเก็บลงไฟล์

เมื่อแน่ใจแล้วว่าระบบสามารถระบุพิกัดปัจจุบันได้ ก็ให้เขียนโปรแกรม Python ดังตัวอย่างต่อไปนี้เพื่อทำการจัดเก็บตำแหน่งลงไฟล์

import gps

# Listen on port 2947 (gpsd) of localhost
session = gps.gps("localhost", "2947")
session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE)

while True:
	try:
		report = session.next()
		# Wait for a 'TPV' report and display the current time
		# To see all report data, uncomment the line below
		# print report
		if report['class'] == 'TPV':
			if hasattr(report, 'lat'):
				print report.lat
			if hasattr(report, 'lon'):
				print report.lon
			file = open('gps_data.txt','a')
			file.write(str(report.lat)+','+str(report.lon)+"\n")
			file.close()

	except KeyError:
		pass
	except KeyboardInterrupt:
		quit()
	except StopIteration:
		session = None
		print "GPSD has terminated"

เมื่อทดสอบโปรแกรมก็ควรจะเห็นพิกัดถูกพิมพ์ขึ้นมาบนหน้าจอ และบันทึกลงไฟล์ gps_data.txt

gps prog output

การทดลอง – ปั่นจักรยาน

ผู้เขียนได้ติดตั้งอุปกรณ์ USB GPS เข้ากับ Raspberry Pi และติดตั้งไว้บนจักรยานและทดสอบปั่นไปกลับโดยทำการบันทึกค่าพิกัดไว้ตลอดทาง

gps bike

เมื่อกลับจากการปั่นทดสอบก็ได้นำไฟล์พิกัดไปลอง plot ตำแหน่งใน google map โดยใช้วิธีการที่ได้เขียนไว้ในบทความ “การ plot ตำแหน่งพิกัดลงบน Google Map โดยใช้ Python อย่างง่าย” และได้ผลออกมาดังภาพ

bike plot ex

 หมายเหต ข้อมูลที่นำมา plot เป็นเพียงบางส่วนของเส้นทางที่ปั่นจริง

เนื่องจากวันที่ทดสอบสภาพอากาศค่อนข้างดี ฟ้าโปร่งจึงทำให้ GPS หาตำแหน่งได้อย่างรวดเร็ว และเท่าที่สังเกตุดูผลจะเห็นว่าตำแหน่งที่ได้ค่อนข้างแม่นยำ ถึงขนาดที่สามารถแยกฝั่งถนนที่ปั่นจักรยานขาไปและขากลับได้

สรุป

บทความนี้ได้แสดงให้เห็นวิธีการอย่างง่ายในการอ่านตำแหน่งพิกัดจากอุปกรณ์ USB GPS และทำการแสดงผล และบันทึกค่าลงไฟล์เพื่อนำไปใช้งานต่อไป

อ้างอิง

การติดตั้ง gpsd และตัวอย่างโปรแกรม Python ในบทความนี้ดัดแปลงมาจากตัวอย่างในบทความ Adafruit Ultimate GPS on the Raspberry Pi  บน website Adafruit.com