Lvpizz
发表于 2023-10-9 15:03:23
详细照片2
Lvpizz
发表于 2023-10-9 15:04:33
原始照片,用于采集训练
Lvpizz
发表于 2023-10-9 15:04:58
放大训练照片
Lvpizz
发表于 2023-10-9 15:05:17
放大训练照片2
Lvpizz
发表于 2023-10-9 15:06:30
雷达驱动代码# RadarDriver - By: CaiZhipeng - 周二 6月 27 2023
import time, math,image
from fpioa_manager import fm
from machine import Timer,PWM,UART
class RadarData:
def __init__(self,angle, distance):
self.angle = angle
self.distance = distance
def PrintRadarData(self):
print("angle:{:0.2f} distance:{:0.2f}".format(self.angle,self.distance))
def ToRectangularCoordinates(self):
angle_rad = math.radians(self.angle)
x = self.distance * math.cos(angle_rad)
y = self.distance * math.sin(angle_rad)
return x, y
def ToBytes(self):
angle_int = int(self.angle)
distance_int = int(self.distance)
angle_byte_H = (angle_int >> 8) & 0xFF
angle_byte_L = angle_int & 0xFF
distance_byte_H = (distance_int >> 8) & 0xFF
distance_byte_L = distance_int & 0xFF
return
class RadarClusterData:
def __init__(self,ClusterList):
self.ClusterList = ClusterList
self.length = len(ClusterList)
angles =
distances =
average_angle = sum(angles) / self.length
average_distance = sum(distances) / self.length
self.AverageRadarData = RadarData(average_angle,average_distance)
self.VarianceAngle = sum((x - average_angle) ** 2 for x in angles) / self.length
self.VarianceDistance = sum((x - average_distance) ** 2 for x in distances) / self.length
def PrintRadarClusterData(self):
print("AverageRadarData:")
self.AverageRadarData.PrintRadarData()
print("VarianceAngle:{:0.2f} VarianceDistance:{:0.2f}".format(self.VarianceAngle,self.VarianceDistance))
class RadarDbscan:
def __init__(self,DataList,Eps,MinPts):
self.DataList = DataList
self.Eps = Eps
self.MinPts = MinPts
self.ClusterList = []
self.NoiseList = []
def GetDistance(self, Data1, Data2):
# 定义极坐标的距离公式
theta_diff = Data1.angle - Data2.angle
return math.sqrt(Data1.distance**2 + Data2.distance**2 - 2*Data1.distance*Data2.distance*math.cos(theta_diff))
def GetNeighbour(self, Data):
# 获取邻居
NeighbourList = []
for data in self.DataList:
if self.GetDistance(Data,data) <= self.Eps:
NeighbourList.append(data)
return NeighbourList
def GetCoreObject(self):
# 获取核心对象
CoreObjectList = []
for data in self.DataList:
if len(self.GetNeighbour(data)) >= self.MinPts:
CoreObjectList.append(data)
return CoreObjectList
def GetCluster(self):
# 获取聚类
CoreObjectList = self.GetCoreObject()
ClusterList = []
NoiseList = []
OkList = []
for data in CoreObjectList:
if data not in OkList:
Cluster = []
Cluster.append(data)
OkList.append(data)
NeighbourList = self.GetNeighbour(data)
for Neighbour in NeighbourList:
if Neighbour not in Cluster:
Cluster.append(Neighbour)
OkList.append(Neighbour)
NewClusterData = RadarClusterData(Cluster)
ClusterList.append(NewClusterData)
for data in self.DataList:
if data not in OkList:
NoiseList.append(data)
self.ClusterList = ClusterList
self.NoiseList = NoiseList
return ClusterList, NoiseList
def SortByCluster_size(self):
self.ClusterList.sort(key=lambda x: x.length)
def SortByVariance_distance(self):
self.ClusterList.sort(key=lambda x: x.VarianceDistance)
def SortByVariance_angle(self):
self.ClusterList.sort(key=lambda x: x.VarianceAngle)
class RadarDriver:
# 雷达驱动类
def __init__(self,port_RX, port_TX,PWM_pin,PWM_freq,PWM_duty):
# 进行初始化设置和准备工作
fm.register(port_RX, fm.fpioa.UART2_RX, force=True)
fm.register(port_TX, fm.fpioa.UART2_TX, force=True)
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
self.Time_interupt = Timer(Timer.TIMER1, Timer.CHANNEL0, mode=Timer.MODE_PERIODIC, period=4000, callback=self.ClearFlash)
self.MotorPWM = PWM(tim, freq=PWM_freq, duty=PWM_duty, pin=PWM_pin)
self.RplidarA1uart = UART(UART.UART2, 115200, read_buf_len=1024)
self.RadarDataList = []
self.SwitchFlag = 0
self.MinAngle = 0
self.MaxAngle = 360
self.MaxDistance = 500
self.MapImg = image.Image(size=(224,224))
def CheckHealthy(self):
CheckData =
Res = []
self.RplidarA1uart.write(bytes(CheckData))
text = self.RplidarA1uart.read()
if text:
for txt in text:
Res.append(txt)
if len(Res) >= 8:
if(Res == 0xA5 and
Res == 0x5A and
Res == 0x03 and
Res == 0x00 and
Res == 0x00 and
Res == 0x00 and
Res == 0x06):
if Res == 0x00:
return 1
else:
return Res[-2:]
return 0
def EnableRplidar(self):
if(self.CheckHealthy()):
self.Time_interupt.start()
self.MotorPWM.enable()
return 1
return 0
def DisableRplidar(self):
self.PauseScan()
self.MotorPWM.disable()
def PauseScan(self):
if self.SwitchFlag == 1:
self.Time_interupt.stop()
EndData =
self.RplidarA1uart.write(bytes(EndData))
self.SwitchFlag = 0
def ContinueScan(self):
Res = []
StartData =
if self.SwitchFlag == 0:
self.Time_interupt.start()
self.RplidarA1uart.write(bytes(StartData))
text = self.RplidarA1uart.read()
if text:
for txt in text:
Res.append(txt)
if len(Res) >= 7:
if(Res == 0xA5 and
Res == 0x5A and
Res == 0x54 and
Res == 0x00 and
Res == 0x00 and
Res == 0x40 and
Res == 0x82):
self.SwitchFlag = 1
return 1
return 0
def Decode_q3_6bit(self, number):
if number >= 32:
number = number - 64
return number / 8.0
def validate_packet(self,packet):
TrueChkSum = (packet&0x0F) | ((packet&0x0F)<<4)
data = packet
ChkSum = 0
for byte in data:
ChkSum ^= byte
return TrueChkSum == ChkSum
def ExpressAnalyseByte(self, Byte, Start_angle, Delta_angle, index):
distance1 = ((Byte&0xFC) >> 2 | Byte << 6)/10
distance2 = ((Byte&0xFC) >> 2 | Byte << 6)/10
theta1 = (Byte&0x03)<<4 | (Byte&0x0F)
theta2 = (Byte&0x03)<<4 | ((Byte&0xF0) >> 4)
angle1 = Start_angle + Delta_angle / 32.0 * index - self.Decode_q3_6bit(theta1)
angle2 = Start_angle + Delta_angle / 32.0 * (index+1) - self.Decode_q3_6bit(theta2)
if angle1 > 360:
angle1 = angle1 - 360
if angle2 > 360:
angle2 = angle2 - 360
if distance1>0:
self.RadarDataList.append(RadarData(angle1,distance1))
if distance2>0:
self.RadarDataList.append(RadarData(angle2,distance2))
def AngleDiff(self, Start_angle, new_Start_angle):
if Start_angle <= new_Start_angle:
result = new_Start_angle - Start_angle
else:
result = 360 + new_Start_angle - Start_angle
return result
def ExpressAnalyseData(self, data):
Start_angle = (data | (data&0x7F) << 8)/64.0
new_Start_angle = (data | (data&0x7F) << 8)/64.0
Delta_angle = self.AngleDiff(Start_angle,new_Start_angle)
for i in range(16):
self.ExpressAnalyseByte(data,Start_angle,Delta_angle,2*i+1)
def ExpressGetData(self, batch):
temp = []
RplidarA1Data = []
AnalyseRadarDataList = []
self.RadarDataList.clear()
while len(self.RadarDataList) < 32:
self.ContinueScan()
ResFlag = 0
text = self.RplidarA1uart.read(84*batch)
if text:
#self.PauseScan()
for txt in text:
if(txt & 0xF0) == 0xA0 and ResFlag == 0:# 验证头帧
temp.append(txt)
ResFlag = 1
elif(txt & 0xF0) == 0x50 and ResFlag == 1:# 验证头帧
temp.append(txt)
ResFlag = 2
elif ResFlag < 2:# 有冗余数据舍去
temp.clear()
ResFlag = 0
if ResFlag == 2:
RplidarA1Data.extend(temp)# 存放头数据并开始接收
temp.clear()
ResFlag = 3
elif ResFlag == 3 and len(RplidarA1Data) < 84:
RplidarA1Data.append(txt)
if len(RplidarA1Data) == 84:# 一次接收完成
if self.validate_packet(RplidarA1Data):# 验证数据
AnalyseRadarDataList.append(RplidarA1Data[:])# 存入解析队列(一个数据解析需要它的下一个数据的一个表象)
if len(AnalyseRadarDataList) == 2:# 开始解析
self.ExpressAnalyseData(AnalyseRadarDataList)
AnalyseRadarDataList.pop(0)
RplidarA1Data.clear()
temp.clear()
ResFlag = 0
def ClearFlash(self,Time_interupt):
self.RplidarA1uart.read(1024)
def ReadRadarData(self):
if self.MaxAngle > 360:
temp = self.MaxAngle
while self.MaxAngle > 360:
self.MaxAngle = self.MaxAngle - 360
self.RadarDataList =
self.MaxAngle = temp
else:
self.RadarDataList =
self.RadarDataList.sort(key=lambda x: x.angle)
return self.RadarDataList
def CreatMapping(self,weight=224,height=224):
self.MapImg.clear()
X_max = self.MaxDistance * math.cos(math.radians(45))
Y_max = self.MaxDistance * math.cos(math.radians(45))
self.ReadRadarData()
for data in self.RadarDataList:
x,y = data.ToRectangularCoordinates()
x = int(x / X_max * weight / 2 + weight / 2)
y = int(y / Y_max * height / 2 + height / 2)
self.MapImg.draw_line(x,y,x,y,(225,225,255),thickness = 3)
return self.MapImg
def CreatDbscanMapping(self,ClusterTotalList,NoiseList,weight=224,height=224):
self.MapImg.clear()
X_max = self.MaxDistance * math.cos(math.radians(45))
Y_max = self.MaxDistance * math.cos(math.radians(45))
for ClusterInedex in range(len(ClusterTotalList)):
g = int((ClusterInedex / len(ClusterTotalList)) * 255)
b = int(((len(ClusterTotalList) - ClusterInedex) / len(ClusterTotalList)) * 255)
for data in ClusterTotalList.ClusterList:
x,y = data.ToRectangularCoordinates()
x = int(x / X_max * weight / 2 + weight / 2)
y = int(y / Y_max * height / 2 + height / 2)
self.MapImg.draw_line(x,y,x,y,(255,g,b),thickness = 3)
for data in NoiseList:
x,y = data.ToRectangularCoordinates()
x = int(x / X_max * weight / 2 + weight / 2)
y = int(y / Y_max * height / 2 + height / 2)
self.MapImg.draw_line(x,y,x,y,(255,0,0),thickness = 3)
return self.MapImg
def CreatAveragRadarDataMapping(self,ClusterTotalList,Dbscan,weight=224,height=224):
MaxIndex = 2
self.MapImg.clear()
X_max = self.MaxDistance * math.cos(math.radians(45))
Y_max = self.MaxDistance * math.cos(math.radians(45))
for Cluster in ClusterTotalList:
x,y = Cluster.AverageRadarData.ToRectangularCoordinates()
x = int(x / X_max * weight / 2 + weight / 2)
y = int(y / Y_max * height / 2 + height / 2)
self.MapImg.draw_line(x,y,x,y,(255,255,255),thickness = 3)
Dbscan.SortByVariance_angle()
if len(ClusterTotalList) < 2:
MaxIndex = len(ClusterTotalList)
for i in range(MaxIndex):
x,y = ClusterTotalList.AverageRadarData.ToRectangularCoordinates()
x = int(x / X_max * weight / 2 + weight / 2)
y = int(y / Y_max * height / 2 + height / 2)
self.MapImg.draw_circle(x,y,10,(255,0,0),thickness = 3)
Dbscan.SortByVariance_distance()
for i in range(MaxIndex):
x,y = ClusterTotalList.AverageRadarData.ToRectangularCoordinates()
x = int(x / X_max * weight / 2 + weight / 2)
y = int(y / Y_max * height / 2 + height / 2)
self.MapImg.draw_circle(x,y,10,(0,255,0),thickness = 3)
Dbscan.SortByCluster_size()
for i in range(MaxIndex):
x,y = ClusterTotalList.AverageRadarData.ToRectangularCoordinates()
x = int(x / X_max * weight / 2 + weight / 2)
y = int(y / Y_max * height / 2 + height / 2)
self.MapImg.draw_circle(x,y,10,(0,0,255),thickness = 3)
return self.MapImg
def SetScope(self,minangle,maxangle,distance=500):
minangle = int(minangle)
maxangle = int(maxangle)
distance = int(distance)
if minangle < maxangle and minangle < 360 and maxangle < 720:
if minangle < 0:
minangle = 0
if maxangle > 360 and maxangle-360 > minangle:
maxangle = 360
self.MinAngle = minangle
self.MaxAngle = maxangle
if distance > 0 :
self.MaxDistance = distance
return self.MinAngle,self.MaxAngle,self.MaxDistance
def GetScope(self):
return self.MinAngle,self.MaxAngle,self.MaxDistance
#Radar = RadarDriver(10,11,31,50000,69)
#Radar.EnableRplidar()
#while True:
#Radar.ExpressGetData(10)
#DataList = Radar.ReadRadarData()
#for data in DataList:
#data.PrintRadarData()
#print(data.ToBytes())
Lvpizz
发表于 2023-10-9 15:06:52
照片拍摄驱动代码# Untitled - By: CaiZhipeng - 周日 7月 16 2023
import os, sensor, utime, lcd
class TakePhotoDriver:
def __init__(self, DataNum, DataName, FileName):
self.datanum = DataNum
self.dataname = DataName
self.filename = FileName
self.nownum = 1
lcd.init(freq=15000000)
def rename_files_in_directory(self,path):
files = os.listdir(path)
jpg_files = .isdigit()]
jpg_files = sorted(jpg_files, key=lambda x: int(x.split('.')))
for idx, file in enumerate(jpg_files, start=1):
old_file_path = "{}/{}".format(path, file)
new_file_path = "{}/{}.jpg".format(path, idx)
if old_file_path != new_file_path:
os.rename(old_file_path, new_file_path)
def InitDataFile(self,modes = 1):
if not "TrainData" in os.listdir("/sd"):
os.mkdir("/sd/TrainData")
if not self.filename in os.listdir("/sd/TrainData"):
os.mkdir("/sd/TrainData/%s" % self.filename)
if not self.dataname in os.listdir("/sd/TrainData/%s" % self.filename):
os.mkdir("/sd/TrainData/{}/{}".format(self.filename, self.dataname))
path = "/sd/TrainData/{}/{}".format(self.filename, self.dataname)
if modes==1:
self.rename_files_in_directory(path)
files = os.listdir(path)
jpg_files = .isdigit()]
max_index = 0
for f in jpg_files:
if f.endswith('.jpg'):
index = int(f.split('.'))
max_index = max(index, max_index)
self.nownum = max_index + 1
def TakePhoto(self,img = None,fliename = -1):
if self.nownum < self.datanum:
if img:
if fliename == -1:
img.save("/sd/TrainData/{}/{}/{}.jpg".format(self.filename, self.dataname, self.nownum))
else:
img.save("/sd/TrainData/{}/{}/{}.jpg".format(self.filename, self.dataname, fliename))
else:
if fliename == -1:
sensor.snapshot().save("/sd/TrainData/{}/{}/{}.jpg".format(self.filename, self.dataname, self.nownum))
else:
sensor.snapshot().save("/sd/TrainData/{}/{}/{}.jpg".format(self.filename, self.dataname, fliename))
utime.sleep_ms(5)
self.nownum += 1
def ShowInformation(self):
if self.datanum - self.nownum > 0:
ShowImg = sensor.snapshot()
ShowImg.draw_string(0,0,self.filename+"/"+self.dataname,(255,0,0))
ShowImg.draw_string(0,20,"NeedNum:{}/{}".format(self.nownum, self.datanum),(255,0,0))
lcd.display(ShowImg)
else:
lcd.draw_string(110, 120, "Data Is OK", lcd.BLACK, lcd.WHITE)
Lvpizz
发表于 2023-10-9 15:07:37
串口飞机通讯驱动代码# RadarDriver - By: CaiZhipeng - 周二 6月 27 2023
from Driver import UartDriver as UD,TakePhotoDriver as TD,RadarDriver as RD
import sensor,image,lcd,time,gc, sys, os
import KPU as kpu
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
sensor.set_windowing((224, 224))
sensor.set_vflip(1)
#lcd.init(freq=15000000)
labels = ['FlightPark']
anchors =
ParkingTask = kpu.load("/sd/Models/Parking.kmodel")
ParkingNetwork = kpu.init_yolo2(ParkingTask, 0.4, 0.3, 5, anchors)
UartToStc32 = UD.UartDriver(6, 7,,)#rx tx 发送帧头 接收帧头
MyRadar = RD.RadarDriver(10, 11, 31, 50000, 70)
MyRadar.EnableRplidar()
MyData = TD.TakePhotoDriver(DataNum = 200, DataName = "Radar", FileName = "2021Game")
MyData.InitDataFile()
def ToBytes(num):
num_H = (num >> 8) & 0xFF
num_L = num & 0xFF
return
def JoinBytes(Bytes):
low_byte = Bytes
high_byte = Bytes
return (high_byte << 8) | low_byte
def GetMinDistance(Radar):
Radar.ExpressGetData(10)
DataList = Radar.ReadRadarData()
if DataList:
min_radar_data = min(DataList, key=lambda radar_data: radar_data.distance)
return min_radar_data.ToBytes()
else:
return
def SetAngleScope(Scope,Radar):
MinAngle = JoinBytes(Scope)
MaxAngle = JoinBytes(Scope)
Maxdistance = JoinBytes(Scope)
Radar.SetScope(int(MinAngle),(MaxAngle))
def GetAngleScope(Radar):
minangle,maxangle,maxdistance = Radar.GetScope()
return ToBytes(minangle)+ToBytes(maxangle)+ToBytes(maxdistance)
def FindfrequentBarCode(List):
counter = {}
for s in List:
if s not in counter:
counter = 0
counter += 1
Frequentstr = max(counter, key=counter.get)
return int(Frequentstr)
def IdentifyBarCode(Batch,TimeOut):
timeout = TimeOut
DataList = []
while(len(DataList) < Batch and timeout > 0):
img = sensor.snapshot()
barcodes = img.find_barcodes()
if barcodes:
for barcode in barcodes:
barcodeData = barcode.payload()
(x, y, w, h) = barcode.rect()
#img.draw_rectangle(barcode.rect())
#img.draw_string(x, y, barcodeData, color=(0,255,0), scale=1)
#lcd.display(img)
DataList = DataList +
else:
timeout -= 1
if len(DataList) > Batch//2:
return FindfrequentBarCode(DataList)
return -1
def BarcodeTask(Uart,Radar):
Data =
#IdentifyResult = IdentifyBarCode(10,5)
#if IdentifyResult == -1:
Data = Data +
Result = GetMinDistance(Radar)
Data = Data + Result
Scope = GetAngleScope(Radar)
Data = Data + Scope
Uart.SendData(Data)
def CalculateCenter(rect):
x, y, width, height = rect
center_x = x + width // 2
center_y = y + height // 2
return
def AverageCoordinate(List):
x_List, y_List = zip(*List)
x_avg = sum(x_List) / len(x_List)
y_avg = sum(y_List) / len(y_List)
return
#Batch:识别Batch帧的数据平均成一帧 TimeOut:尝试TimeOut次未达到收集不齐Batch帧率,收集多少算多少
def SearchPark(YoloV2Task, Batch, TimeOut):
ResultList = []
timeout = TimeOut
while(len(ResultList) < Batch and timeout > 0):
img = sensor.snapshot()
SearchResults = kpu.run_yolo2(YoloV2Task,img)
if SearchResults:
timeout = TimeOut
for Result in SearchResults:
img.draw_rectangle(Result.rect())
Coordinate = CalculateCenter(Result.rect())
ResultList.append(Coordinate)
#lcd.display(img)
timeout -= 1
if ResultList:
return ResultList
else:
return
def SearchParkTask(MyUart):
Data = #发送时带模式号
ParkingList = SearchPark(ParkingTask, 1, 10)
if ParkingList != 0xff:
ParkImgCoordinate = AverageCoordinate(ParkingList)
else:
ParkImgCoordinate = ParkingList
#ParkCoordinate = [(int)(ParkImgCoordinate-112)//1,(int)(112-ParkImgCoordinate)//1] # 计算以最中心点为原点的坐标
ParkCoordinate = [(int)(ParkImgCoordinate),(int)(ParkImgCoordinate)]
Data = Data + ParkCoordinate
MyUart.SendData(Data)
# Batch:识别多少次 TimeOut:识别不到重试次数
def JudgeColorBlobs(Batch, TimeOut):
Color = (37, 95, -28, -6, -39, 29)
ColorRoi = (54,54,112,112)
timeout = TimeOut
SuccessCount = 0
while(SuccessCount < Batch and timeout > 0):
Picture = sensor.snapshot()
ColorBlobs = Picture.find_blobs(,roi=ColorRoi, x_stride = 5,y_stride = 5,pixels_threshold=50,merge=True)
if ColorBlobs:
SuccessCount += 1
else:
timeout -= 1
if SuccessCount == Batch:
return 1
return 0
def JudgeColorTask(MyUart):
Data = #发送时带模式号
Result = JudgeColorBlobs(5,10)
Data = Data +
MyUart.SendData(Data)
OldRevDatas =
Count = 0
while True:
RevDatas = UartToStc32.ReadData()# 串口读到的模式标志为是持久性的 stc发送一次改变模式 直到下一次收到数据后
if RevDatas:
RevCmd = RevDatas
if RevCmd != 0x00 and RevCmd != 0x11 and RevCmd != 0x01 and RevCmd != 0x02 and RevCmd != 0x03 and RevCmd != 0x0F and RevCmd != 0xF0:
UartToStc32.RcvData = OldRevDatas
if RevCmd == 0x01:
BarcodeTask(UartToStc32,MyRadar)
elif RevCmd == 0x11:
if len(RevDatas)>=7:
SetAngleScope(RevDatas,MyRadar)
UartToStc32.RcvData =
elif RevCmd == 0x02:
MyRadar.PauseScan()
SearchParkTask(UartToStc32)
elif RevCmd == 0x03:
MyRadar.PauseScan()
JudgeColorTask(UartToStc32)
elif RevCmd == 0x0F:
MyData.TakePhoto()
UartToStc32.SendData(+ToBytes(MyData.datanum-MyData.nownum+1))
UartToStc32.RcvData = OldRevDatas
elif RevCmd == 0x0E:
MapImg = MyRadar.CreatMapping()
MyData.TakePhoto(img = MapImg)
UartToStc32.SendData(+ToBytes(MyData.datanum-MyData.nownum+1))
UartToStc32.RcvData = OldRevDatas
elif RevCmd == 0x00:
Count += 1
MyRadar.PauseScan()
if Count >= 50:
Count = 0
UartToStc32.SendData()# 停机
OldRevDatas = RevDatas[:]
gc.collect()
Lvpizz
发表于 2023-10-9 15:08:27
所使用K210原理图
Lvpizz
发表于 2023-10-9 15:08:45
规格尺寸图,方便打板
Lvpizz
发表于 2023-10-9 15:09:43
备赛通讯文档(MARKDOWN格式)
1. 数据帧基本格式(帧头+模式)
| 发送 | 0x4e,0x35(头)0x35 0x4e(尾) |
| ---- | ---------------------------- |
| 接收 | 0x4e,0x35 |
| 模式 | 0x00/0x01/0x02 |
**接收/发送帧头可修改**
```python
UartToStc32 = UD.UartDriver(6, 7,,)#rx tx 发送帧头 接收帧头
```
2. 停机坪任务任务 0x02(0x4e 0x35 0x02)
- 未找到停机坪:`0xff,0xff`
eg.`0x4e 0x35 0x02 0xff 0xff 0x35 0x4e`
- 找到停机坪:`x,y`
x:0~224 y:0~244 以左上角为原点向左向下分别为x,y正轴
eg.`0x4E 0x35 0x02 0x9D 0x6C 0x35 0x4e
表示坐标:157 108`
3. 颜色判断任务 0x03(0x4e 0x35 0x03)
- 识别到草地`0x01`
eg.`0x4E 0x35 0x03 0x01 0x35 0x4e `
- 没有识别到草地`0x00`
eg.`0x4E 0x35 0x03 0x00 0x35 0x4e`
4. 停机模式 0x00(默认为停机模式)(0x4e 0x35 0x00)
返回`0x4E 0x35 0x00 0x00 0x00 0x35 0x4e `
# 水平方向K210与stc串口通讯协议
1. 数据帧基本格式(帧头+模式)
| 发送 | 0x4e,0x35 |
| --- | --- |
| 接收 | 0x4e,0x35 |
| 模式 | 0x00/0x01 |
**接收/发送帧头可修改**
```python
UartToStc32 = UD.UartDriver(6, 7,,)#rx tx 发送帧头 接收帧头
```
2. 识别条形码任务0x01(0x4e 0x35 0x01)
- 识别到条形码返回条形码数据(0x01 data)
eg.`0x4E 0x35 0x01 0x01 0x03 0x35 0x4e`
识别到了条形码,数字为3
- 未识别到条形码返回最近的雷达信息(0x00 angle_H, angle_L, distance_H, distance_L,min_scope_angle_H,min_scope_angle_L,max_scope_angle_H,max_scope_angle_L)
eg.`0x4E 0x35 0x01 0x00 0x00 0xB3 0x00 0x16 0x00 0x00 0x01 0x0E 0x35 0x4e`
未识别到了条形码,最近障碍为263° 16cm处(此时从0到270°中的最小值)
3. 停机模式 0x00(默认为停机模式)(0x4e 0x35 0x00)
返回`0x4E 0x35 0x00 0x00 0x00 0x35 0x4e`
# 辅助功能
1. 拍照(0x4e 0x35 0x0F)
进行拍照并存入SD卡返回剩余拍照的数量eg.0x4e 0x35 0x0F 0x02 0x53 表示剩余595张图片
```python
MyData = TrainDataCollection(DataNum = 800, DataName = "Parking", FileName = "2021Game")//拍照数量/二级文件夹名称/一级文件夹名称
```
2. 拍照(0x4e 0x35 0x11min_scope_angle_H,min_scope_angle_L,max_scope_angle_H,max_scope_angle_L)
eg.`0x4E 0x35 0x11 0x00 0x00 0x01 0x0E`修改扫描范围为0到270°