机器人局部避障的动态窗口法(dynamic window approach) (转)
源:机器人局部避障的动态窗口法(dynamic window approach)
首先在V_m∩V_d的范围内采样速度:
allowable_v = generateWindow(robotV, robotModel)
allowable_w = generateWindow(robotW, robotModel)
然后根据能否及时刹车剔除不安全的速度:
for each v in allowable_v
for each w in allowable_w
dist = find_dist(v,w,laserscan,robotModel)
breakDist = calculateBreakingDistance(v)//刹车距离
if (dist > breakDist) //如果能够及时刹车,该对速度可接收
如果这组速度可接受,接下来利用评价函数对其评价,找到最优的速度组
来源:http://adrianboeing.blogspot.com/2012/05/dynamic-window-algorithm-motion.html
BEGIN DWA(robotPose,robotGoal,robotModel)
laserscan = readScanner()
allowable_v = generateWindow(robotV, robotModel)
allowable_w = generateWindow(robotW, robotModel)
for each v in allowable_v
for each w in allowable_w
dist = find_dist(v,w,laserscan,robotModel)
breakDist = calculateBreakingDistance(v)
if (dist > breakDist) //can stop in time
heading = hDiff(robotPose,goalPose, v,w)
//clearance与原论文稍不一样
clearance = (dist-breakDist)/(dmax - breakDist)
cost = costFunction(heading,clearance, abs(desired_v - v))
if (cost > optimal)
best_v = v
best_w = w
optimal = cost
set robot trajectory to best_v, best_w
END
(转载请注明作者和出处:http://blog.csdn.net/heyijia0327 未经允许请勿用于商业用途)
参考:
dwa:
1.Fox.《The Dynamic Window Approach To CollisionAvoidance》
2.MarijaSeder. 《dynamic window based approach tomobile robot motion control in the presence of moving obstacles》
3.http://adrianboeing.blogspot.com/2012/05/dynamic-window-algorithm-motion.html
运动模型:
4. http://adrianboeing.blogspot.com.au/2010/09/circular-motion-in-2d-for-graphics-and.html
5.https://www.cs.princeton.edu/courses/archive/fall11/cos495/COS495-Lecture5-Odometry.pdf
6.http://rossum.sourceforge.net/papers/DiffSteer/
最后贴出matlab仿真代码:
% -------------------------------------------------------------------------
%
% File : DynamicWindowApproachSample.m
%
% Discription : Mobile Robot Motion Planning with Dynamic Window Approach
%
% Environment : Matlab
%
% Author : Atsushi Sakai
%
% Copyright (c): Atsushi Sakai
%
% License : Modified BSD Software License Agreement
% ------------------------------------------------------------------------- function [] = DynamicWindowApproachSample() close all;
clear all; disp('Dynamic Window Approach sample program start!!') x=[ pi/ ]';% 机器人的初期状态[x(m),y(m),yaw(Rad),v(m/s),w(rad/s)]
goal=[,];% 目标点位置 [x(m),y(m)]
% 障碍物位置列表 [x(m) y(m)]
% obstacle=[ ;
% ;
% ;
% ;
% ;
% ;
%
%
%
% ];
obstacle=[ ;
;
;
;
;
; ]; obstacleR=0.5;% 冲突判定用的障碍物半径
global dt; dt=0.1;% 时间[s] % 机器人运动学模型
% 最高速度m/s],最高旋转速度[rad/s],加速度[m/ss],旋转加速度[rad/ss],
% 速度分辨率[m/s],转速分辨率[rad/s]]
Kinematic=[1.0,toRadian(20.0),0.2,toRadian(50.0),0.01,toRadian()]; % 评价函数参数 [heading,dist,velocity,predictDT]
evalParam=[0.05,0.2,0.1,3.0];
area=[- - ];% 模拟区域范围 [xmin xmax ymin ymax] % 模拟实验的结果
result.x=[];
tic;
% movcount=;
% Main loop
for i=:
% DWA参数输入
[u,traj]=DynamicWindowApproach(x,Kinematic,goal,evalParam,obstacle,obstacleR);
x=f(x,u);% 机器人移动到下一个时刻 % 模拟结果的保存
result.x=[result.x; x']; % 是否到达目的地
if norm(x(:)-goal')<0.5
disp('Arrive Goal!!');break;
end %====Animation====
hold off;
ArrowLength=0.5;%
% 机器人
quiver(x(),x(),ArrowLength*cos(x()),ArrowLength*sin(x()),'ok');hold on;
plot(result.x(:,),result.x(:,),'-b');hold on;
plot(goal(),goal(),'*r');hold on;
plot(obstacle(:,),obstacle(:,),'*k');hold on;
% 探索轨迹
if ~isempty(traj)
for it=:length(traj(:,))/
ind=+(it-)*;
plot(traj(ind,:),traj(ind+,:),'-g');hold on;
end
end
axis(area);
grid on;
drawnow;
%movcount=movcount+;
%mov(movcount) = getframe(gcf);%
end
toc
%movie2avi(mov,'movie.avi'); function [u,trajDB]=DynamicWindowApproach(x,model,goal,evalParam,ob,R) % Dynamic Window [vmin,vmax,wmin,wmax]
Vr=CalcDynamicWindow(x,model); % 评价函数的计算
[evalDB,trajDB]=Evaluation(x,Vr,goal,ob,R,model,evalParam); if isempty(evalDB)
disp('no path to goal!!');
u=[;];return;
end % 各评价函数正则化
evalDB=NormalizeEval(evalDB); % 最终评价函数的计算
feval=[];
for id=:length(evalDB(:,))
feval=[feval;evalParam(:)*evalDB(id,:)'];
end
evalDB=[evalDB feval]; [maxv,ind]=max(feval);% 最优评价函数
u=evalDB(ind,:)';% function [evalDB,trajDB]=Evaluation(x,Vr,goal,ob,R,model,evalParam)
%
evalDB=[];
trajDB=[];
for vt=Vr():model():Vr()
for ot=Vr():model():Vr()
% 轨迹推测; 得到 xt: 机器人向前运动后的预测位姿; traj: 当前时刻 到 预测时刻之间的轨迹
[xt,traj]=GenerateTrajectory(x,vt,ot,evalParam(),model); %evalParam(),前向模拟时间;
% 各评价函数的计算
heading=CalcHeadingEval(xt,goal);
dist=CalcDistEval(xt,ob,R);
vel=abs(vt);
% 制动距离的计算
stopDist=CalcBreakingDist(vel,model);
if dist>stopDist %
evalDB=[evalDB;[vt ot heading dist vel]];
trajDB=[trajDB;traj];
end
end
end function EvalDB=NormalizeEval(EvalDB)
% 评价函数正则化
if sum(EvalDB(:,))~=
EvalDB(:,)=EvalDB(:,)/sum(EvalDB(:,));
end
if sum(EvalDB(:,))~=
EvalDB(:,)=EvalDB(:,)/sum(EvalDB(:,));
end
if sum(EvalDB(:,))~=
EvalDB(:,)=EvalDB(:,)/sum(EvalDB(:,));
end function [x,traj]=GenerateTrajectory(x,vt,ot,evaldt,model)
% 轨迹生成函数
% evaldt:前向模拟时间; vt、ot当前速度和角速度;
global dt;
time=;
u=[vt;ot];% 输入值
traj=x;% 机器人轨迹
while time<=evaldt
time=time+dt;% 时间更新
x=f(x,u);% 运动更新
traj=[traj x];
end function stopDist=CalcBreakingDist(vel,model)
% 根据运动学模型计算制动距离,这个制动距离并没有考虑旋转速度,不精确吧!!!
global dt;
stopDist=;
while vel>
stopDist=stopDist+vel*dt;% 制动距离的计算
vel=vel-model()*dt;%
end function dist=CalcDistEval(x,ob,R)
% 障碍物距离评价函数 dist=;
for io=:length(ob(:,))
disttmp=norm(ob(io,:)-x(:)')-R;%僷僗偺埵抲偲忈奞暔偲偺僲儖儉岆嵎傪寁嶼
if dist>disttmp% 离障碍物最小的距离
dist=disttmp;
end
end % 障碍物距离评价限定一个最大值,如果不设定,一旦一条轨迹没有障碍物,将太占比重
if dist>=*R
dist=*R;
end function heading=CalcHeadingEval(x,goal)
% heading的评价函数计算 theta=toDegree(x());% 机器人朝向
goalTheta=toDegree(atan2(goal()-x(),goal()-x()));% 目标点的方位 if goalTheta>theta
targetTheta=goalTheta-theta;% [deg]
else
targetTheta=theta-goalTheta;% [deg]
end heading=-targetTheta; function Vr=CalcDynamicWindow(x,model)
%
global dt;
% 车子速度的最大最小范围
Vs=[ model() -model() model()]; % 根据当前速度以及加速度限制计算的动态窗口
Vd=[x()-model()*dt x()+model()*dt x()-model()*dt x()+model()*dt]; % 最终的Dynamic Window
Vtmp=[Vs;Vd];
Vr=[max(Vtmp(:,)) min(Vtmp(:,)) max(Vtmp(:,)) min(Vtmp(:,))]; function x = f(x, u)
% Motion Model
% u = [vt; wt];当前时刻的速度、角速度
global dt; F = [ ]; B = [dt*cos(x())
dt*sin(x())
dt ]; x= F*x+B*u; function radian = toRadian(degree)
% degree to radian
radian = degree/*pi; function degree = toDegree(radian)
% radian to degree
degree = radian/pi*;
机器人局部避障的动态窗口法(dynamic window approach) (转)的更多相关文章
- ROS知识(14)----局部避障的动态窗口算法(DWA)及其调试的方法
Dynamic Window Approach(DWA)是重要的局部轨迹规划算法,ROS中使用了DWA算法获得了很好的局部路径规划的效果.具体的教程可参考官方的导航调试资料Navigation Tun ...
- DWA局部路径规划算法论文阅读:The Dynamic Window Approach to Collision Avoidance。
DWA(动态窗口)算法是用于局部路径规划的算法,已经在ROS中实现,在move_base堆栈中:http://wiki.ros.org/dwa_local_planner DWA算法第一次提出应该是1 ...
- ros move_base costmap 理解和实现动态窗口法避障
以下大部分内容参考自 ros_by_example_hydro_volume_1.pdf local costmap 是怎么生成的?跟三维点云有什么关系? global costmap在没有全局地图下 ...
- SLAM+语音机器人DIY系列:(六)SLAM建图与自主避障导航——2.google-cartographer机器人SLAM建图
摘要 通过前面的基础学习,本章进入最为激动的机器人自主导航的学习.在前面的学习铺垫后,终于迎来了最大乐趣的时刻,就是赋予我们的miiboo机器人能自由行走的生命.本章将围绕机器人SLAM建图.导航避障 ...
- Bug避障算法简介
移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.避障是指移动机器人根据采集的障碍物的状态信息,在行走过程中通过传感器感知到妨碍其通行的静态和动态物体时,按照一定的方 ...
- [TPYBoard - Micropython 之会python就能做硬件 9] 五分种学会用TPYBoard V102 制作避障小车(升级版)
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 感谢山东萝卜电子科技公司授权 一.实验器材 1.TPYboard V102板 ...
- [TPYBoard - Micropython之会python就能做硬件 8] 学习使用超声波模块制作避障小车
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.实验器材 1.TPYboard V102板 一块 2.电机驱动模块L2 ...
- 具有避障和寻线功能的Arduino小车
标签: Arduino 乐高 机器人 创客对于成年人来说,多半是科技娱乐,或者是一种是一种向往科技的人生态度,总是希望自己不仅可以看到或者听到科技的资讯,还希望能够亲身制作科技玩意,从而更好地体 ...
- 【LeetCode】无重复字符的最长子串【滑动窗口法】
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc&quo ...
随机推荐
- AI 人工智能 探索 (七)
我简单画了一幅图,来讲下 ai 中的设计模式.图形中的这些人物,我想大家都能看的明白. 当 盗贼出现,人们发现了他们,就 呼叫 主类,然后主类再 通知 下面对应的管理局,然后管理局再 分配人手过去 ...
- angular项目——小小记事本1
这次的项目是制作一个记事本,有点类似于手机qq聊天信息. 内容:在一个input当中输入一行数据,之后提交,这个数据便会记录在下面.随着提交的增加,数据会以列表形式排列下来. 列表中,前面有一个组件, ...
- JspWriter与PrintWriter的关系
一.JspWriter与PrintWriter的关系: 1.都是继承自java.io.Writer类. JspWriter可以在JSP页面中直接用out对象输出.可以用pageContext.getO ...
- 本地php 连接 MySQL
1. 在D:\xampp\htdocs下创建test.php <?php $dbhost = 'localhost:3306'; //mysql服务器主机地址 $dbuser = 'root'; ...
- hdu_3886_Final Kichiku “Lanlanshu”(数位DP)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3886 题意:这题的题意有点晦涩难懂,大概意思就是给你一个区间,让你找一些满足递增递减条件的数,举个列: ...
- JavaScript数组函数unshift、shift、pop、push使用实例
如何声明数组 s中数组的声明可以有几种方式声明 复制代码代码如下: var tmp = []; // 简写模式var tmp = new Array(); // 直接new一个var tmp = A ...
- JSP内置对象--web安全性及config对象的使用 (了解即可)
tomcat服务器配置的时候,在虚拟目录中必须存在一个WEB-INF文件夹,但是访问的时候并不能发现这个文件夹.改成WEB-INFs就可以看到. 所以WEB-INF文件夹不轻易让用户看到,那么其安全性 ...
- emacs format
格式化源码是很常见的需求,emacs有个indent-region函数用于格式化选定的代码,前提是你处在某个非text mode下,如c-mode或者java-mode之类.如果要格式化整个文件,你需 ...
- a href="javascript:void(0)" 是什么意思?加不加上有什么区别?
<A href="javascript:void(0)">点击</a>点击链接后不会回到网页顶部<A href="#">点击 ...
- tcp断开连接,4次握手,为什么wireshark 只能抓到3个包?
用wireshark 抓包,看看tcp 断开连接的过程. 以前书上说tcp断开连接,4次握手,可我为什么wireshark 只能抓到3个包? 百度一下,别人也有类似的疑问. [求助]书上和网上的资料 ...