JS加载AGV地图(二)

用网页加载仙工的AGV地图,地图的格式是smap

首先,需要一个加载文件按钮和一个DIV用作画布。

<html>
    <head>
    </head>
    <body>
        <a><input type="file" id="selectFiles" onchange="LoadMap()"  value="加载smap文件" ></a>
        <div id="div" style="border:1px solid #000;"><canvas id="canvas"></canvas></div>

接下来,准备绘图环境:

<script>
	var vShaderSource = 'attribute vec2 a_Position;'+
		'attribute vec2 a_Screen_Size;'+
		'uniform mat4 Pmatrix;'+
		'uniform mat4 Vmatrix;'+
		'uniform mat4 Mmatrix;'+
		'attribute vec3 color;'+//the color of the point
		'varying vec3 vColor;'+
		'void main(void) { '+//pre-built function
			//视图坐标(0~800,0~600)转换为 OPENGL坐标(-1.0,1.0)之间的值
			'vec2 xyposition = (a_Position / a_Screen_Size) * 2.0 - 1.0;'+
			'vec4 position=vec4(xyposition,0.0,1.0);'+
		   'gl_Position = Pmatrix*Vmatrix*Mmatrix*vec4(position);'+
		   'gl_PointSize = 1.0;'+
		   'vColor = color;'+
		'}';

	 var fShaderSource = 'precision mediump float;'+
		'varying vec3 vColor;'+
		'void main(void) {'+
		   'gl_FragColor = vec4(vColor, 1.);'+
		'}';
    let canvas = document.getElementById('canvas');
    canvas.width = window.innerWidth;//当前的宽度
    canvas.height = window.innerHeight;//当前的高度
    let gl = canvas.getContext('webgl');
    //创建顶点着色器
    let vShader = gl.createShader(gl.VERTEX_SHADER);
    gl.shaderSource(vShader,vShaderSource);
    gl.compileShader(vShader);
	
    //创建片元着色器
    let fShader = gl.createShader(gl.FRAGMENT_SHADER);
    gl.shaderSource(fShader,fShaderSource);
    gl.compileShader(fShader);
	
    //创建一个完整的着色器
    let propgram = gl.createProgram();
    gl.attachShader(propgram,vShader);
    gl.attachShader(propgram,fShader);
    gl.linkProgram(propgram);
    gl.useProgram(propgram);
    let positions =[];//设置一个数据
	let resolution=1;
	let xmin=0;
	let ymin=0;
	let xmax=1;
	let ymax=1;
	let vectexs =[];//设置一个数据
	let x0=0;
	let y0=0;
    //设置缓冲区存放玩家点击的点的坐标
    let buffer = gl.createBuffer();
    //绑定缓冲区
    gl.bindBuffer(gl.ARRAY_BUFFER,buffer);
    //取到我们需要使用的变量
    let a_Position = gl.getAttribLocation(propgram,'a_Position');
    gl.enableVertexAttribArray(a_Position);
    //每次取两个数据
    let size = 2;
    //每个数据的类型是32位浮点型
    let type = gl.FLOAT;
    //不需要归一化数据
    let normalize = false;
    // 每次迭代运行需要移动数据数 * 每个数据所占内存 到下一个数据开始点。
    let stride = 0;
    // 从缓冲起始位置开始读取
    let offset = 0;
    // 将 a_Position 变量获取数据的缓冲区指向当前绑定的 buffer。
    gl.vertexAttribPointer(a_Position, size, type, normalize, stride, offset)

    //片元色器
    let u_Color = gl.getAttribLocation(propgram,'color');
    gl.vertexAttrib3f(u_Color,0.0,0.0,0.0);

    //顶点着色器
    //处理顶点着色器中的变量
    let a_Screen_Size = gl.getAttribLocation(propgram,'a_Screen_Size');//取到屏幕的大小
	//调用绘制上下文对象提供的API: vertexAttrib2f向存储位置进行传值
    gl.vertexAttrib2f(a_Screen_Size,canvas.width,canvas.height);//设置参数
	//获取地址
	var _PM = gl.getUniformLocation(propgram, "Pmatrix");
	var _VM = gl.getUniformLocation(propgram, "Vmatrix");
	var _MM = gl.getUniformLocation(propgram, "Mmatrix");
	//正交投影
	var p_matrix = orth_projection(-1,1,-1,1,1,100);
	//模型举证
	var m_matrix = [ 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 ];
	//视图矩阵
	var v_matrix = [ 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 ];
	//绑定 
	gl.uniformMatrix4fv(_PM, false, p_matrix);
	gl.uniformMatrix4fv(_VM, false, v_matrix);
	gl.uniformMatrix4fv(_MM, false, m_matrix);		 
	//背景色
	gl.clearColor(1,1,1,1.0);
    gl.clear(gl.COLOR_BUFFER_BIT);

这里还需要有按钮触发事件,该有的注释都加了,还不理解百度一下:

function LoadMap() {
		var file = document.getElementById("selectFiles").files[0];
		var name = file.name;//读取选中文件的文件名
		var path = document.getElementById("selectFiles").value;//读取选中文件的路径
		console.log("文件名:"+name+"大小:"+path);
		//获取读取我文件的File对象
		//alert(title:'hello',content:'success');
		var reader = new FileReader();//这是核心,读取操作就是由它完成.
		reader.readAsText(file,'UTF-8');//读取文件的内容,也可以读取文件的URL
		reader.onload = function (event) {
			//当读取完成后回调这个函数,然后此时文件的内容存储到了result中,直接操作即可
			var res=event.target.result;
			var strjson=JSON.parse(res);
			
			//计算比例,将地图缩放到最大
			xmin=strjson['header']['minPos']['x'];
			ymin=strjson['header']['minPos']['y'];

			xmax=strjson['header']['maxPos']['x'];
			ymax=strjson['header']['maxPos']['y'];
			//resg[0]=0.02;
			var resg=strjson['header']['resolution'];
			var scale=0;
			resolution=resg;
			for(var m=0;m<strjson['normalPosList'].length;m++)
			{
				//解析出的x,y值
				var resx=strjson['normalPosList'][m]['x'];
				var resy=strjson['normalPosList'][m]['y'];
				//最小值移动到0,0
				resx=resx-xmin;
				resy=resy-ymin;
				//然后按比例缩放到932,641
				var scalex=canvas.width/(xmax-xmin);
				var scaley=canvas.height/(ymax-ymin);
				
				if(scalex>scaley)
				{
					scale=scaley;
				}else
				{
					scale=scalex;
				}
				//其实最好的办法是坐标除以resolution,然后按比例缩放
				resx=resx*scale;
				resy=resy*scale;
				//y轴方向由向下转为向上.
				resy=canvas.height-resy;
				positions.push(resx,resy);
			}
			gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(positions),gl.STATIC_DRAW);
			gl.drawArrays(gl.POINTS, 0,  positions.length);
			
			//画高级点
			var points=[];
			var width=3;
            var height=2;
            for(var m=0;m<strjson['advancedPointList'].length;m++)
            {
                //最小值移动到0,0
                var res_x=strjson['advancedPointList'][m]['pos']['x']-xmin;
                var res_y=strjson['advancedPointList'][m]['pos']['y']-ymin;
                //其实最好的办法是坐标除以resolution,然后按比例缩放
                res_x=res_x*scale;
                res_y=res_y*scale;
                res_y=canvas.height-res_y;
                points.push(res_x-width,res_y-height);
                points.push(res_x+width,res_y-height);
                points.push(res_x+width,res_y-height);
                points.push(res_x+width,res_y+height);
                points.push(res_x+width,res_y+height);
                points.push(res_x-width,res_y+height);
                points.push(res_x-width,res_y+height);
                points.push(res_x-width,res_y-height);
            }
			gl.vertexAttrib3f(u_Color,0.0,0.0,1.0);
			gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(points),gl.STATIC_DRAW);
			gl.drawArrays(gl.LINES, 0,  points.length/2);
			
			//画高级曲线
			var points=[];
			for(var m=0;m<strjson['advancedCurveList'].length;m++)
			{
				//最小值移动到0,0
				var res_sx=strjson['advancedCurveList'][m]['startPos']['pos']['x']-xmin;
				var res_sy=strjson['advancedCurveList'][m]['startPos']['pos']['y']-ymin;
				var res_ex=strjson['advancedCurveList'][m]['endPos']['pos']['x']-xmin;
				var res_ey=strjson['advancedCurveList'][m]['endPos']['pos']['y']-ymin;
				//其实最好的办法是坐标除以resolution,然后按比例缩放
				res_sx=res_sx*scale;
				res_sy=res_sy*scale;
				res_sy=canvas.height-res_sy;
				res_ex=res_ex*scale;
				res_ey=res_ey*scale;
				res_ey=canvas.height-res_ey;
				
				points.push(res_sx,res_sy);
				points.push(res_ex,res_ey);
			}
			gl.vertexAttrib3f(u_Color,0.0,0.0,1.0);
			gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(points),gl.STATIC_DRAW);
			gl.drawArrays(gl.LINES, 0,  points.length/2);
		}
	}

两个函数,用到了其中一个:

    function orth_projection(Lpos,Rpos,Tpos,Bpos,Znear,Zfar)
	{
		return [2/(Rpos-Lpos),0,0,0,
		0,2/(Tpos-Bpos),0,0,
		0,0,1/(Zfar-Znear),0,
		-(Rpos+Lpos)/(Rpos-Lpos),-(Tpos+Bpos)/(Tpos-Bpos),-Znear/(Zfar-Znear),1];
	}
	function get_projection(angle, a, zMin, zMax) {
		var ang = Math.tan((angle*.5)*Math.PI/180);//angle*.5
		return [
		   1/ang/a, 0 , 0, 0,
		   0, 1/ang, 0, 0,
		   0, 0, -(zMax+zMin)/(zMax-zMin), -1,
		   0, 0, (-2*zMax*zMin)/(zMax-zMin), 0 
		   ];
	 }
</script>
</body>
</html>

好了,把这些放到一个网页文件中,存为html格式的文件,在浏览其中打开,就可以打开smap地图了。

实战分享:如何用GOJS快速搭建AGV/RGV调度系统的地图编辑器(附完整代码) 本文详细介绍了如何利用GOJS这一强大的JavaScript图表库,快速构建一个功能完备的AGV/RGV调度系统地图编辑器。文章从核心优势分析入手,提供了从环境搭建、节点与路径定义、交互定制到地图序列化与系统集成的完整实战代码,帮助开发者高效解决智能仓储项目中地图可视化编辑与配置的难题。 阅读详情

相关推荐

openTCS RMI接口实战:从零开始构建自己的AGV调度控制台

本文详细介绍了如何利用openTCS的RMI接口从零构建AGV调度控制台,涵盖环境配置、核心接口解析、实时事件处理及高级功能实现。通过实战代码示例,帮助开发者掌握AGV和RGV的智能调度技术,特别适用于工业自动化领域的物流效率提升。

pink的博客 500

C#开发AGV地图编辑软件

4、程序都是源码,可以直接在此基础上进行二次开发。1、自由添加和删除站点、停车位、小车、运行路径。2、编辑得地图以XML文件保存。3、导入编辑好地图的XML文件。

panjinliang066333的博客 2409

基于CBS算法的多AGV避障仿真演示系统(含完整JS源码与配置文档)

直接双击index.html就能运行的多AGV协同避障仿真环境,用纯JavaScript实现冲突基搜索(CBS)算法,在网格地图中为多个自动导引车生成无碰撞路径。支持自由设置起点、终点、障碍物位置和地图大小,实时显示每台AGV的移动轨迹及冲突解决过程。底层调用A*算法完成单机寻路,CBS_v2.js负责检测路径冲突并构建约束树进行回溯调度;Environment.js管理地图状态,Agent.js封装AGV行为逻辑,sketch.js配合p5.js完成可视化渲染。所有JS模块职责清晰、相互解耦,通过Basi

l6m7n8的博客 170

AGV调度系统开发1(电子地图编辑软件)

前言 AGV及其调度系统作为智能制造领域的核心技术之一,具有较强的专业性,本系列将全面的讲解AGV调度系统的功能与实现。 该系列中介绍的方法和软件是完全经本人研发的,也一直在完善中,若有志同道合的朋友,可以一起探讨。 本文内容 本文简单说一下AGV调度系统的重要工具:地图编辑软件。作为AGV调度系统的基础之一,电子地图以抽象与现实有机结合的方式描述了AGV运行的环境地图,使用该地图编辑软件可以绘制电子地图,电子地图绘制完毕之后,可在调度系统中进行仿真,从而验证调度算法和功能等,进而实现多台AGV的统一调度。

Sun_tian的博客 5467

多AGV路径规划仿真:栅格地图与A*冲突消解实战解析

路径规划是移动机器人自主导航的核心技术,其本质是在约束条件下搜索最优可行路径。A*算法作为经典的启发式搜索方法,凭借高效性与最优性,常被用于二维栅格地图上的静态路径求解。栅格地图通过将环境离散化为可通行与障碍两种状态,为算法提供了简洁的建模基础。然而,在多AGV协同作业场景中,单台车辆的路径最优并不等于系统整体高效——车辆之间的相互避让、交通管制与死锁消解成为决定性因素。该技术在电商仓储、智能制造与物流分拣等领域具有广泛的应用价值,直接影响系统吞吐量与运行安全。本文基于一个多AGV路径规划仿真工程,从栅格地

weixin_30846347的博客 277

smap:内置地图不支持并发。 这是使用通道的并发映射,没有互斥锁

共享地图 内置地图不支持并发。 这是使用通道的并发映射,没有互斥锁。 GoDoc: ://godoc.org/github.com/jaehue/smap 用法 去弄: $ go get github.com/jaehue/smap 导入包: import ( "github.com/jaehue/smap" ) 例子 // Create new map m := smap.New() // Set item m.Set("foo", "bar") // Get item t, ok := m.Get("foo") // Check if item exists if ok { bar := t.(string) fmt.Println("bar: ", bar) } // Remove item m.Remove("foo") // Count fmt.Pr

JS代码加载AGV地图(一)

AGV开发过程中难免会接触到地图,这里用JS试着来加载仙工的smap格式地图。把这些代码拷贝到网页文件中,在浏览其中打开网页。打开文件后就可以看到地图了,正在学习绘图的可以参考一下。选择打开文件,选择smap文件,就可以看到地图了。下一篇放出全部代码。

garyaofq的博客 1284

AGV地图编辑器

AGV地图编辑器,可以根据需求制作AGV运行地图,用到GDI和自定义控件技术,属性框反射修改,自定义方法,事件,属性等等.

Canvas加载AGV地图

Canvas加载AGV地图,理解起来没有难度

garyaofq的博客 928

AGV地图生成系统

能够根据客户需求自动生成AGV的地图,在VS2010下调试完毕,能够正常运行

柔性制造系统AGV动态调度模型与算法

柔性制造系统AGV动态调度模型与算法

OpenTCS绘制AGV地图用网页HTML加载

测试环境清单:openTCS-4.18.0-bin Nodejs+express+html5 使用OpenTCS绘制AGV地图: 绘制站点和路径 把地图另存为XML文件: 另存为XML文件 拷贝到expess的静态资源库 使用JavaScript加载站点和路径到HTML网页

weloveut的博客 3437

AGV调度系统地图建模参考文件 c++

c++制作的地图编辑、保存软件,可用于AGV调度软件中的地图编辑做参考,包括绘制图形、保存文件,打开历史文件等操作。

【栅格地图】基于Dijkstra法实现栅格地图自动导引搬运车AGV路径规划附Matlab代码

随着物流自动化程度不断提高,自动导引搬运车(AGV)在仓储、工厂运输等场景中的应用愈发广泛。高效的路径规划能显著提升 AGV 的工作效率,降低物流成本。栅格地图以其简单直观、易于计算机处理的特点,成为 AGV 路径规划常用的环境建模方式。Dijkstra 算法作为经典的最短路径搜索算法,能够在栅格地图中准确找到从起点到终点的最优路径。本文将详细阐述基于 Dijkstra 法在栅格地图中实现 AGV 路径规划的方法与过程。一、栅格地图构建1.1 栅格地图原理。

matlab_dingdang的博客 1020

C#AGV地图编辑软件

C#开发的AGV地图编辑软件,具体功能可以看我的博客 AGV地图编辑软件-功能介绍(一),需要的筒子自提,源码完全开放,无封装,可以进行二次开发,后台地图文件为XML文件,加上AGV的通讯协议就可以将站点信息下发到AGV内,Floyde路径算法写好了一个类在里面,可以直接调用!有问题可以私聊V:Little_lucky88888 不喜欢可退。

Cursor 详细使用

Cursor 是一款基于 VSCode 开发的 AI 驱动代码编辑器,集成 GPT-4、Claude3.5 等先进 LLM,具备代码补全、生成、解释、调试等功能,可提升开发效率和代码质量。3. 代码编辑:在编辑区编写代码,利用快捷键提升效率,如 Ctrl+Space 触发智能代码补全、Ctrl+K 润色或修改代码、Ctrl+L 智能问答与代码编辑。3. 代码解释:选中代码,按 Ctrl+L,输入如 “解释这段代码的功能”,Cursor 会给出详细解释。

坚持写博客,大家的关注是我前进的动力! 4796

基于动态窗口算法的AGV仿真避障:可设置起点目标点、地图及障碍物起始点目标的实现方法

本系统是一个基于动态窗口算法(Dynamic Window Approach, DWA)的多AGV(自动导引车)实时路径规划与避障仿真平台。系统支持在自定义栅格地图中设置多个AGV的起点、目标点、静态与动态障碍物,并实现AGV之间的优先级调度与实时避障。基于动态窗口算法的AGV仿真避障可设置起点目标点,设置地图,设置移动障碍物起始点目标点,未知静态障碍物。

2501_93693767的博客 181

从理论到实践:用CST微波工作室完成单站雷达RCS仿真的完整指南

本文提供了一份利用CST微波工作室进行单站雷达RCS仿真的完整实践指南。文章深入剖析了从求解器选择(重点推荐积分方程法)、模型与材料设置、平面波激励定义到后处理分析的完整逻辑链条,旨在帮助工程师不仅完成仿真,更能理解其背后的物理原理与工程考量,从而高效、精准地评估目标的电磁散射特性。

weixin_29256771的博客 173

【PyQt地图轨迹绘制】

PyQt地图轨迹绘制

qq_43762434的博客 4912

STM32驱动AS5600磁性旋转位置传感器模块

文章目录简介引脚定义I2C接口写数据读数据从指定的地址开始读数据驱动程序cubeMX配置驱动程序`bsp_as5600.h``bsp_as5600.c`测试程序参考资料 简介 AS5600 是一款易于编程的磁性旋转位置传感器,具有高分辨率 12 位模拟或 PWM 输出。 这种非接触式系统测量径向磁化轴上磁铁的绝对角度。 该 AS5600 专为非接触式电位计应用而设计,其坚固的设计消除了任何同质外部杂散磁场的影响。 引脚定义 I2C接口 7位设备地址为0x36(二进制表示为0110110) 支持标准模式和

ApexYuan 1万+

【Python】解决 ERROR: Exception:Traceback (most recent call last):(亲测有效)

1、遇到问题2、问题解决

Fanjufei的博客 1万+

使用QWebEngineView加载本地html以及在线地图实例

Qt5.5之后使用新的QWebEngineView代替了QWebKit。加载数据的方式也由同步变成了异步。 load函数原型: load(const QUrl &url) QFile file(htmlPath);//直接加载本地html文件,外部对象由本地文件的相对路径查找,因此不需要设置 if (!file.exists()) { return; } this->load(...

Stephen 7658

【毕设保姆级指南】基于YOLOv8的DAGM 2007工业缺陷检测系统从搭建到落地

本教程基于YOLOv8算法实现DAGM 2007工业缺陷检测系统,包含数据处理、模型训练和可视化界面开发全流程。首先对DAGM数据集进行格式转换和划分,然后通过YOLOv8训练工业缺陷检测模型,最终构建PyQt5交互界面实现缺陷可视化检测。该系统可用于智能制造中的产品质量控制,帮助快速定位工业产品缺陷,提升检测效率和准确性,为工业质检提供高效解决方案。

LXY_LOVE36的博客 181
上一篇: JS代码加载AGV地图(一)
下一篇: JS画布内生成图标,并实现拖拽,连线,刷新
水滴与鱼
博客等级 码龄16年 76粉丝 57原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水滴与鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值