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

做网站的公司济南赛博科技市场网络服务器图片

做网站的公司济南赛博科技市场,网络服务器图片,英文网站建设 济南,微信怎么创建微信公众号移动机器人智能的一个重要标志就是自主导航#xff0c;而实现机器人自主导航有个基本要求——避障。之前简单介绍过Bug避障算法#xff0c;但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象#xff0c;只能说似懂非懂。我不是天才#xff0c;不能看几遍就理解理论中…  移动机器人智能的一个重要标志就是自主导航而实现机器人自主导航有个基本要求——避障。之前简单介绍过Bug避障算法但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象只能说似懂非懂。我不是天才不能看几遍就理解理论中的奥妙只能在别人大谈XX理论XX算法的时候自己一个人苦逼的面对错误的程序问为什么...   下面开始动手来实现一下简单的Bug2避障算法。由于算法中涉及到机器人与外界环境的交互因此需要选择一个仿真软件。常用的移动机器人仿真软件主要有Gazebo、V-rep、Webots、MRDS(microsoft robotics developer studio)等这些软件基本都是三维环境下的模拟仿真而目前大多数移动机器人均采用轮式结构一般只在平面上运动。为了简化建模和编程方便选择了一个平面环境下的机器人仿真软件——RobotBASIC。RobotBASIC的使用方法很简单语法与标准的BASIC语言相似它能使你简单、迅速地模拟多种类型的环境和情况。   在Bug2算法中机器人围绕障碍物行走需要机器人能感知到障碍物的存在可以通过碰撞传感器或红外接近开关实现。RobotBASIC中的机器人身体上装有5个红外传感器分别间隔45°安装如下图所示。通过函数rFeel()可获得表示红外传感器状态的编码数字如果该方向检测到障碍则对应的位置1。即如果只在正前方检测到障碍则rFeel()返回 0b00100 4. 与一般碰撞传感器相比红外传感器探测物体效果更好因为最好不与环境接触发生碰撞哪怕是很小的碰撞也可能会对机器人造成影响。   RobotBASIC中的碰撞传感器有4个分布在机身周围。前后的碰撞传感器分别形成130°圆弧侧面两个形成50°圆弧。分布情况如下图所示 有时机器人有必要对某物体的轮廓进行跟踪 当机器人沿预期路径运动时遇到障碍物它可能会通过在障碍物周边移动绕过这个障碍物。在办公室环境中用于递送文件的机器人肯能会沿着墙壁在走廊里行走依次拜访每个房间。一种使机器人在错综复杂的走廊中在一个方向左或右沿墙壁运动的策略。  机器人在遇到一个障碍物前一直向前运动。当遇到障碍物时机器人将停止向前运动并对墙面进行跟踪。为了理解机器人怎么对墙壁进行跟踪想象你被蒙上眼睛时站在离墙壁很近的地方并沿着墙壁行走到达目的地。你可能会伸出一只手如果墙在你的右边伸出右手来帮助你确定墙壁的位置。随着你和墙壁之间的距离增大你的手最终将不能触摸到墙壁。然后你需要右转并向前运动以再次靠近墙壁。如果你发现自己与墙壁越来越近则需要弯曲手臂。为了维持伸出手臂你必须向远离墙壁的方向旋转以避免撞到墙上。   下面根据Bug避障算法简介中的伪代码实现机器人在未知环境中的避障行走。可以在程序中设定不同的目标位置并用鼠标在屏幕上选好一个机器人初始位置之后按下左键确定为了模拟更加动态的未知环境还可以在机器人移动过程中随时加入一个障碍物但下面的程序还没有实现这一功能有待优化。 MainProgram://-------------define variables here-----------target_x 400target_y 150HitPoint_x 0HitPoint_y 0dx0 0dy0 0RobotSize 10delayTime 2 TurnDir 1 isFirstHit falseisReachTarget falseisAbleToTarget truegosub DrawScenegosub InitializeRobotrInvisible Red,GrayLineWidth 2rPen Down,Redrepeat readmouse x,y,buntil b 2 //Click the right button to start movement//----------------while loop---------------while truegosub MoveLineToTarget if isReachTarget then breakgosub FollowWallif isReachTarget then breakif (not isAbleToTarget) then break wend End // DrawScene:ClearScrLineWidth 3 Data Wall_1; -100,450, 500,450, 500,360, 100,360, 100,450, 150,-400Data Wall_2; -250,250, 500,250, 500,50, 450,50, 450,200, 250,200, 250,250, 260,-240MPolygon Wall_1, Gray //Draw obstaclesMPolygon Wall_2, GrayCircle 600,400, 700,200, Black, Gray Circle (target_x - 5),(target_y 5), (target_x 5),(target_y - 5), Red, Red //Draw target Return // InitializeRobot:repeat readmouse x, y, buntil b 1 //Click the left button to locate the robot//Calculate the initial angle for robot to face the targetdx0 target_x - xdy0 target_y - y if dx0 0 AND dy0 0theta 0elsetheta PolarA(dx0, dy0) * 180 / pi() 90 if theta 180 then theta theta - 360 if theta -180 then theta theta 360rLocate x, y, theta, RobotSize //InitializationGotoXY x,ylineto target_x, target_y, 1, Gray //Draw m-line Return // MoveLineToTarget:dx target_x - rGpsX()dy target_y - rGpsY()if dx 0 AND dy 0 then returntheta PolarA(dx, dy) * 180 / pi() 90 - rCompass() if theta 180 then theta theta - 360 if theta -180 then theta theta 360rTurn thetadistance Round(polarR(dx, dy))for i 1 to distanceif rBumper() 4isFirstHit trueHitPoint_x rGpsX() //record the hit point positionHitPoint_y rGpsY()breakendifif PolarR(target_x-rGpsX(),target_y-rGpsY()) 5isReachTarget truexyString 2,2,Get to the target!breakendifrForward 1 //move forward one pixeldelay delayTimenext Return // FollowWall: TurnAmount 5If TurnDir 0 FN 6 //right and right frontElseFN 12 //front and left frontEndifwhile true// reach the goal ? condition1 PolarR(target_x - rGpsX(),target_y - rGpsY()) 5 if condition1 isReachTarget truexyString 2, 2, Get to the target!breakendif// re-encounter the hit point ? condition2 (PolarR(rGpsX()-HitPoint_x,rGpsY()-HitPoint_y) 5) and (not isFirstHit) if condition2 isAbleToTarget falsexyString 2, 2, Cannot reach the target!breakelsetemp rGpsY() - (dy0 / dx0 * (rGpsX() - target_x) target_y)// re-counter the m-line ?condition3 ((temp * temp) 12) and (not isFirstHit)// closer to the goal?condition4 PolarR(target_x-rGpsX(),target_y-rGpsY()) PolarR(target_x-HitPoint_x,target_y-HitPoint_y)if (condition3 and condition4) then break endif While (rFeel() FN) or (rBumper() 4)rTurn -TurnDirWendrForward 1 // forward always to prevent stallif PolarR(rGpsX()-HitPoint_x,rGpsY()-HitPoint_y) 5isFirstHit falseendifWhile not rFeel()// turn back quickly to find wall againrTurn TurnAmount*TurnDirrForward 1Wenddelay delayTimewend Return //   由于真实的环境是动态的、未知的、复杂的可能随时出现一个障碍物挡在机器人面前也可能存在形状复杂的障碍物如Bug避障算法简介中出现的螺旋形障碍物或者一开始机器人就被封闭在障碍物的内部。因此算法的鲁棒性非常重要需要设计出一个合理地规则解决上述问题。上述算法的实现过程在大体上是对的但在细节上还存在诸多问题有待优化。下面几幅图给出了不同位置和不同转向时的情况假如算法考虑的不够全面就可能会出现在某些初始位置或者换个转向就失效的情况。   初始时刻机器人被封闭在障碍物内部无法到达目标此时算法应该做出合理地判断停止循环避免一直在内部转圈   如下图所示机器人跟踪墙壁时换了一个转向。之前设定的是靠右行走现在靠左行走。如果算法鲁棒性不好就可能会出现换个转向就失效的情况。    编写这个程序的时候遇到了很多问题   1. 在RobotBASIC软件中机器人移动的距离最小为1个像素点因此很多情况下会出现舍入误差。比如判断点是否在直线上两点是否重合的时候就不能用而需要设定一个合理的阈值用或判断阈值过大过小都不好。   2. 直线检测时对公式 ydy/dx*(x-x0)y0进行变形考虑到有可能机器人和目标点处于一条竖直线上此时斜率为无穷大判断y*dx - dy(x-x0)y0*dx 0?  理论上如果点在直线上该等式的值就为0我想当然的以为当点接近直线时该式子的值也会很小因此设了一个不大的阈值来检测点是否在直线上。而一般情况下dx的值都会有好几百两边同乘dx后误差被放的很大远远超出了阈值。最后还是用ydy/dx*(x-x0)y0来进行判断了一偷懒没有写if dx0的情况毕竟用鼠标去定位机器人的时候很难使其正好与目标处于一条铅垂线上...我又不严谨了O__O …   3. 当机器人沿着直线撞到障碍物时切换到FollowWall程序。在FollowWall中需要不断检测机器人是否再次遇到hit point如果再次遇到则说明无路可走要退出主程序。因此设置一个标识变量isFirstHit在MoveLineToTarget子程序中碰到障碍物时isFirstHit设为true然后程序跳入FollowWall中。while循环中检测是否为再次碰到hit point如果是第一次则机器人继续绕墙行走理论上执行rForward 1之后就可以直接将变量isFirstHit设为false了。但实际上这样在机器人第一次撞墙后就停止不动并跳出了主程序仔细分析走一个像素点之后就立马将标志取反将会在第二次进入while循环的时候造成判断错误。因为我们比较当前点是否为hit point的时候使用了一个距离阈值(PolarR(rGpsX()-HitPoint_x,rGpsY()-HitPoint_y) 5) 即当前点距hit point在5个像素范围内就认为这两个点重合。因此还没等机器人走出这一范围if语句的条件就成立为真接着就执行了break语句跳出了循环。为了解决这一问题可以让机器人多走一段距离之后再对isFirstTrue赋值false。问题又来了走多远再对其赋值检测两点重合的阈值设多大有时设小了机器人会直接越过该点导致其完全停不下来...这些问题都需要仔细琢磨。 MoveLineToTarget:...isFirstHit true.... ReturnFollowWall:while true...if (PolarR(rGpsX()-HitPoint_x,rGpsY()-HitPoint_y) 5) and (not isFirstHit)  breakrForward 1 // move forwardif PolarR(rGpsX()-HitPoint_x,rGpsY()-HitPoint_y) 5isFirstHit false...wend Return 经验与总结   调试往往需要花费远远超过你想象的时间——有时比编写代码时间还要长得多因此一定要有耐心。在调试期间获得的信息无论对于修改程序中的错误还是进一步开发这个或其他程序甚至对提高你解决问题的能力都是非常有价值的。随着经验的积累你会发现在细心进行系统设计和谨慎编写代码的过程中多花一些时间能够大大节省调试的时间。   对一台真实的机器人我们很难设想各种问题产生的原因所以也就很难对算法进行综合测试。一台能在几种有限环境中运行良好的机器人往往面对不可测的情况时就会失败。有了机器人模拟器就能构建多种不同的环境这有助于实现算法减少失败的可能性。不过仅仅依靠调试器查找错误并不能代替全面的分析推理。     参考 John Blankenship, Samuel Mishal. 《机器人编程设计与实现》 科学出版社 Robotics, vision and control fundamental algorithms in MATLAB.  Chapter 5 · Navigation  pp.90-91转载于:https://www.cnblogs.com/21207-iHome/p/5998630.html
http://www.pierceye.com/news/332004/

相关文章:

  • 然后建设自营网站湘潭市优化办
  • 大兴专业网站开发公司皮具网站建设策划书
  • 广告投放跟网站建设一样吗呼和浩特免费制作网站
  • 个人做网站的时代已经过去个人手机网站
  • 用vps做网站深圳广告公司招聘安装工人
  • 建设电影网站怎么上传电影如何建企业网站
  • 响应式网站制作公司org域名购买
  • 石家庄网站建设德信互联科技有限公司爬取漫画数据做网站
  • 国内免费iphone网站百度自然排名优化
  • 自己做网站主机做网站和推广
  • wordpress 淘宝嘉兴做网站优化
  • h5 网站开发流程asp个人网站建设
  • 网站建设 正邦企业邮箱怎么认证
  • 建设流网站项目成都住建局官网首页
  • 网站简历文字如何空行产品如何推广市场
  • 吕梁网站设计腾讯营销平台
  • 如何查看网站流量公众号申请网站
  • 阐述企业搭建网站的重要性免费做效果图的网站有哪些
  • 快速网站搭建南宁广告公司网站建设
  • 做数学题网站专业做网站建设 昆山
  • 建筑网站上海网页设计图片素材网
  • 延边网站开发depawo做汽车网站销售怎么入手
  • 商城网站开发技术南京好的网站制作公司
  • 嘉兴网站建设嘉兴网站推广网站网络营销方案
  • 镇江建工建设集团网站建设银行网站怎么基本转个人
  • 自己建的网站打开的特别慢盐城网站建设效果
  • 专业建站报价wordpress这软件怎么搜索
  • 德国网站建设电工培训内容
  • 织梦手机wap网站标签调用外贸网站建设公司如何
  • 在那里能找到网站泰安公司网站开发