当前位置: 首页 > news >正文

基于栅格占据概率和距离场的机器人覆盖轨迹模拟

基于栅格占据概率和距离场的机器人覆盖轨迹模拟

简介

辐射场模型实现

理论基础

指数函数建模

我们使用指数函数来表示机器人在某个栅格上停留时间对覆盖概率的影响:

p ( t ) = 1 − e − λ t p(t) = 1 - e^{-\lambda t} p(t)=1eλt

其中 λ \lambda λ 是控制增长速率的参数, t t t 是停留时间。

高斯函数建模

为了表示机器人停留位置对周围栅格的辐射效应,我们使用二维高斯函数

数学形式

  1. 使用指数函数表示停留时间对覆盖概率的影响:

    p ( t ) p(t) p(t) 表示机器人在某个栅格上停留时间 t t t 对应的覆盖概率,可以使用指数函数来建模:

    p ( t ) = 1 − e − λ t p(t) = 1 - e^{-\lambda t} p(t)=1eλt

    其中 λ \lambda λ 是一个控制增长速率的参数。当 t t t 较小时,覆盖概率增长较快;当 t t t 较大时,覆盖概率增长变缓,最终趋于1。

  2. 考虑周围栅格的辐射效应:

    为了表示停留时间对周围栅格的影响,可以使用二维高斯函数来建模这种"辐射"效应:

    G ( x , y ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x, y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2+y^2}{2\sigma^2}} G(x,y)=2πσ21e2σ2x2+y2

    其中 ( x , y ) (x, y) (x,y) 表示相对于中心栅格的坐标, σ \sigma σ 控制辐射范围。

  3. 结合指数函数和高斯函数:

    将指数函数和高斯函数相乘,得到综合考虑停留时间和辐射效应的覆盖概率函数:

    P ( t , x , y ) = ( 1 − e − λ t ) ⋅ 1 2 π σ 2 e − x 2 + y 2 2 σ 2 P(t, x, y) = (1 - e^{-\lambda t}) \cdot \frac{1}{2\pi\sigma^2} e^{-\frac{x^2+y^2}{2\sigma^2}} P(t,x,y)=(1eλt)2πσ21e2σ2x2+y2

    这个函数表示,对于中心栅格 ( 0 , 0 ) (0, 0) (0,0),覆盖概率主要由停留时间 t t t 决定;对于周围栅格 ( x , y ) (x, y) (x,y),覆盖概率同时受到停留时间 t t t 和距离中心栅格的距离影响。

在数学上,这些方法可以称为:

  1. 指数函数建模(Exponential Function Modeling):用于表示停留时间对覆盖概率的影响。

  2. 二维高斯函数(2D Gaussian Function):用于表示停留时间对周围栅格的辐射效应。

  3. 函数组合(Function Composition):将指数函数和高斯函数相乘,得到综合考虑停留时间和辐射效应的覆盖概率函数。

这种将多个函数组合以表示复杂现象的方法在数学建模中非常常见,可以根据具体问题选择合适的函数形式。

当然可以!下面是一个动态演示机器人在二维栅格地图上停留,并用颜色深浅表示栅格被占据情况的Python demo:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimationdef exponential_coverage(t, lambda_):return 1 - np.exp(-lambda_ * t)def gaussian_2d(x, y, sigma):return 1 / (2 * np.pi * sigma ** 2) * np.exp(-(x ** 2 + y ** 2) / (2 * sigma ** 2))def combined_coverage(t, x, y, lambda_, sigma):return exponential_coverage(t, lambda_) * gaussian_2d(x, y, sigma)# 设置参数
lambda_ = 0.1
sigma = 1.5
map_size = 30
robot_pos = (10, 14)# 生成网格坐标
x, y = np.meshgrid(np.arange(map_size), np.arange(map_size))# 初始化覆盖概率矩阵
coverage = np.zeros((map_size, map_size))# 创建图形和颜色条
fig, ax = plt.subplots()
im = ax.imshow(coverage, cmap='viridis', vmin=0, vmax=1)
fig.colorbar(im)# 更新覆盖概率矩阵的函数
def update(t):global coveragex_rel, y_rel = x - robot_pos[0], y - robot_pos[1]coverage += combined_coverage(1, x_rel, y_rel, lambda_, sigma)im.set_data(coverage)ax.set_title(f'Coverage at t={t}')return [im]# 创建动画
ani = FuncAnimation(fig, update, frames=np.arange(0, 20), interval=500, blit=True)plt.show()

首先定义了与之前相同的三个函数。然后,设置了模型参数 lambda_sigma、地图大小 map_size 以及机器人的初始位置 robot_pos

创建了一个 map_size * map_size 的网格坐标系,并初始化了一个全零的覆盖概率矩阵 coverage。使用 Matplotlib 创建图形和颜色条,并将 coverage 矩阵可视化。

update 函数用于更新覆盖概率矩阵。在每一帧中,我们计算网格坐标相对于机器人位置的偏移量,并使用 combined_coverage 函数计算每个坐标点的覆盖概率增量,将其累加到 coverage 矩阵中。然后,更新图像数据和标题。

最后,我们使用 Matplotlib 的 FuncAnimation 函数创建动画,每隔500毫秒更新一帧,共20帧。

运行这个demo,你会看到一个动态演示,显示机器人停留在 (10, 14) 位置时,周围栅格的占据情况随时间变化。颜色越深表示占据概率越高。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
如果机器人走出一条轨迹,那就是如下图:
在这里插入图片描述

参考论文

  1. Zelinsky, A. (1992). A mobile robot exploration algorithm. IEEE Transactions on Robotics and Automation, 8(6), 707-717.

  2. Stachniss, C., & Burgard, W. (2003). Coverage of unknown environments with mobile robots using sparse models. Proceedings of the European Conference on Mobile Robots (ECMR), 1-8.

  3. Solanas, A., & Garcia, M. A. (2004). Coordinated multi-robot exploration through unsupervised clustering of unknown space. Proceedings of the IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), 717-721.

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux安装MySQL教程【带图文命令巨详细】
  • springcloudalibaba项目注册nacos,在nacos上修改配置项不生效问题
  • Zabbix6.0自定义监控项
  • [Algorithm][动态规划][01背包问题][目标和][最后一块石头的重量Ⅱ]详细讲解
  • win10文件夹.git或者文件被隐藏的开启姿势
  • Halcon 双相机标定与拼图(一)
  • 内存管理--3.用幻灯片讲解C++手动内存管理
  • memory动态内存管理学习之unique_ptr
  • 探究Vue源码:深入理解diff算法
  • Codeforces Round 950 (Div. 3)
  • Zemax中FFT PSF和惠更斯PSF的区别?
  • GA/T 1400视频汇聚平台EasyCVR级联后,平台显示无通道是什么原因?
  • 【JavaScript脚本宇宙】创造声音的魔法:深入了解Web音频处理库
  • Spring Data Jpa 实现批量插入或更新
  • 【职业思考】程序员应该有什么职业素养?
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【剑指offer】让抽象问题具体化
  • 11111111
  • Android框架之Volley
  • css选择器
  • Go 语言编译器的 //go: 详解
  • Intervention/image 图片处理扩展包的安装和使用
  • KMP算法及优化
  • Puppeteer:浏览器控制器
  • Python_OOP
  • Python实现BT种子转化为磁力链接【实战】
  • vue 个人积累(使用工具,组件)
  • vue学习系列(二)vue-cli
  • 闭包--闭包作用之保存(一)
  • 对超线程几个不同角度的解释
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 将 Measurements 和 Units 应用到物理学
  • 聊聊redis的数据结构的应用
  • 前端面试之闭包
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 用Canvas画一棵二叉树
  • 【干货分享】dos命令大全
  • 阿里云重庆大学大数据训练营落地分享
  • ​2021半年盘点,不想你错过的重磅新书
  • ​如何防止网络攻击?
  • # Redis 入门到精通(一)数据类型(4)
  • $$$$GB2312-80区位编码表$$$$
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (MATLAB)第五章-矩阵运算
  • (二) 初入MySQL 【数据库管理】
  • (二)PySpark3:SparkSQL编程
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (五)Python 垃圾回收机制
  • (一)Thymeleaf用法——Thymeleaf简介
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu