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

2024-06-09 22:36

本文主要是介绍基于栅格占据概率和距离场的机器人覆盖轨迹模拟,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

简介

辐射场模型实现

理论基础

指数函数建模

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

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.

这篇关于基于栅格占据概率和距离场的机器人覆盖轨迹模拟的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046486

相关文章

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

hdu4865(概率DP)

题意:已知前一天和今天的天气概率,某天的天气概率和叶子的潮湿程度的概率,n天叶子的湿度,求n天最有可能的天气情况。 思路:概率DP,dp[i][j]表示第i天天气为j的概率,状态转移如下:dp[i][j] = max(dp[i][j, dp[i-1][k]*table2[k][j]*table1[j][col] )  代码如下: #include <stdio.h>#include

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

最大流=最小割=最小点权覆盖集=sum-最大点权独立集

二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。 在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。   二分图最小点权覆盖     从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模:     原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti