Radar on the Rock! เอ้ย... on the Chart
เมื่อเรือบางลำก็ไม่อยากให้เรารู้จัก... ก็เลยต้องจับเรดาร์มาลงแผนที่ มาขี่กับเรือ

สวัสดีวัยรุ่น สำหรับวันนี้ก็เป็นหมวดของ #gis และ #softwareengineer กันอีกซักที หลังจากที่เคยเกริ่นไว้ใน Profile ว่าผมเคยรับบทเป็น Lead Software Developer ทำระบบ Mobility Surveillance System ฟังดูชื่อยาวๆ งงๆ และใช่ครับ งงกับเอกสารเนี่ยแหละ เพราะเอาเข้าจริงมันจะเฉพาะทางโคตรๆ เนื่องจากมันจะไม่ค่อยเจอกับชีวิตประจำวันเท่าไหร่ และที่สำคัญคือชีวิตที่ต้องรบราฆ่าฟันกับข้อมูลจาก Sensor ด้วยประการละเช่นนั้นแล้ว เราจะมาขยายความแบบบ้านๆ ให้ฟังกันครับโพ้ม
เมื่อเรือเป็นเด็กดี (AIS = Self-Identification)
ในการจัดการข้อมูลสำหรับแสดงตำแหน่งเรือทั่วไปที่เราใช้กัน พระเอกที่เราคุ้นเคยคือ AIS (Automatic Identification System) นั่นเอง ซึ่งหลักการมันก็เหมือนชีวิตประจำวันของเราที่ชอบ Check-in กันนี่แหละ โดยเรือจะตะโกนบอกโลกว่า "หนูชื่อเรือ ก.ไก่ พิกัดนี้ ความเร็วเท่านี้ ทิศทางไปนู่นนะ" ข้อมูลจะมาเป็น Digital สวยงาม (เมื่อถอดข้อมูลแล้วจาก >ตัวอย่างนี้เลย<) เอาลงแผนที่ง่ายมาก อันนี้เราเรียกว่า Self-Identification คือเรือมันบอกเองว่ามันเป็นใคร แต่โลกความจริงมันช่างโหดร้าย... เพราะถ้าผมจะขนของเถื่อน ผมจะเปิด AIS บอกตำรวจทำเพื่อ?

นักสืบตาบอดจอมจับผิด (RADAR = Detection)
ในเมื่อเขาไม่บอก เราก็ต้องส่อง! นี่คือหน้าที่ของเรดาร์ครับ (RADAR - Radio Detection and Ranging) หลายคนก็น่าจะต้องรู้จักอยู่แล้ว เวลาเราถอยรถแล้วมี sensor ร้องดังๆ น่ะแหละ ซึ่งในงานของภาคตรวจการณ์ทางทะเลแล้ว หน้าที่หลักของมันคือ Detection หรือการตรวจจับ ว่ามีอะไรสักอย่าง ลอยอยู่ตรงนั้น ลอยอยู่ตรงนั้น เป็นยิงคลื่นแม่เหล็กไฟฟ้าที่ถูกปั้นเป็นก้อนๆ เรียกว่า Magnetron ออกไปให้ชนกับวัตถุ แล้วรอรับสัญญาณสะท้อนกลับ
ความปวดตับครั้งนี้ก็คือเรดาร์มันไม่ได้ส่ง Latitude/Longitude มาให้เรานะ แต่มันส่งมาเป็น Polar Coordinate (ระยะทางและมุมกวาด) หรือถ้าศัพท์ทางเรือหน่อยจะเรียกว่าแบริ่ง (Bearing) หน้าที่ของเราคือต้องรับข้อมูลมาคล้ายๆ กับ AIS ในรูปแบบของ NMEA 0183 น่ะแหละ แล้วเขียน Code แปลงค่าพวกนี้ให้ไปลงจุดบนแผนที่โลกให้ตรงเป๊ะๆ แต่มีของแถมก็คือต้องแก้ปัญหา Noise อีก เพราะอย่างที่บอกว่ามันเหมือนคนตาบอดแล้วใช้มือคลำเอาว่าข้างหน้ามันมีอะไรรึเปล่า บางทีคลื่นทะเลสูงหน่อยหรือแม้กระทั่งเมฆฝน เรดาร์ก็อาจตกใจนึกว่าเป็นเรือซะงั้น ข้อมูลที่ได้จากเรดาร์จึงเป็นแค่จุด ที่บอกว่ามีวัตถุ (Target) แต่ไม่รู้ว่าคืออะไร

ตัวอย่าง NMEA Message ของเรดาร์
$RATTM,492,0.75,281.7,T,1.2,352.7,T,0.72,5.6,N,,T,,074054,M*10\r\nเอาหละ ได้เวลางงกับ Message นี้กันแล้ว แต่เอาเข้าจริงก็ค่อนข้างต่างจาก AIS เลยนะ เพราะถ้าดูดีๆ Message ชุดนี้ถ้าเข้าใจแล้วก็เข้าใจเลย เอ้อ เพราะมันไม่ได้ Hashing ไว้ยังไงล่ะ ตัวเลขแต่ละตัวจะค่อนข้างตรงไปตรงมา และมีเอกสารที่เป็นมาตรฐานเปิดอยู่แล้ว ค้นเอาสิ หรือคลิก NMEA 0183 แต่จะสปอยให้เลยละกันครับ และก็เช่นเคย เมื่อ Comma Separate แล้วจะได้
- $RATTM : - $ บอกว่าเป็นข้อความที่คั่นด้วยฟิลด์แบบทั่วไป, RA ประเภทอุปกรณ์, TTM (Tracked Target Message)
- Track Number : 492 - หมายเลขเป้าที่กำหนดโดยเรดาร์
- Target Distance : 0.75 - ระยะทางจากเราถึงเป้า หน่วยเป็นไมล์ทะเล (Nautical Miles)
- Bearing from own ship : 281.7 - ทิศทางเป้านับจากเรือเรา
- Bearing Units : T - T (True) ทิศทางจริงจากโลก, R (Relative) ทิศทางสัมพันธ์จากที่เรากำหนดเอง เช่น หัวเรือเรา
- Target speed : 1.2 - ความเร็วของเป้า หน่วยเป็นน็อต (Knots) หรือ ไมล์ทะเลต่อชั่วโมง
- Target Course : 352.7 - ทิศทางของเป้า (หรือภาษาทางเรือเรียกว่าเข็ม)
- Course Units : T - เหมือนกับ Bearing Units
- Distance of closest-point-of-approach : 0.72 - DCPA ระยะทางที่จะใกล้ที่สุดที่จะเฉียดเรือเรา
- Time until closest-point-of-approach : 5.6 - TCPA ระยะเวลาที่จะเฉียดใกล้เรือเราที่สุด
- Distance Units : N - ส่วนใหญ่จะเป็นไมล์ทะเล
- Target name : - ตรงตัว
- Target status : T - L (Lost), Q (Acquisition), T (Tracking)
- Reference Target : - ถ้าเป็น R จะใช้จุดอ้างอิงจากจุดอื่น ที่ไมใช่ตัวเรา
- Timestamp : 074054 - เวลา
- Acquisition : M - M (Manual), A (Auto)
- Checksum :
def extract(sentense) :
separated = sentense.split(',')
return {
"targetNumber" : int(sentence[1])
"targetDistance" : float(sentence[2])
"bearingFromOwnShip" : float(sentence[3])
"bearingUnit" : sentence[4]
"targetSpeed" : float(sentence[5])
"targetCourse" : float(sentence[6])
"courseUnit" : sentence[7]
"DCPA" : float(sentence[8])
"TCPA" : float(sentence[9])
"distanceSpeedUnit" : sentence[10]
"targetName" : sentence[11]
"targetStatus" : sentence[12]
"referenceTarget" : sentence[13]
"timestamp" : sentence[14]
"targetAquisition" : sentence[15]
}ความบันเทิงบนหน้าจอ
จะบอกว่าเอาจริงๆ แล้ว ข้อมูลเรดาร์นี้จะมากเยอะ มาถี่มากกว่า AIS ซะอีก ยกตัวอย่างกรมเจ้าท่า กระทรวงคมนาคม จะติดตั้งเรดาร์ชายฝั่งไว้รอบอ่าวไทยและทะเลอันดามัน รวมๆ แล้วเกือบ 30 ตัว ซึ่งพอรวมๆ แล้วนั้น จะมีเป้าเรดาร์ไหลเข้ามาจำนวนมหาศาล และเป้าเรดาร์จะมี Update Rate ค่อนข้างสูง เป็นสาเหตุตามที่บอกว่าเป้าจะหลั่งไหลมาอย่างไม่ขาดสายตลอดเวลา ทีนี้แล้วเป้าจะมาขี่กันได้ยังไง ก็อย่าที่ว่า เรดาร์นั้นเหมือนคนตาบอดคลำทาง รู้ว่านี่คือจุดคล้ายเรือ แต่ก็ไม่รู้ว่าอะไร ซึ่งถ้าเอามาประกอบ (ขี่) กับ AIS แล้ว ก็จะรู้ได้ทันทีว่าเรือที่แสดงตัวเองนั้นของจริง หรือถ้ามีแต่เป้าเรดาร์สองอันมาแตะกัน อันนึงขี่ AIS อยู่ อันนึงไม่มี แต่เป็นเรือใหญ่เหมือนกัน แสดงว่าต้องมาแอบทำอะไรมิดีมิร้ายกันแน่ๆ
มันจะมีอีกอย่างนึงฮะ ที่บอกว่าขี่เนี่ย จริงๆ แล้วมันก็อธิบายง่ายไปหน่อย มันจะมีศัพท์ทางเทคนิคจัดๆ คณิตศาสตร์จ๋าๆ ว่า Track Correlation (การหลอมรวมเป้า) ซึ่ง Algorithm นี้ผมไม่รอด แตกกกก แต่จะพยายามหามาเหลาคร่าวๆ ละกันนะ ทั้ง PDF (Probability Density Function), SD (Standard Deviation) เอาเท่านี้ก่อนสถิตินี่ตายยย แล้วก็นอกจากเนี้ย มันจะมี Sensor อื่นๆ อีกที่ทำงานต่อจากเรดาร์ที่เป็น Detection ไป Indentification (พิสูจน์ทราบ) ได้ต่อไป นะพวกแก...