完整項目為《基于機器視覺的行人和路面缺陷檢測及其邊緣設(shè)備部署》
完整功能視頻演示地址:本科最后的課設(shè):“車載系統(tǒng)的輔助系統(tǒng)——基于機器視覺的行人和路面缺陷檢測”完結(jié)撒花*罒▽罒*_嗶哩嗶哩_bilibili
該博客介紹的功能為:
1:樹莓派通過gps+天線讀取經(jīng)緯度坐標(biāo)(檢測出路面缺陷的位置)
2:將經(jīng)緯度坐標(biāo)上傳至服務(wù)器
3:調(diào)用高德地圖api,讀取服務(wù)器的經(jīng)緯度,并在地圖上標(biāo)點。
該博客參考了以下博客和資料:
[1]?(74條消息) 樹莓派(四):GPS連接并讀取_樹莓派gps_哦吼吼231的博客-CSDN博客?
[2]?(74條消息) NMEA經(jīng)緯度換算_nmea坐標(biāo)_牧童宇希的博客-CSDN博客
[3]?(71條消息) 【高德地圖API】Web地圖開發(fā)系列(一)_生命是有光的的博客-CSDN博客
[4]?(74條消息) 十三、JavaScript ajax請求_js ajax請求_HJHO的博客-CSDN博客
[5]?(74條消息) HTML讀取json文件(傳遞給變量)_璇焱如柳的博客-CSDN博客
[6]?JS API 安全密鑰使用-基礎(chǔ)-進階教程-地圖 JS API 2.0 | 高德地圖API
一、?樹莓派通過gps+天線讀取經(jīng)緯度坐標(biāo)
? ? 我們將GPS 模塊的串口輸出用USB-TTL 進行了轉(zhuǎn)換,因此我們直接在USB 口上讀取GPS 模塊傳入的數(shù)據(jù)即可。
??? 還需要注意的是GPS 模塊讀取到的值并非經(jīng)緯度,而是包含了經(jīng)緯度信息的字符串。我們的GPS 讀入的信息GNRMC_line 的格式為
????????["b'$GNRMC" , '當(dāng)天UTC 時間','A表示數(shù)據(jù)有效','緯度','N- 北','精度',??'E- 東', '對地速度,單位為節(jié)', '對地真航向,單位為度', '日期(dd ?為日,mm 為月,yy 為年)', '', '', "A*75\\r\\n'" ]
比如:
????????[“b'$GNRMC”,'132558.000','A','3412.93903','N','11708.08969','E','0.00',?'0.00', '081221', '', '', "A*75\\r\\n'" ]
??? 所以我們需要在數(shù)據(jù)流中找到以”b\’$GNRMC” 開頭的數(shù)據(jù),并且在該字符串?dāng)?shù)組的第五個元素和第七個元素。緯度前2 字符表示度,后面的字符表示分,需要轉(zhuǎn)化為小數(shù)形式;經(jīng)度前3 字符表示度,后面的字符表示分,需要轉(zhuǎn)化為小數(shù)形式。
????????具體代碼如下:(完整功能可以復(fù)制的代碼會附在整個模塊講解結(jié)束的地方,這里只是一部分)
????????其中,我們打開串口,存放到ser 中,/dev/ttyUSB0 是端口名,9600 是波特率。while ?True 表示一直不斷檢測,readline 為讀取整行。我們讀取以GNRMC 開頭的字符串?dāng)?shù)組,然后以“,” 逗號作為分隔符把不同的數(shù)據(jù)分隔開,最后通過計算得到xx 度xx 分正確格式的經(jīng)緯度,最后打印出來。
????????如圖為測試圖片
圖:GPS模塊經(jīng)緯度讀取測試
二、?將經(jīng)緯度坐標(biāo)上傳至服務(wù)器
????????我們在自己的服務(wù)器上開了上傳、讀取和刪除的接口。該部分用到上傳接口。我們向接口發(fā)送了POST 請求,并將經(jīng)緯度作為JSON 格式的數(shù)據(jù)發(fā)送到了該URL 。
??? 其中POST 請求是HTTP 中向服務(wù)器提交數(shù)據(jù)的請求方式。與GET 請求不同,POST 請求將數(shù)據(jù)作為請求體(request body)發(fā) 送到服務(wù)器,而不是放在URL 的查詢參數(shù)中。因此,POST 請求通常用于提交一些敏感數(shù)據(jù)或者比較大的數(shù)據(jù),例如表單數(shù)據(jù)、文件上傳等。
??? 具體代碼如下:(requrl='http://124.221.239.172:8080/location'請更換為你自己開的服務(wù)器端口,該端口已經(jīng)關(guān)閉不可使用)
????????我們創(chuàng)建一個名為`rqs_headers` 的字典,這個字典將被用作請求的頭部(headers) 參數(shù),告訴服務(wù)器發(fā)送的數(shù)據(jù)是JSON 格式的。Requrl 為服務(wù)器接口的URL地址。最后我們把經(jīng)緯度通過json.dumps 命令轉(zhuǎn)化為json 格式通過POST 指令發(fā)到服務(wù)器。如果服務(wù)器收到了,會返回響應(yīng)結(jié)果,完成本次通信協(xié)議。
? ? ? ? 第一第二節(jié)完整代碼如下:
import serial
import time
import json
import requests
ser = serial.Serial("/dev/ttyUSB0",9600) #9600是GPS的波特率
while True:
line = str(str(ser.readline()))
# #打印所有串口數(shù)據(jù)
# print(line)
GNRMC_line = line
# GNGLL_line = line
# GNGLL_line = line
if GNRMC_line.startswith("b\'$GNRMC"):
print(GNRMC_line)
GNRMC_line = str(GNRMC_line).split(',') # 將line以“,”為分隔符
#GNRMC_line格式為:["b'$GNRMC", '132558.000', 'A', '3412.93903', 'N', '11708.08969', 'E', '0.00', '0.00', '081221', '', '', "A*75\\r\\n'"]
#GNRMC_line格式為:["b'$GNRMC", '當(dāng)天UTC時間', 'A表示數(shù)據(jù)有效', '緯度', 'N-北', '精度', 'E-東', '對地速度,單位為節(jié)', '對地真航向,單位為度', '日期(dd 為日,mm為月,yy為年)', '', '', "A*75\\r\\n'"]
print(GNRMC_line) #查看數(shù)據(jù)類型
# 時間轉(zhuǎn)化省略(需要把UTC轉(zhuǎn)化為北京時間)
# Lat ddmm.mmmm 緯度,前2字符表示度,后面的字符表示分,需要轉(zhuǎn)化為小數(shù)形式
latitude = float(GNRMC_line[3][:2]) + float(GNRMC_line[3][2:])/60
# Lon dddmm.mmmm 經(jīng)度,前3字符表示度,后面的字符表示分,需要轉(zhuǎn)化為小數(shù)形式
longitude = float(GNRMC_line[5][:3]) + float(GNRMC_line[5][3:])/60
print("緯度: " + GNRMC_line[4] + " " + str(latitude))
print("經(jīng)度: " + GNRMC_line[6] + " " + str(longitude))
# time.sleep(1)
rqs_headers={'content-Type':'application/json'}
requrl='請更換為你自己的服務(wù)器地址'
new_data={"longitude":longitude,"latitude":latitude}
test_data = json.dumps(new_data)
response = requests.post(url=requrl,headers=rqs_headers,data=test_data)
?三、調(diào)用高德地圖api,讀取服務(wù)器的經(jīng)緯度,并在地圖上標(biāo)點
? ? ? ? 上面兩節(jié)是要在樹莓派自帶的python編譯器中運行的python代碼。下面是用VScode寫的html代碼。
????????代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script type="text/javascript" src="請改成你自己的高德api密鑰"></script>
<style type="text/css">
html {
height: 100%
}
body {
height: 100%;
margin: 0px;
padding: 0px
}
#container {
height: 100%
}
.amap-icon img,
.amap-marker-content img{
width: 25px;
height: 34px;
}
.marker {
position: absolute;
top: -20px;
right: -118px;
color: #fff;
padding: 4px 10px;
box-shadow: 1px 1px 1px rgba(10, 10, 10, .2);
white-space: nowrap;
font-size: 12px;
font-family: "";
background-color: #25A5F7;
border-radius: 3px;
}
</style>
</head>
<body>
<div id="container"></div>
<script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script> <!-- 導(dǎo)入jQuery包-->
<script type="text/javascript">
var map = new AMap.Map('container', {
zoom: 11, //級別
center: [116.397428, 39.90923], //中心點坐標(biāo)
viewMode: '3D' //使用3D視圖
});
$.ajax({
url: "請換為你的服務(wù)器端口",//json文件位置,文件名
type: "GET",//請求方式為get
dataType: "json", //返回數(shù)據(jù)格式為json
async: false,
success: function(data) {
position_list=$.parseJSON(JSON.stringify(data)); // 將string轉(zhuǎn)換成可操作的object
console.log(position_list[0])
for (var i=0;i<position_list.length;i++){
marker = new AMap.Marker({
icon: "\poi-marker-default.png",
position: [position_list[i].longitude,position_list[i].latitude],
offset: new AMap.Pixel(-13, -30)
});
marker.setMap(map);
}
}
});
//請求成功完成后要執(zhí)行的方法
</script>
</body>
</html>
? ? ? ? 以上的代碼可以把服務(wù)器的里的經(jīng)緯度數(shù)據(jù)遍歷一遍并且顯示在地圖畫布上。效果如下:
????????我們還給每個Marker 對象添加一個事件監(jiān)聽器,以便監(jiān)聽點擊操作。在使用者點擊marker 后能夠用infowindow 對象的open 方法將信息窗口顯示在地圖上,并將其鏈接到marker 的位置上。?
? ? ? ? ?效果如下圖:
文章來源:http://www.zghlxwxcb.cn/news/detail-621396.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-621396.html
到了這里,關(guān)于樹莓派通過天線+gps獲取經(jīng)緯度并調(diào)用高德地圖api在地圖上標(biāo)點的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!