首页
统计
留言
Search
1
测试1
1,974 阅读
2
测试2
1,262 阅读
3
typecho内嵌B站视频
1,052 阅读
4
测试3神经猫
1,029 阅读
5
Matlab 计算机视觉实验-UI
978 阅读
Java学习记录
Matlab学习记录
测试
路径规划学习
登录
Search
Mango57
累计撰写
22
篇文章
累计收到
2
条评论
首页
栏目
Java学习记录
Matlab学习记录
测试
路径规划学习
页面
统计
留言
搜索到
22
篇与
mango57
的结果
2022-06-22
AGV读码器udp数据接收(待完善)
{dotted startColor="#ff6c6c" endColor="#1989fa"/}单次import socket #1.创建UDP套接字 #2.绑定地址(host,port)到套接字 s.bind() #3.收发数据 s.recvfrom() s.sendto() #4.关闭服务器端套接字 s.close() s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) host = "" port = 7788 s.bind((host,port)) #绑定地址(host,port)到套接字 #接收客户端传过来的数据 data,addr = s.recvfrom(1024) #data是接收到的数据 addr是对方的地址 也就是发送方的地址 a=str(data) #print(type(data)) c=a.split("<")[-1] d=c.split(">")[0] find="@(" if find not in a: print("未识别到二维码") else:print("收到的数据为:",d) #print("addr",addr) s.close()循环import socket #1.创建UDP套接字 #2.绑定地址(host,port)到套接字 s.bind() #3.收发数据 s.recvfrom() s.sendto() #4.关闭服务器端套接字 s.close() s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) host = "" port = 7788 s.bind((host,port)) #绑定地址(host,port)到套接字 while True: #接收客户端传过来的数据 data,addr = s.recvfrom(1024) #data是接收到的数据 addr是对方的地址 也就是发送方的地址 a=str(data) c = a.split("<")[-1] d = a.split(">")[0] find = "@(" if find not in a: print("未识别到二维码") #print(type(data)) else:print("收到的数据为:",c) #print("addr",addr) s.close()
2022年06月22日
306 阅读
0 评论
0 点赞
2022-06-02
python A*(地图导出mysql+excel)
run.pyimport xlsxwriter as xlsxwriter from astar import astar from Map import Map import pandas as pd import sqlalchemy mymap = [ [1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1] ] map = Map(mymap,0,1,6,25) result = astar(map) result.reverse() print(result) num=len(result) m='' for i in range(num): x=str(result[i]) m=m+x workbook = xlsxwriter.Workbook('C:/Users/17709/Desktop/map.xlsx') worksheet = workbook.add_worksheet() # Widen the first column to make the text clearer # 设置一列或者多列单元属性 worksheet.set_column('A:A', 30) # Add a bold format to use to highlight cells # 在工作表中创建一个新的格式对象来格式化单元格,实现加粗 bold = workbook.add_format({'bold': True}) # Write some numbers, with row/column notation #按照坐标写入 worksheet.write(0,0,'') worksheet.write(1,0,'1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1') worksheet.write(2,0,'1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1') worksheet.write(3,0,'1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1') worksheet.write(4,0,'1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1') worksheet.write(5,0,'1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1') worksheet.write(6,0,'1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1') worksheet.write(7,0,'1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1') worksheet.write(8,0,'1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1') worksheet.write(9,0,'1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1') worksheet.write(12,0,m) # 关闭工作薄 workbook.close() print('已导出至Excel') engine=sqlalchemy.create_engine('mysql+pymysql://用户名:密码@ip:3306/map') #读取数据 db=pd.read_excel('C:/Users/17709/Desktop/map.xlsx') #导入数据库 db.to_sql(name='1',con=engine,index=False,if_exists='replace') print('已导入数据库')astar.pyfrom Node import Node def getKeyforSort(element:Node): return element.g #element#不应该+element.h,否则会穿墙 def astar(workMap): startx,starty = workMap.startx,workMap.starty endx,endy = workMap.endx,workMap.endy startNode = Node(startx, starty, 0, 0, None) openList = [] lockList = [] lockList.append(startNode) currNode = startNode while((endx,endy) != (currNode.x,currNode.y)): workList = currNode.getNeighbor(workMap.data,endx,endy) for i in workList: if (i not in lockList): if(i.hasNode(openList)): i.changeG(openList) else: openList.append(i) openList.sort(key=getKeyforSort)#关键步骤 currNode = openList.pop(0) lockList.append(currNode) result = [] while(currNode.father!=None): result.append((currNode.x,currNode.y)) currNode = currNode.father result.append((currNode.x,currNode.y)) return resultNode.py''' Node.py主要是描述对象Node ''' class Node(object): ''' 初始化节点信息 ''' def __init__(self,x,y,g,h,father): self.x = x self.y = y self.g = g self.h = h self.father = father ''' 处理边界和障碍点 ''' def getNeighbor(self,mapdata,endx,endy): x = self.x y = self.y result = [] #先判断是否在上下边界 #if(x!=0 or x!=len(mapdata)-1): #上 #Node(x,y,g,h,father) if(x!=0 and mapdata[x-1][y]!=0): upNode = Node(x-1,y,self.g+10,(abs(x-1-endx)+abs(y-endy))*10,self) result.append(upNode) #下 if(x!=len(mapdata)-1 and mapdata[x+1][y]!=0): downNode = Node(x+1,y,self.g+10,(abs(x+1-endx)+abs(y-endy))*10,self) result.append(downNode) #左 if(y!=0 and mapdata[x][y-1]!=0): leftNode = Node(x,y-1,self.g+10,(abs(x-endx)+abs(y-1-endy))*10,self) result.append(leftNode) #右 if(y!=len(mapdata[0])-1 and mapdata[x][y+1]!=0): rightNode = Node(x,y+1,self.g+10,(abs(x-endx)+abs(y+1-endy))*10,self) result.append(rightNode) #西北 14 if(x!=0 and y!=0 and mapdata[x-1][y-1]!=0 ): wnNode = Node(x-1,y-1,self.g+14,(abs(x-1-endx)+abs(y-1-endy))*10,self) result.append(wnNode) #东北 if(x!=0 and y!=len(mapdata[0])-1 and mapdata[x-1][y+1]!=0 ): enNode = Node(x-1,y+1,self.g+14,(abs(x-1-endx)+abs(y+1-endy))*10,self) result.append(enNode) #西南 if(x!=len(mapdata)-1 and y!=0 and mapdata[x+1][y-1]!=0 ): wsNode = Node(x+1,y-1,self.g+14,(abs(x+1-endx)+abs(y-1-endy))*10,self) result.append(wsNode) #东南 if(x!=len(mapdata)-1 and y!=len(mapdata[0])-1 and mapdata[x+1][y+1]!=0 ): esNode = Node(x+1,y+1,self.g+14,(abs(x+1-endx)+abs(y+1-endy))*10,self) result.append(esNode) # #如果节点在关闭节点 则不进行处理 # finaResult = [] # for i in result: # if(i not in lockList): # finaResult.append(i) # result = finaResult return result def hasNode(self,worklist): for i in worklist: if(i.x==self.x and i.y ==self.y): return True return False #在存在的前提下 def changeG(self,worklist): for i in worklist: if(i.x==self.x and i.y ==self.y): if(i.g>self.g): i.g = self.gMap.pyimport math ''' 对象Map,主要有地图数据、起点和终点 ''' class Map(object): def __init__(self,mapdata,startx,starty,endx,endy): self.data = mapdata self.startx = startx self.starty = starty self.endx = endx self.endy = endy
2022年06月02日
494 阅读
0 评论
0 点赞
2022-05-27
Matlab生成栅格地图
clc clear close all %% 构建颜色MAP图 cmap = [1 1 1; ... % 1-白色-空地 0 0 0; ... % 2-黑色-静态障碍 1 0 0; ... % 3-红色-动态障碍 1 1 0;... % 4-黄色-起始点 1 0 1;... % 5-品红-目标点 0 1 0; ... % 6-绿色-到目标点的规划路径 0 1 1]; % 7-青色-动态规划的路径 % 构建颜色MAP图 colormap(cmap); %% 构建栅格地图场景 % 栅格界面大小:行数和列数 rows = 10; cols = 20; % 定义栅格地图全域,并初始化空白区域 field = ones(rows, cols); % 障碍物区域 obsRate = 0.3; obsNum = floor(rows*cols*obsRate); obsIndex = randi([1,rows*cols],obsNum,1); field(obsIndex) = 2; % 起始点和目标点 startPos = 2; goalPos = rows*cols-2; field(startPos) = 4; field(goalPos) = 5; %% 画栅格图 image(1.5,1.5,field); grid on; set(gca,'gridline','-','gridcolor','k','linewidth',2,'GridAlpha',0.5); set(gca,'xtick',1:cols+1,'ytick',1:rows+1); axis image;
2022年05月27日
351 阅读
0 评论
0 点赞
2022-05-10
自用小代码
ubuntu20 desktop 新增屏幕共享选项sudo apt install vino gsettings set org.gnome.Vino require-encryption false //普通用户下运行Vmware 安装虚拟机时调节窗口大小xrandr -s 1280x800
2022年05月10日
399 阅读
0 评论
0 点赞
2022-05-09
Matlab A*算法
参考原地址 为了方便学习查看,贴了过来,仅个人自用!{lamp/}1、pathfinding.m起始角本文件,规定了障碍点,边界点,起点,终点及地图规模。clear; clc; disp('A Star Path Planing start!!') map.XYMAX=20; %%代表我们要画一个地图的长和宽 map.start=[1,1]; %起始点 注意必须在地图范围内 map.goal=[18,18]; %目标点 注意必须在地图范围内 obstacle=GetBoundary(map);%得到边界数据 nObstacle=0;%在地图中随机加入XX个障碍物 obstacle=GetObstacle(nObstacle,obstacle,map);%障碍物和边界坐标 obstacle = [obstacle;4,1; 4,2; 4,3; 4,4; 3,4 ;2,4;];%全封死的情况,是没有路的 %obstacle = [obstacle;1,2;2,1;2,2];%此也为全封死的情况,也没有路的 %obstacle = [obstacle;1,3;2,3;3,3;3,2;3,1];%此也为全封死情况,也没有路的 % %load('obstacle1.mat'); %画出网格线 PlotGrid(map); hold on; %画出障碍点 FillPlot(obstacle,'k'); path=AStar(obstacle,map)%A*算法 %画出路径 % if length(path)>=1 plot(path(:,1),path(:,2),'-c','LineWidth',5);hold on; end %}2、AStar.m核心代码function path=AStar(obstacle,map) %{ Astar算法思路 1.将起始点放在Openlist中 2.重复以下过程: 首先判断是否到达目标点,或无路径 >>如果终点已加入到Openlist中,则已找到路径(此时起始点就是目标点,无需再找) >>Openlist为空,无路径 a.按照Openlist中的第三列(代价函数F)进行排序,查找F值最小的节点 b.把这个F值最小的节点移到Closelist中作为 当前节点 c.对当前节点周围的8个相邻节点: >>如果它不可达,忽略它 >>如果它在Closelist中,忽略它 >>如果它不在Openlist中,加放Openlist,并把当前节点设置为它的父节点,记录该节点的F值 >>如果它已经在Openlist中,检查经当前节点到达那里是否更好(用G或F值判断), >如果更好,则将当前节点设置为其父节点,并更新F,G值;如果不好,则不作处理 3.保存路径 %} %用于存储路径 path=[]; %OpenList open=[]; %CloseList close=[]; %findFlag用于判断while循环是否结束 findFlag=false; %================1.将起始点放在Openlist中====================== %open变量每一行 [节点坐标,代价值F=G+H,代价值G,父节点坐标] open =[map.start(1), map.start(2) , 0+h(map.start,map.goal) , 0 , map.start(1) , map.start(2)]; %更新状态--下一步的八个点 next=MotionModel(); %=======================2.重复以下过程============================== while ~findFlag %--------------------首先判断是否达到目标点,或无路径----- if isempty(open(:,1)) disp('No path to goal!!'); return; end %判断目标点是否出现在open列表中 [isopenFlag,Id]=isopen(map.goal,open); if isopenFlag disp('Find Goal!!'); close = [open(Id,:);close] findFlag=true; break; end %------------------a.按照Openlist中的第三列(代价函数F)进行排序,查找F值最小的节点 [Y,I] = sort(open(:,3)); %对OpenList中第三列排序 open=open(I,:);%open中第一行节点是F值最小的 %------------------b.将F值最小的节点(即open中第一行节点),放到close第一行(close是不断积压的),作为当前节点 close = [open(1,:);close]; current = open(1,:); open(1,:)=[];%因为已经从open中移除了,所以第一列需要为空 %--------------------c.对当前节点周围的8个相邻节点,算法的主体:------------------------ for in=1:length(next(:,1)) %获得相邻节点的坐标,代价值F先等于0,代价值G先等于0 ,后面两个值是其父节点的坐标值,暂定为零(因为暂时还无法判断其父节点坐标是多少) m=[current(1,1)+next(in,1) , current(1,2)+next(in,2) , 0 , 0 , 0 ,0]; m(4)=current(1,4)+next(in,3); % m(4) 相邻节点G值 m(3)=m(4)+h(m(1:2),map.goal);% m(3) 相邻节点F值 %>>如果它不可达,忽略它,处理下一个相邻节点 (注意,obstacle这个数组中是包括边界的) if isObstacle(m,obstacle) continue; end %flag == 1:相邻节点 在Closelist中 targetInd = close中行号 %flag == 2:相邻节点不在Openlist中 targetInd = [] %flag == 3:相邻节点 在Openlist中 targetInd = open中行号 [flag,targetInd]=FindList(m,open,close); %>>如果它在Closelist中,忽略此相邻节点 if flag==1 continue; %>>如果它不在Openlist中,加入Openlist,并把当前节点设置为它的父节点 elseif flag==2 m(5:6)=[current(1,1),current(1,2)];%将当前节点作为其父节点 open = [open;m];%将此相邻节点加放openlist中 %>>剩下的情况就是它在Openlist中,检查由当前节点到相邻节点是否更好,如果更好则将当前节点设置为其父节点,并更新F,G值;否则不操作 else %由当前节点到达相邻节点更好(targetInd是此相邻节点在open中的行号 此行的第3列是代价函数F值) if m(3) < open(targetInd,3) %更好,则将此相邻节点的父节点设置为当前节点,否则不作处理 m(5:6)=[current(1,1),current(1,2)];%将当前节点作为其父节点 open(targetInd,:) = m;%将此相邻节点在Openlist中的数据更新 end end %下面的end是判断八个相邻节点的for循环的end end %=====绘制====== PlotGrid(map); hold on; pause(0.01); %绘制节点close和open节点 FillPlot(close,'r'); hold on; FillPlot(open,'g') hold on; end %追溯路径 path=GetPath(close,map.start);3、FindList.m检查给定节点是否open列表中 是否在close列表中function [flag,targetInd]=FindList(m,open,close) %{ 函数功能: 如果相邻节点(m存储其信息) 已经在Closelist中,则flag = 1 targetInd = 其所在close的行数,用来定位 如果相邻节点(m存储其信息) 不在Openlist 中,则flag = 2 targetInd = [] 如果相邻节点(m存储其信息) 已经在Openlist 中,则flag = 3 targetInd = 其所在open的行数,用来定位 %} %如果openlist为空,则一定不在openlist中 if isempty(open) flag = 2; targetInd = []; else %open不为空时,需要检查是否在openlist中 %遍历openlist,检查是否在openlist中 for io = 1:length(open(:,1)) if isequal( m(1:2) , open(io,1:2) ) %在Openlist中 flag = 3; targetInd = io; return; else %不在Openlist中 flag = 2; targetInd = []; end end end %如果能到这一步,说明: 一定不在Openlist中 那么需要判断是否在closelist中 %遍历Closelist(注意closelist不可能为空) for ic = 1:length(close(:,1)) if isequal( m(1:2) , close(ic,1:2) ) %在Closelist中 flag = 1; targetInd = ic; return;%在Closelist中直接return end end %{ 以下代码用于测试此函数的正确性: open = [ 1,1 ; 2,2; 3,3; 4,4; 5,5; 6,6; 7,7; 8,8; 9,9]; %还有一种情况:open列表为空 close = [1,2 ; 2,3; 3,4; 4,5; 5,6; 6,7; 7,8]; m1 = [5,6]; %在close中 此时flag应为1 targetInd 应为 5 m2 = [0,0]; %不在open中, 此时flag应为2 targetInd 应为空[] m3 = [3,3]; %在open中 此时flag应为3 targetInd 应为 3 [flag,targetInd] = FindList(m1,open,close) %flag = 1 targetInd = 5 [flag,targetInd] = FindList(m2,open,close) %flag = 2 targetInd = [] [flag,targetInd] = FindList(m3,open,close) %flag = 3 targetInd = 3 %} end4、GetBoundary.mfunction boundary=GetBoundary(map) %获得地图的边界的坐标 boundary=[]; for i1=0:(map.XYMAX+1) boundary=[boundary;[0 i1]]; end for i2=0:(map.XYMAX+1) boundary=[boundary;[i2 0]]; end for i3=0:(map.XYMAX+1) boundary=[boundary;[map.XYMAX+1 i3]]; end for i4=0:(map.XYMAX+1) boundary=[boundary;[i4 map.XYMAX+1]]; end end5、GetObstacle.mfunction obstacle=GetObstacle(nob,obstacle,map) %生成障碍点的坐标 ob=round(rand([nob,2])*map.XYMAX); %生成的障碍点有可能是和start点和goal点坐标重合的,需要删除,removeInd为重合点的数组索引index removeInd=[]; %遍历ob数组,检查哪些坐标与start和goal重合,并将其索引存在removeInd中 for io=1:length(ob(:,1)) if(isequal(ob(io,:),map.start) || isequal(ob(io,:),map.goal)) removeInd=[removeInd;io]; end end %将重复的节点置空,去掉 ob(removeInd,:)=[]; %将ob障碍点加入到obstacle中(obstacle中已经包括边界节点的坐标了,这里还要再加上内部障碍点的坐标) obstacle=[obstacle;ob];6、GetPath最后得到整个路径的坐标function path=GetPath(close,start) ind=1; path=[]; while 1 path=[path; close(ind,1:2)]; if isequal(close(ind,1:2),start) break; end for io=1:length(close(:,1)) if isequal(close(io,1:2),close(ind,5:6)) ind=io; break; end end end end7、h.m启发函数的代价值,这里采用的是曼哈顿距离function hcost = h( m,goal ) %计算启发函数代价值 ,这里采用曼哈顿算法 hcost =10* abs( m(1)-goal(1) )+10*abs( m(2)-goal(2) ); end8、isObstacle.m判断一个节点是否为障碍点(边界点也认为是障碍点)function flag = isObstacle( m,obstacle ) %判断节点m是否为障碍点,如果是就返为1,不是就返回0 for io=1:length(obstacle(:,1)) if isequal(obstacle(io,:),m(1:2)) flag=true; return; end end flag=false; end9、isopen.m判断一个节点是否在open列表中,感觉这个函数的功能和3中的FindList函数功能有些重复,但还是编了这个函数function [isopenFlag,Id] = isopen( node,open ) %判断节点是否在open列表中,在open中,isopenFlag = 1,不在open中,isopenFlag = 0 .并反回索引号 isopenFlag = 0; Id = 0; %如果open列表为空,则不在open列表中 if isempty(open) isopenFlag = 0; else %open列表不为空时 for i = 1:length( open(:,1) ) if isequal( node(1:2) , open(i,1:2) ) %在Openlist中 isopenFlag = 1; Id = i; return; end end end end10、MotionModel.m得到当前节点周边的八个相邻节点的坐标差值和移动距离function next = MotionModel() %当前节点 周围的八个相邻节点 与 当前节点的坐标差值(前两列) %当前节点 周围的八个相邻节点 与 当前节点的距离值(最后一列) next = [-1,1,14;... 0,1,10;... 1,1,14;... -1,0,10;... 1,0,10;... -1,-1,14;... 0,-1,10;... 1,-1,14]; end11、PlotGrid.m绘制function PlotGrid( map ) %PLOTGRID Summary of this function goes here % Detailed explanation goes here %绘制网格 for i = 1:map.XYMAX+3 line([-0.5,map.XYMAX+1.5],[i-1.5,i-1.5]); end for j = 1:map.XYMAX+3 line([j-1.5,j-1.5],[-0.5,map.XYMAX+1.5]); end hold on; plot(map.start(1),map.start(2),'og'); hold on; plot(map.goal(1),map.goal(2),'ob'); axis([-1.5,map.XYMAX+2.5,-1.5,map.XYMAX+2.5]); axis equal; end12、FillPlot.mfunction FillPlot(coord,color) %coord为给出的点的坐标,为 n by 2 的向量,第一列为点的x坐标,第二列为点的y坐标 %我们画出以这些点为中心,边长为1的填充正方形 color为颜色 如color = 'k'时,表示黑色 for i = 1:length(coord(:,1)) x = coord(i,1); y = coord(i,2); X = [x-0.5,x+0.5,x+0.5,x-0.5]; Y = [y-0.5,y-0.5,y+0.5,y+0.5]; fill(X,Y,color); hold on; end axis equal; end
2022年05月09日
398 阅读
0 评论
0 点赞
1
2
3
...
5