การเขียนโปรแกรมต่อ GPS ด้วยคอมโพเน็นต์ OpenGPSX (ภาค 1)

  • ขออภัยที่เรื่อง “การเขียนโปรแกรมต่อ GPS ตอน NMEA Parser ด้วย Lazarus (ภาค 1)” ทิ้งช่วงไว้นาน ผมจะเขียนเนื้อเรื่องต่อแต่ขอเปลี่ยนชื่อเป็น “การเขียนโปรแกรมต่อ GPS ด้วยคอมโพเน็นต์ OpenGPSX (ภาค 1)เพื่อให้สัมพันธ์กับคอมโพเน็นต์ที่ผมพัฒนาขึ้นมา ขอให้ทราบตามนี้ครับ

การเขียนโปรแกรม Interface กับ GPS

  • เป็นที่ทราบกันดีครับว่าเครื่อง GPS ในปัจจุบันใช้กันแพร่หลายมากจนเป็นเรื่องธรรมดา โดยเฉพาะทีฺ่ฮิตคือติดบนรถยนต์เพื่อนำทาง (Car Navigator) ในส่วนข่าวสาร ข้อมูลเกี่ยวกับเรื่อง GPS ก็มีให้อ่านได้ทั่วๆไป GPS ที่ bundle มากับโทรศัพท์มือถือก็เป็นเรื่องธรรมดาไปแล้ว ในอนาคตการใช้ GPS จะเป็นเรื่องธรรมดาสามัญมากอีกไม่กี่ปีรถที่ใช้ในชีวิตประจำวันจะติด GPS กันเพราะเครื่องมีราคาถูกลง แต่การนำทางรถยนต์ด้วย GPS บนรถยนต์ไม่ใช่มีแค่ GPS ก็ไปได้ จะต้องประกอบไปด้วย โปรแกรมนำทาง และที่สำคัญที่สุดคือแผนที่ GIS ที่จะนำทางไปเป้าหมายนั่นเอง ซึ่งในส่วนหลังผมไม่คิดว่าจะมีราคาถูกลงมากนักหรอก ต่อให้มีหลายๆบริษัทฯมาทำแข่งกัน เพราะต้นทุนไม่น่าจะลดไปได้มากขนาดนั้น
  • ผมเองเคยมีประสบการณ์สั้นๆในการสำรวจภาคสนามเพื่อจัดทำแผนที่แบบนี้ ค่อนข้างยากลำบากพอสมควรเรื่องการควบคุมคุณภาพข้อมูลสนาม บริษัทฯที่จะทำด้านนี้ในครั้งแรกจะลงทุนมากเพื่อสำรวจถนนกันทั้งประเทศทั้งของกรมทางหลวงและกรมทางหลวงชนบท ส่วนในปีต่อๆไปจะมีค่าใช้จ่ายเพื่อ update ไม่มากเพราะถนนที่ตัดใหม่ หรือสถานที่น่าสนใจ (POI – Point of Interest) ที่เพิ่มในแต่ละปีไม่มากมายนัก
  • มาดูในส่วนที่สองกันคือโปรแกรมนำทาง ในด้านโปรแกรมมิ่ง ด่านแรกคือการเขียนโค๊ดเพื่อต่อ (Interface) กับ GPS ผ่าน driver ของ USB และเก่าหน่อยก็เป็น Serial เพื่อรับหรืออ่านข้อมูลจาก GPS ที่เรียกว่า NMEA (National Marine Electronics Association) ซึ่งกลายเป็น protocol มาตรฐานในปัจจุบัน สมาคม NMEA ได้คิด protocol ซึ่งไม่ได้ใช้กับ GPS เพียงอย่่างเดียว มีอุปกรณ์ electronic อื่นๆเช่น  Echo sounder วัดความลึกของน้ำ เครื่องวัดกระแสลม เรดาร์ เป็นต้น ส่วน NMEA สำหรับ GPS ก็ไม่มีอะไรมากไปกว่าขุดข้อความเป็นบรรทัด (เรียกว่าประโยคหรือ Sentence) ซึ่งแต่ละบรรทัดจะมีคำ (word) ที่เป็นตัวแยกแยะแต่ละบรรทัดว่าหมายถึงอะไร NMEA ตัวอย่าง

$GPGLL,4916.45,N,12311.12,W,225444,A,*1D

  • จากประโยคด้านบนข้อความจะนำด้วยเครื่องหมาย $GP (GP เป็นคำย่อของ GPS)  และที่ติดกันคือ GLL คำว่า GLL ย่อมาจาก Geographic Latitude and Longitude ก็คือค่าพิกัดในระบบพิกัดภูมิศาสตร์นั่นเอง ในการเขียนโปรแกรมขั้นตอนต่อมาก็คือการเขียนโค๊ดเพื่อแปล NMEA จากเครื่อง GPS เราก็ต้องการอ่าน sentence ที่อยู่ในรูปแบบ NMEA แล้วแปลข้อความออกมา ตามแต่ละรูปแบบ ซึ่งจะได้กล่าวต่อไปดังนี้

รูปแบบ NMEA

  • ประโยคของ NMEA จะมีหลากหลายรูปแบบดังลิสต์ด้านล่าง (ซึ่งบางอย่างไม่ได้ใช้กับ GPS เช่น DBT, DPT ใช้กับ Echo sounder)
        AAM - Waypoint Arrival Alarm
        ALM - GPS Almanac Data
        APB - Autopilot Sentence "B"
       *ASD - Autopilot System Data
        BEC - Bearing & Distance to Waypoint, Dead Reckoning
        BOD - Bearing, Origin to Destination
        BWC - Bearing & Distance to Waypoint, Great Circle
        BWR - Bearing & Distance to Waypoint, Rhumb Line
        BWW - Bearing, Waypoint to Waypoint
        DBT - Depth Below Transducer
        DCN - Decca Position
       *DPT - Depth
       *FSI - Frequency Set Information
        GGA - Global Positioning System Fix Data
        GLC - Geographic Position, Loran-C
        GLL - Geographic Position, Latitude/Longitude
        GSA - GPS DOP and Active Satellites
        GSV - GPS Satellites in View
        GXA - TRANSIT Position
       *HDG - Heading, Deviation & Variation
       *HDT - Heading, True
        HSC - Heading Steering Command
        LCD - Loran-C Signal Data
        MTW - Water Temperature
       *MWV - Wind Speed and Angle
        OLN - Omega Lane Numbers
       *OSD - Own Ship Data
        RMA - Recommend Minimum Specific Loran-C Data
        RMB - Recommend Minimum Navigation Information
        RMC - Recommend Minimum Specific GPS/TRANSIT Data
       *ROT - Rate of Turn
       *RPM - Revolutions
       *RSA - Rudder Sensor Angle
       *RSD - RADAR System Data
        RTE - Routes
       *SFI - Scanning Frequency Information
        STN - Multiple Data ID
        TRF - TRANSIT Fix Data
       *TTM - Tracked Target Message
       *VBW - Dual Ground/Water Speed
        VDR - Set and Drift
        VHW - Water Speed and Heading
        VLW - Distance Traveled through the Water
        VPW - Speed, Measured Parallel to Wind
        VTG - Track Made Good and Ground Speed
        WCV - Waypoint Closure Velocity
        WNC - Distance, Waypoint to Waypoint
        WPL - Waypoint Loacation
        XDR - Transducer Measurements
        XTE - Cross-Track Error, Measured
        XTR - Cross-Track Error, Dead Reckoning
        ZDA - Time & Date
        ZFO - UTC & Time from Origin Waypoint
        ZTG - UTC & Time to Destination Waypoint
  • ในการเขียนโปรแกรมจริงๆ เราอาจไม่ต้อง เขียนเพื่อแปลข้อความทุกๆรูปแบบ ที่สำคัญคือ GGA, GSV, GSA และ RMC ก่อนนี้ผมบอกว่าไม่มีเพียงแค่อุปกรณ์ GPS เท่านั้นที่ใช้ protocol ของ NMEA มีอุปกรณ์ที่ใช้ดังต่อไปนี้ สังเกตดูจะเห็น GP ก็คือ GPS นั่นเอง หรือตัวอย่างอื่นได้แก่ SD คือ Echo sounder บางท่านอาจจะเคยใช้พวก GPSMap 420s/421s/520s ซึ่งอุปกรณ์แบบ 2 in 1 คือนอกจะมี GPS แล้วยังมี Echo sounder ที่สามารถใช้วัดความลึกของท้องน้ำได้ เครื่องมือพวกนี้จะส่ง NMEA ออกมาในรูปแบบ SD
AG	Autopilot - General
AP	Autopilot - Magnetic
CC	Computer - Programmed Calculator (obsolete)
CD	Communications - Digital Selective Calling (DSC)
CM	Computer - Memory Data (obsolete)
CS	Communications - Satellite
CT	Communications - Radio-Telephone (MF/HF)
CV	Communications - Radio-Telephone (VHF)
CX	Communications - Scanning Receiver
DE	DECCA Navigation (obsolete)
DF	Direction Finder
EC	Electronic Chart Display & Information System (ECDIS)
EP	Emergency Position Indicating Beacon (EPIRB)
ER	Engine Room Monitoring Systems
GP	Global Positioning System (GPS)
HC	Heading - Magnetic Compass
HE	Heading - North Seeking Gyro
HN   	Heading - Non North Seeking Gyro
II	Integrated Instrumentation
IN	Integrated Navigation
LA	Loran A (obsolete)
LC	Loran C
MP	Microwave Positioning System (obsolete)
OM	OMEGA Navigation System (obsolete)
OS	Distress Alarm System (obsolete)
RA	RADAR and/or ARPA
SD	Sounder, Depth
SN	Electronic Positioning System, other/general
SS	Sounder, Scanning
TI	Turn Rate Indicator
TR      TRANSIT Navigation System
VD	Velocity Sensor, Doppler, other/general
DM	Velocity Sensor, Speed Log, Water, Magnetic
VW	Velocity Sensor, Speed Log, Water, Mechanical
WI	Weather Instruments
YC	Transducer - Temperature (obsolete)
YD	Transducer - Displacement, Angular or Linear (obsolete)
YF	Transducer - Frequency (obsolete)
YL	Transducer - Level (obsolete)
YP	Transducer - Pressure (obsolete)
YR	Transducer - Flow Rate (obsolete)
YT	Transducer - Tachometer (obsolete)
YV	Transducer - Volume (obsolete)
YX      Transducer
ZA	Timekeeper - Atomic Clock
ZC	Timekeeper - Chronometer
ZQ	Timekeeper - Quartz
ZV	Timekeeper - Radio Update, WWV or WWVH

รายละเอียดรูปแบบ GGA, GSA, GSV และ RMC

  • GGA – รูปแบบที่แสดงว่าข้อมูลของ GPS เพียงพอที่จะแสดงพิกัดได้สามมิติ (3D) ซึ่งดาวเทียมที่รับได้ต้องมากถึง 4 ดวงขึ้นไป ภาษาอังกฤษเรียกว่า Fix data

ตัวอย่าง : $GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47

ความหมาย :

GGA –  Global Positioning System Fix Data

123519 –  ข้อมูล Fix เมื่อเวลา 12:35:19 UTC

4807.038,N –  ค่าพิกัดแล็ตติจูดด้านเหนือเส้นศูนย์สูตร 48 deg 07.038′ N

01131.000,E –  ค่าพิกัดลองจิจูดด้านตะวันออก 11 deg 31.000′ E

1  – คุณภาพของข้อมูล Fix :

0 = ช้อมูลไม่ถูกต้อง

1 = GPS fix (SPS)

2 = DGPS fix

3 = PPS fix

4 = Real Time Kinematic

5 = Float RTK

6 = estimated (dead reckoning) (2.3 feature)

7 = Manual input mode

8 = Simulation mode

08 – จำนวนดาวเทียม GPS ที่รับได้

0.9 – ค่าความคลาดเคลื่อนการระบุตำแหน่งแนวราบ

545.4,M – ค่าความสูงเหนือระดับน้ำทะเลปานกลาง

46.9,M  – ความสูงของจีออยด์เหนือทรงรี WGS84

(ช่องว่าง) – เวลาเป็นวินาทีนับจากที่ได้รับค่า fix รูปแบบ DGPS

(ช่องว่าง) – แสดงหมายเลขสถานีของ DGPS

*47 – ค่า checksum นำหน้าด้วย *

  • GSA – รูปแบบที่แสดงรายละเอียดของข้อมูล Fix จำนวนดาวเีทียมที่ใช้งานได้ รวมถึงค่าความคลาดเคลื่อน DOP (dilution of precision) ซึ่งตัวเลขน้อยๆจะเป็นค่าที่ดีมีความถูกต้องสูง

ตัวอย่าง : $GPGSA,A,3,19,28,14,18,27,22,31,39,,,,,1.7,1.0,1.3*35

ความหมาย :

GSA – Satellite status

A – คือ mode ของสถานะของข้อมูล fix เป็น A – Automatic, M = Manual

3  – คือตัวเลขแสดงสถานะการ fix ประกอบไปด้วยค่า :

1 = ช้อมูลไม่ fix

2 = ข้อมูล fix แบบสองมิติ

3 = ข้อมูล fix แบบสามมิติ

19,28,14,18,27,22,31,39  –   คือหมายเลขดาวเทียมที่รับได้ ในที่นี้รับได้ 8 ดวงและ

ตามด้วยเครื่องหมายคอมมาว่างๆอีก 4 ซึ่งเครื่อง GPS จะรับได้สูงสุด 12 ดวง

1.7  – ค่าความคลาดเคลื่อนในการระบุตำแหน่ง PDOP (dilution of precision)

1.0  – ค่าความคลาดเคลื่อนในการระบุตำแหน่งทางราบ (HDOP)

1.3  – ค่าความคลาดเคลื่อนในการระบุตำแหน่งทางดิ่ง (VDOP)

*35  – ค่า checksum นำหน้าด้วย *

  • GSV – รูปแบบที่แสดงรายละเอียดของ GPS แต่ละดวงเช่นระดับความสูง (Elevation) อะซิมัทและ SNR (Signal to Noise Ratio) ซึ่ง เทียบได้กับความแรงของสัญญาณ SNR มีค่าตั้งแต่ 0 ถึง 99 ซึ่งค่ามากเป็นค่าที่ดี ในบางขณะเครื่อง GPS อาจจะรับสัญญาณได้เต็มที่ทั้งหมด 12 ดวง การส่งข้อความจะมากไปถ้าต้องแสดงในบรรทัดเดียว สมาคม NMEA จึงออกแบบให้รูปแบบ GSV สามารถแสดงข้อมูลดาวเทียมได้เต็มที่ประโยคหรือบรรทัดละ 4 ดวงเท่านั้น ดังนั้นถ้ารับสัญญาณดาวเทียมได้ทั้ง 12 ดวงจะได้รับประโยคทั้งหมด 3 บรรทัด

ตัวอย่าง $GPGSV,2,1,08,01,40,083,46,02,17,308,41,12,07,344,39,14,22,228,45*75

ความหมาย :

GSV – Satellites in view

2 – จำนวนประโยคข้อความ (ในที่นี้รับดาวเทียมได้ 8 ดวง จึงใช้แค่ 2 บรรทัดเท่านั้น)

1 –  ประัโยคที่ 1 จากทั้งหมด 2 ประโยค

08 – จำนวนดาวเทียมที่รับสัญญาณได้

01 – หมายเลขดาวเทียม GPS

40 – ระดับความสูง หน่วงเป็นองศา

083 – อะซิมัท (ทิศเหนือ 0 ทิศตะวันออก 90 ทิศใต้ 180 ทิศตะวันตก 270)

46 – SNR – ความแรงของสัญญาณ ค่าสูงเป็นค่าที่ดี

02,17,308,41 – ดาวเทียมหมายเลข 2 พร้อมข้อมูล elevation, azimuth และ SNR

12,07,344,39 – ดาวเทียมหมายเลข 12 พร้อมข้อมูล elevation, azimuth และ SNR

14,22,228,45 – ดาวเทียมหมายเลข 14 พร้อมข้อมูล elevation, azimuth และ SNR

*75 – ค่า checksum นำหน้าด้วย *

  • RMC – รูปแบบที่แสดงรายละเอียดของ GPS เรื่องความเร็ว (velocity) ค่าพิกัด เวลา ตลอดจนทิศทาง

ตัวอย่าง : $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A

ความหมาย :
RMC – Recommended Minimum sentence C
123519 – ข้อมูล fix เมื่อเวลา 12:35:19 UTC
A – สถานะ A=กำลังใช้งาน หรือ V=ยกเว้น
4807.038,N – ค่าแล็ตติจูด 48 องศา 07.038′  เหนือ
01131.000,E – ค่าลองจิจูด 11 องศา 31.000′ ตะวันออก
022.4 – ความเร็วเทียบกับพื้นดิน หน่วยเป็น knot (ไมล์ทะเลต่อชั่วโมง)
084.4 – มุมของทิศทางเทียบกับเหนือจริง
230394 – วันที่ – 23 มีนาคม 1994
003.1,W – มุมต่างระหว่างเหนือจริงกับเหนือแม่เหล็ก
*6A – ค่า checksum นำหน้าด้วยเครื่องหมาย *

ลักษณะของโปรแกรม

  • ลักษณะของโปรแกรมที่จะเขียนจะ implement คอมโพเน็นท์ OpenGPSX (มีแผนจะไปฝากไว้ที่ Sourceforge) มาใช้งาน ซึ่งในเวอร์ชั่นแรกๆ ประมาณ 0.3 สามารถเชื่อมต่อกับ GPS ได้ผ่านทาง Seiral Port  การแสดงผลวาดรูปท้องฟ้าแสดงสัญลักษณ์ของ GPS ขณะนั้น (SkyPlot View) แสดงความแรงของสัญญาณ GPS (Signal Strength) และวาดลูกศรแสดงทิศทางถ้าตั้ง Waypoint ไว้(ดูรูปด้านล่าง) และก็ขอจบตอนนี้ไปก่อนมาติดตามโปรแกรมมิ่งได้ในตอนต่อไป
ตัวอย่างโปรแกรมมิ่งด้วย Lazarus ใช้คอมโพเน็นต์ OpenGPSX

2 thoughts on “การเขียนโปรแกรมต่อ GPS ด้วยคอมโพเน็นต์ OpenGPSX (ภาค 1)”

  1. พี่ครับ แอบสงสัยขออนุญาติถามทำไมพี่ใช้ lazarus ไม่ใช้ dephi หรือ c++ หรือ lazarus คือ dephi อันนี้สงสัยนิดหน่อยเพราะผมไม่ค่อยเจอใครใช้เลย

    1. เคยใช้ Delphi มาก่อน ไม่อยากใช้แล้วเพราะติดเรื่องลิขสิทธิ์ lazarus ฟรีและเป็น opensource ที่สำคัญคือมัน cross platform ครับ

Leave a Reply

Your email address will not be published. Required fields are marked *