自动寻路是机器人导航的核心技术,其原理主要涉及机器人与环境之间的复杂信息交互与处理。在自动寻路过程中,机器人依靠先进的传感器系统,如高清摄像头、精密激光雷达和灵敏超声波装置,全方位感知周围环境。这些传感器能够实时捕捉并分析环境中的障碍物、地形变化和关键路标,为机器人提供精确的导航数据。

自动寻路在多个领域发挥着关键作用,从图扑的数据中心机房的自动化巡检系统,到智能机器人的导航系统,再到智慧码头堆场的智能化管理,自动寻路技术无处不在。该功能不仅能规划出最优路线,还能实时考虑障碍物避让等复杂的实际因素,灵活调整路径以确保安全和效率。

乍听之下,自动寻路功能略显复杂,实现过程中也确实涉及了一些算法。在具体实施之前,我们需要先解决两个关键问题:

1. 如何避开场景中的障碍物?

2. 如何计算最佳路径?

针对这两处问题,我们可以利用图扑软件自研 HT for Web 提供的 ht-astar.js 插件。该插件具备初始化网格和自动搜索路径等功能,高效简化了自动寻路的实现过程。

系统分析

场景网格化

先将场景划分成二维网格,障碍物分布于不同的网格单元上,部分较大的障碍物可能会占据多个网格单元。路径计算实际上是分析网格的占用情况,当平台监测到某个网格被占用时,系统会自动寻找择优生成一条绕行路径。

在开发时,首先需要去实例化 ht.Astar.Finder(view, params)。其中 view 可以是 ht.graph.GraphView 或者 ht.graph3d.Graph3dView。params 是一个包含基础属性设置的对象。以下列举了一些 params 的常用参数:

✧simplify:是否启用路径简化。

✧closest:是否启用最近路径优化。

✧nodeRectExtend:扩展节点范围。

✧gridSizeY:网格在 Y 方向上的大小。

✧gridSizeX:网格在 X 方向上的大小。

✧diagonal:是否允许沿对角线方向移动。

✧fastOverlap:是否启用快速监测重叠算法。

✧filter:过滤函数用于在路径计算过程中过滤特定节点。

✧turnPunish:转弯惩罚系数,数值越高表示越倾向于直线路径。

具体代码实现:

const hindrance = dm.getDataByTag(‘hindrance’);
const astar = new ht.Astar.Finder(view, {
gridSizeX: 50, // 网格
gridSizeY: 50,
nodeRectExtend: 50,
fastOverlap: false,
filter: function (data) {
return data.isDescendantOf(hindrance);
}
});
 

路径计算

在路径计算过程中,系统需要实时监测每个网格单元的占用状态。若规划的路径遇到被障碍物占用的网格,系统会自动寻找绕行路径,以动态避开障碍物

在开发过程中,我们需要监听场景背景的点击事件,获取点击位置的坐标。然后,结合起点坐标,通过 astar.findPath(pFrom, pTo) 函数计算出具体路径。计算得到的路径是一组点位数据,可以利用这些数据在场景中绘制出一条路径管道。具体代码实现:

view.mi(function (e) {
const { kind, data, event } = e;
if (kind === 'clickBackground') {
const animOb = view.dm().getDataByTag('people'); // 获取人物节点
let pFrom = animOb.p3(); // 获取人物节点的坐标(起点坐标)
pFrom = { x: pFrom[0], y: pFrom[2] };
let position = view.getHitPosition(event); // 根据鼠标事件获取场景中的逻辑坐标
const pTo = { x: position[0], y: position[2] };
const path = astar.findPath(pFrom, pTo); // 获取路径
createPloyline(path); // 生成管道
}
})
// 生成管道
createPloyline(){
const points: any = [];
path.forEach((p: any, i: number) => {
points.push({ x: p.x, y: p.y, e: 0 });
})
const polyline = new ht.Polyline();
polyline.s({
"shape3d": false,
});
polyline.setPoints(points);
view.dm().add(polyline);
}
 

路径动画

在场景中生成管道后,人物节点可沿此管道移动。人物节点沿管道运动的代码如下:

const animOb = dm.getDataByTag('people');
animOb.playAnimation('walk'); // 示例中人物模型使用的是 fbx 模型,可播放节点上的动画
const length = view.getLineLength(polyline);
let moveAnim = null;
const params = {
delay: 100,
duration: 1000 * (length / 200), // 根据管道的长度设定动画周期
easing: function (t) { return t },
action: function (v, t) {
var offset = view.getLineOffset(polyline, length * v);
if (offset) {
var point = offset.point,
px = point.x,
py = point.y,
pz = point.z,
tangent = offset.tangent,
tx = tangent.x,
ty = tangent.y,
tz = tangent.z;
animOb.lookAt([px + tx, py + ty, pz + tz], 'front');
animOb.p3(px, py, pz);
}
// 人物运动时,视角始终跟随
view.setCenter([px, py, pz]);
view.setEye([px + 400, py + 800, pz + 400]);
},
finishFunc: () => {
moveAnim = null;
// 切换场景视角
view.moveCamera([-84, 3435, 3142], [-28, -821, -160], {
duration: 1000
})
animOb.pauseAnimation(); // 暂停人物模型动画
}
};
moveAnim = ht.Default.startAnim(params);

优化视觉效果

基于上述,我们已实现了基本的自动寻路功能。在实际项目中仍需提升一定的视觉效果,让展示页面足够美观,我们可以采取以下策略:

  • 首先,将管道路径隐藏(使用 polyline.s('transparent.mask', true));
  • 随后,利用 ht.Shape 节点并设置贴图来呈现人物的运动轨迹。这样不仅能实现功能,还能大幅增强视觉吸引力。

具体实现代码如下:

createShape(points) {
if(uvAnim) uvAnim.pause(); // 创建新的 shape 前将旧shape 的 uv 偏移动画移除
const shape = this.shape = new ht.Shape();
shape.s({
"shape.border.color": "rgb(255,0,0)",
"all.visible": false,
"all.transparent": true,
"top.visible": true,
"top.image": "assets/arrow.png",
"top.uv.scale": [
length / 500,
1
],
"texture.cache": true,
"3d.selectable": true,
"3d.editable": false,
"3d.movable": false,
"3d.visible": true
})
dm.add(shape);
shape.setThickness(30);
shape.setPoints(points);
return shape;
}
// ht.Shape 的 uv 偏移动画
playShapeAnim(shape) {
if (!shape) return;
const params = {
duration: 2000,
easing: function (t: number) {
return t;
},
action: function (v: number, t: number) {
shape.s("all.uv.offset", [v, 0]);
},
finishFunc: () => {
uvAnim = null;
uvAnim = ht.Default.startAnim(params);
}
};
uvAnim = ht.Default.startAnim(params);
}
const points: any = [];
path.forEach((p: any, i: number) => {
points.push({ x: p.x, y: p.y, e: 0 });
})
const shape = createShape(points);
let uvAnim = null;
playShapeAnim(shape); // 执行shape 的 uv 偏移动画
 

总结

作为开发者的我们,将继续探索和优化自动寻路技术,利用图扑 HT 提供的插件工具,不断提升算法效率和用户体验。通过合理的参数设置、精确的网格划分和智能的路径规划,为各种应用场景提供更加出色的自动寻路解决方案。

您可以至图扑软件官网查看更多案例及效果:

https://www.hightopo.com/demos/index.html

动态避障-图扑自动寻路 3D 可视化的更多相关文章

  1. 图扑软件 3D 组态编辑器,低代码零代码构建数字孪生工厂

    行业背景 随着中国制造 2025 计划的提出,新一轮的工业改革拉开序幕.大数据积累的指数级增长为智能商业爆发奠定了良好的基础,传统制造业高污染.高能耗.低效率的生产模式已不符合现代工业要求. 图扑拖拽 ...

  2. 图扑 Web 可视化引擎在仿真分析领域的应用

    ​ 前言 在数字孪生和仿真研究过程中,会产生大量和三维空间相关的数值信息,比如设备外观的扫描数据.地形扫描数据.生产设备温度场/压力场.流体的速度场.流体扩散,以及各种仿真数据:速度,压力,应力,温度 ...

  3. 图数据 3D 可视化在 Explorer 中的应用

    本文首发于 NebulaGraph 公众号 前言图数据可视化是现代 Web 可视化技术中比较常见的一种展示方式,NebulaGraph Explorer 作为基于 NebulaGraph 的可视化产品 ...

  4. 打造综合性智慧城市之朔州开发区 3D 可视化

      前言 近几年,我国智慧城市建设步伐也不断加快,党中央和国务院也更加注重智慧园区的建设与发展,智慧园区建设与园区产业发展相结合,向着创新化.生态化发展,更加注重高新技术.绿色环保型等产业的发展,将管 ...

  5. 图扑软件正式加入腾讯智维生态发展计划,智能 IDC 开启数字经济新征程

    4 月 23 日,主题为<智汇科技,维新至善>的腾讯数据中心智维技术研讨会在深圳胜利召开,发布了腾讯智维 2.0 技术体系,深度揭秘了智维 2.0 新产品战略和技术规划.图扑软件(High ...

  6. 汽车制造工艺 2.5D 可视化组态监控 | 图扑软件

    前言 随着世界经济的不断发展,汽车作为一个如今随处可见的物体,从大体上概括是由四大部分组成:发动机.底盘.车身.电气系统.看似简单的几个名词组件,其内部却是由无数的细小零件构成,一辆汽车更是由上万个微 ...

  7. 机器人局部避障的动态窗口法(dynamic window approach) (转)

    源:机器人局部避障的动态窗口法(dynamic window approach) 首先在V_m∩V_d的范围内采样速度: allowable_v = generateWindow(robotV, ro ...

  8. SLAM+语音机器人DIY系列:(六)SLAM建图与自主避障导航——2.google-cartographer机器人SLAM建图

    摘要 通过前面的基础学习,本章进入最为激动的机器人自主导航的学习.在前面的学习铺垫后,终于迎来了最大乐趣的时刻,就是赋予我们的miiboo机器人能自由行走的生命.本章将围绕机器人SLAM建图.导航避障 ...

  9. ROS知识(14)----局部避障的动态窗口算法(DWA)及其调试的方法

    Dynamic Window Approach(DWA)是重要的局部轨迹规划算法,ROS中使用了DWA算法获得了很好的局部路径规划的效果.具体的教程可参考官方的导航调试资料Navigation Tun ...

  10. ros move_base costmap 理解和实现动态窗口法避障

    以下大部分内容参考自 ros_by_example_hydro_volume_1.pdf local costmap 是怎么生成的?跟三维点云有什么关系? global costmap在没有全局地图下 ...

随机推荐

  1. 【牛客刷题】HJ6 质数因子

    题目链接 这道题本身更多的是考察如何计算一个数的质数因子,更像是一道数学题,用到了循环的方法: package main import ( "fmt" "math&quo ...

  2. 利用Stream实现简单的等差数列求和

    我们都熟知高斯的故事,认识等差数列也是从这个故事开始的,编程课程为了练习for循环,也在不断的练习这个从1加到100的例子,那么原始的办法是这样的: int sum1 = 0; for (int i ...

  3. 使用python-slim镜像遇到无法使用PostgreSQL的问题

    前言 之前不是把 DjangoStarter 的 docker 方案重新搞好了吗 一开始demo部署是使用 SQLite 数据库的,用着没问题,但很快切换到 PostgreSQL 的时候就遇到问题了- ...

  4. WM_LBUTTONDOWN,WM_LBUTTONUP

    WM_LBUTTONDOWN //鼠标左键按下消息WM_LBUTTONUP //鼠标左键弹起消息参数和按下一样 当用户在窗口的客户区域中按住鼠标左键时,会发布WM_LBUTTONDOWN消息.如果未捕 ...

  5. MFC连接Access2007数据库

    // TODO: 在此添加额外的初始化代码 //初始化ADO环境 if (!AfxOleInit()) { AfxMessageBox(L"OLE初始化失败"); return F ...

  6. 22.11.13 CCPC 广州站 记录

    上来看A(树上DP),直观认为可做,前后拉着队友研究了两个小时,经过lcx,lgy两次hack正确性,最终基本得到答案思路,因为过于复杂和担心正确性问题不敢写. 反思:1.正式比赛中不应该一开始就将大 ...

  7. 在NextChat中接入SiliconCloud API 体验不同的开源先进大语言模型

    NextChat介绍 One-Click to get a well-designed cross-platform ChatGPT web UI, with GPT3, GPT4 & Gem ...

  8. P10789 [NOI2024] 登山

    思路: 我们可以对于每个 \(i\) 找到它能跳到的最远的点和最近的点,倍增求一下 \(k\) 级祖先即可,令 \([l_i,r_i]\) 新表示 \(i\) 能跳到其祖先中深度在 \([l_i,r_ ...

  9. 解密华为问界M7 Pro:智能出行的全新里程碑与技术亮点

    解读华为问界M7 Pro的智能里程碑 引言 2024年8月,智能出行领域迎来了一个激动人心的时刻--问界M7 Pro的重磅发布.这款智能SUV,不仅是华为在汽车领域的又一次大胆尝试,更是鸿蒙智行系统的 ...

  10. 使用 nuxi init 创建全新 Nuxt 项目

    title: 使用 nuxi init 创建全新 Nuxt 项目 date: 2024/9/6 updated: 2024/9/6 author: cmdragon excerpt: 摘要:本文介绍了 ...