文章目录
动态窗口法(DWA)主要是在速度空间中采样多组速度,并模拟机器人在这些速度下一定时间内的轨迹。在得到多组轨迹以后,对这些轨迹进行评价,选取最优轨迹所对应的速度来驱动机器人运动。
动态窗口法将移动机器人的位置控制转换为速度控制。在利用速度模式对机器人运动轨迹进行预测时,首先需要对机器人的运动模型进行分析[1]。移动机器人采用的是两轮差速模型,
v
(
t
)
和
ω
(
t
)
v(t)和ω(t)
v(t)和ω(t)分别代表机器人在世界坐标系下的平移速度与角速度,反映了机器人的运动轨迹。在机器人的编码器采样周期
Δ
t
Δt
Δt内,位移较小,机器人作匀速直线运动,则机器人运动模型为:
x
(
t
)
=
x
(
t
−
1
)
+
v
(
t
)
Δ
t
cos
(
θ
(
t
−
1
)
)
y
(
t
)
=
y
(
t
−
1
)
+
v
(
t
)
Δ
t
sin
(
θ
(
t
−
1
)
)
θ
(
t
)
=
θ
(
t
−
1
)
+
ω
(
t
)
Δ
t
\begin{array}{l}x(t) = x(t - 1) + v(t)\Delta t\cos (\theta (t - 1))\\y(t) = y(t - 1) + v(t)\Delta t\sin (\theta (t - 1))\\\theta (t) = \theta (t - 1) + \omega (t)\Delta t\end{array}
x(t)=x(t−1)+v(t)Δtcos(θ(t−1))y(t)=y(t−1)+v(t)Δtsin(θ(t−1))θ(t)=θ(t−1)+ω(t)Δt式中
x
(
t
)
、
y
(
t
)
、
θ
(
t
)
x(t)、y(t)、θ(t)
x(t)、y(t)、θ(t)———t时刻机器人在世界坐标下的位姿。
动态窗口法将避障问题描述为速度空间中带约束的优化问题,其中约束主要包括差速机器人的非完整约束、环境障碍物的约束以及机器人结构的动力学约束。DWA算法的速度矢量空间示意图如图1-1所示,横坐标为机器人角速度
ω
ω
ω,纵坐标为机器人线速度
v
v
v,其中
v
max
{v_{\max }}
vmax、
v
min
{v_{\min }}
vmin为机器人最大、最小线速度,
ω
max
{\omega _{\max }}
ωmax、
ω
min
{\omega _{\min }}
ωmin为机器人最大、最小角速度;整个区域为
v
s
{v_{s }}
vs,所有白色区域
v
a
{v_{a }}
va为机器人安全区域,
v
d
{v_{d }}
vd为考虑电机扭矩在控制周期内限制的机器人可达速度范围,
v
r
{v_{r }}
vr为上述3个集合的交集最终确定的动态窗口。

在速度矢量空间
V
r
{V_{r}}
Vr中,根据线速度、角速度采样点数,将连续的速度矢量空间
V
r
{V_{r}}
Vr离散化,得到离散的采样点
(
v
,
ω
)
(v,ω)
(v,ω)。对于每一个采样点,根据机器人运动学模型预测下一时刻机器人的多个运动轨迹生成,如图1-2所示。

在采样的速度组中,有若干组轨迹是可行的,因此采用评价函数的方式为每条轨迹进行评价,采用的评价函数如下: G ( v , ω ) = σ ( α H e a d i n g ( v , ω ) + β O b s t a c l e ( v , ω ) + γ V e l o c i t y ( v , ω ) ) G(v,\omega ) = \sigma (\alpha Heading(v,\omega ) + \beta Obstacle(v,\omega ) + \gamma Velocity(v,\omega )) G(v,ω)=σ(αHeading(v,ω)+βObstacle(v,ω)+γVelocity(v,ω))
方位角评价函数
H
e
a
d
i
n
g
(
v
,
ω
)
Heading(v,ω)
Heading(v,ω)——方位角不断地朝向终点位置函数。 在移动过程中,
H
e
a
d
i
n
g
(
v
,
ω
)
Heading(v,ω)
Heading(v,ω)函数用于使机器人的朝向不断趋向终点方向,
θ
θ
θ越小,说明与终点的方位角越小。

障碍物评价函数
O
b
s
t
a
c
l
e
(
v
,
ω
)
Obstacle(v,ω)
Obstacle(v,ω)——评价机器人轨迹到障碍物距离函数。体现了机器人的避障能力,如果机器人的轨迹到障碍物的距离大于机器人半径,则没有发生碰撞的危险;
反之,就说明碰撞风险大,舍弃这条轨迹。
速度评价函数 V e l o c i t y ( v , ω ) Velocity(v,ω) Velocity(v,ω)
最后对评价函数进行归一化处理(Why?):
譬如对于障碍物距离评价标准,机器人传感器检测到的最小障碍物距离在二维空间中是不连续的,这种评价标准将导致评价函数不连续,也会导致某个项在评价函数中太占优势,因此将它们进行平滑处理。
归一化处理方法: 每一项除以每一项的总和
n
o
r
m
a
l
_
h
e
a
d
(
i
)
=
h
e
a
d
(
i
)
∑
i
=
1
n
h
e
a
d
(
i
)
n
o
r
m
a
l
_
d
i
s
t
(
i
)
=
d
i
s
t
(
i
)
∑
i
=
1
n
d
i
s
t
(
i
)
n
o
r
m
a
l
_
v
o
l
o
c
i
t
y
(
i
)
=
v
o
l
o
c
i
t
y
(
i
)
∑
i
=
1
n
v
o
l
o
c
i
t
y
(
i
)
\begin{array}{c}normal\_head(i) = \frac{{head(i)}}{{\sum\limits_{i = 1}^n {head(i)} }}\\normal\_dist(i) = \frac{{dist(i)}}{{\sum\limits_{i = 1}^n {dist(i)} }}\\normal\_volocity(i) = \frac{{volocity(i)}}{{\sum\limits_{i = 1}^n {volocity(i)} }}\end{array}
normal_head(i)=i=1∑nhead(i)head(i)normal_dist(i)=i=1∑ndist(i)dist(i)normal_volocity(i)=i=1∑nvolocity(i)volocity(i) 其中,
n
n
n为采样的所有轨迹,
i
i
i为待评价的当前轨迹。
三者构成的评价函数的物理意义是:在局部导航过程中,使得机器人避开障碍,朝着目标以较快速度行驶。
Dieter Fox[2]在文章中给出了评价指标可视化的图像(图1-6)。
本项目以Astar算法作为全局路径规划算法,DWA作为局部路径规划算法,实现效果如下。(具体原理与算法代码解释与说明会在之后的文章附上)
ROS_导航_Astar+DWA
[1]劳彩莲,李鹏,冯宇.基于改进A*与DWA算法融合的温室机器人路径规划[J].农业机械学报,2021,52(01):14-22.
[2]Dieter Fox,Wolfram Burgard,Sebastian Thrun. The dynamic window approach to collision avoidance.[J]. IEEE Robot. Automat. Mag.,1997,4(1).
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b
我需要根据字符串路径的长度将字符串路径数组转换为符号、哈希和数组的数组给定以下数组:array=["info","services","about/company","about/history/part1","about/history/part2"]我想生成以下输出,对不同级别进行分组,根据级别的结构混合使用符号和对象。产生以下输出:[:info,:services,about:[:company,history:[:part1,:part2]]]#altsyntax[:info,:services,{:about=>[:company,{:history=>[:part1,:pa
我想用这两种语言中的任何一种(最好是ruby)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生
有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO
Organization和Image具有一对一的关系。Image有一个名为filename的列,它存储文件的路径。我在Assets管道中包含这样一个文件:app/assets/other/image.jpg。播种时如何包含此文件的路径?我已经在我的种子文件中尝试过:@organization=...@organization.image.create!(filename:File.open('app/assets/other/image.jpg'))#Ialsotried:#@organization.image.create!(filename:'app/assets/other/i