- ขออภัยที่เรื่อง “การเขียนโปรแกรมต่อ 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 ไม่ใช้ dephi หรือ c++ หรือ lazarus คือ dephi อันนี้สงสัยนิดหน่อยเพราะผมไม่ค่อยเจอใครใช้เลย
เคยใช้ Delphi มาก่อน ไม่อยากใช้แล้วเพราะติดเรื่องลิขสิทธิ์ lazarus ฟรีและเป็น opensource ที่สำคัญคือมัน cross platform ครับ