精华内容
下载资源
问答
  • 本文是研究速度障碍法的英文论文,论文以多个智能体为研究对象,研究速度障碍法在智能体避障时的应用,研究了速度障碍法在多智能体避障时的最优速度选择问题。
  • 针对多移动机器人运动协调中的动态安全避碰问题,在分析速度障碍法原理的基础上,设计用于机器人之间相互避让的互动速度法则,并通过制定机器人的碰撞时间、碰撞距离因子对构型障碍的大小进行实时调整,把运动障碍物...
  • 针对应用广泛的局部避障算法-----动态窗口(DWA)穿越稠密障碍物时存在路径不合理、速度和安全性不能兼顾等问题,提出参数自适应的DWA算法,根据机器人与障碍物距离和障碍物的密集度自动调整目标函数中的权值,以自适应...
  • legend(‘相互速度障碍法’,‘改进的相互速度障碍法’); set(gca,‘XTickLabel’,{‘总路径长度(km)’,‘总转弯角度为(度)’,‘时间(s)’}); set(gcf,‘color’,‘white’) applyhatch(gcf,’.x.’); 结果: ...

    代码:
    data = [257.4,228.19;306,253.89;27,16.5];
    bar(data,1);
    axis([0 4 0.0 350]);
    legend(‘相互速度障碍法’,‘改进的相互速度障碍法’);
    set(gca,‘XTickLabel’,{‘总路径长度(km)’,‘总转弯角度为(度)’,‘时间(s)’});
    set(gcf,‘color’,‘white’)
    applyhatch(gcf,’.x.’);
    结果:在这里插入图片描述在这里插入图片描述

    展开全文
  • 论文研究-复杂海事安全...利用改进的智能水滴算法对已知环境进行全局航线决策,再利用交互速度障碍法根据遇到的动态障碍物进行局部航线重规划.仿真实验证明航线决策方法可以快速有效地规划出最优航线并实现实时动态避碰.
  • 在战场环境中,战术分队的队形在面对复杂静态或动态障碍物时难以较好地保持...为解决面对动态障碍的避碰问题,基于相对速度障碍法,并加入速度协同控制,避免队形在避碰过程中失效。最后通过实验表明了该方法的有效性。
  • 为提升AGV工作效率并改善其躲避障碍物的执行能力,提出在静态与动态环境下的全局路径规划方法——多目标与速度控制.在静态环境下,以路径最短与平滑度最大建立路径规划的多目标数学模型,采用所提出的改进算法求解并...
  • 利用人工势场的最短路径寻找

    千次阅读 2019-01-07 21:30:43
    人工势场也可以用作机器人避障。我目前思考的是使其作为全局规划器,规划全局路径,也可以做局部规划直接下达至速度计算,目前暂时先看看全局路径计算。它将整个地图环境抽象为势场,机器人同时受到目标点的引力与...

    人工势场法也可以用作机器人避障。我目前思考的是使其作为全局规划器,规划全局路径,也可以做局部规划直接下达至速度计算,目前暂时先看看全局路径计算。它将整个地图环境抽象为势场,机器人同时受到目标点的引力与障碍物的斥力,向合力的方向移动,当机器人逐步接近障碍物,受到的斥力越来越大以致偏离障碍物,达到避障的效果。如果做一个简化,每次计算便向合力方向延伸一个步长,便可逐渐到达终点。

    在栅格地图中,障碍物很多,看看栅格地图的说明就知道:

    Raw Message Definition

    # This represents a 2-D grid map, in which each cell represents the probability of
    # occupancy.
    Header header
    #MetaData for the map
    MapMetaData info
    # The map data, in row-major order, starting with (0,0).  Occupancy
    # probabilities are in the range [0,100].  Unknown is -1.
    int8[] data

    在一幅2000×2000,分辨率为0.02的地图中,动辄有一万以上的障碍物栅格,若是遍历障碍物来寻找当前栅格附近的障碍物的话消耗太大,在此用KD树保存障碍栅格并用K近邻算法找到最近的K个栅格,在此K要足够大以包括进附近的障碍。可以用PCL库的KD树来实现障碍栅格的储存和查找。

    当然,障碍物需要设置一个“影响范围”,我们所处的位置如果在某障碍物范围外,即便是K近邻也不该受到其影响。障碍物的斥力可以由万有引力公式求出(与距离平方成反比),而目标点的引力可以与距离成正比也可以是类似重力的恒定值。调节两个受力参数是决定路径效果的一个重要因素。

    但是用栅格来代表障碍物,计算量还是太大了,如果对栅格进行预处理,将一平方米的栅格,计算出密度与质心,这样可以将2000×2000的地图转化为40×40的障碍物集合,减少迭代时间。

    克服一下懒劲,继续更新。。。

    我们将地图处理为点云并将其每一平方米进行降采样(降采样后的点基本上就是质心),再对其进行K近邻查找。代码如下:

    #include <ros/ros.h>
    #include <nav_msgs/Path.h>
    #include <geometry_msgs/PoseStamped.h>
    #include <geometry_msgs/PoseWithCovarianceStamped.h>
    #include <nav_msgs/OccupancyGrid.h>
    #include <sensor_msgs/PointCloud2.h>
    #include <pcl/kdtree/kdtree_flann.h>
    #include <pcl_conversions/pcl_conversions.h>
    #include <pcl/filters/voxel_grid.h>
    #include <pcl/point_types.h>
    #include <pcl/point_cloud.h>
    #include "tf/tf.h"
    #include <tf/transform_broadcaster.h>
    
    using namespace std;
    
    bool updateMap = false;
    pcl::PointCloud<pcl::PointXYZ>::Ptr mapCloud(new pcl::PointCloud<pcl::PointXYZ>);
    
    ros::Publisher cloudPub, pathPub;
    double searchStep = 0.5;
    /* 引力常数与斥力常数 */
    double attraction = 10;
    double repulsion = 15;
    /* 认定到达终点的阈值 */
    double goalTolerance = 0.5;
    
    
    geometry_msgs::PoseStamped tempPose, goalPose;
    nav_msgs::Path path;
    
    pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
    
    void mapCB(const nav_msgs::OccupancyGrid::ConstPtr &map)
    {
      if(!updateMap)
      {
        mapCloud->clear();
        /* map data */
        double origin_x, origin_y, resolution;
        int width, height;
        origin_x = map->info.origin.position.x;
        origin_y = map->info.origin.position.y;
        //cout<<origin_x<<origin_y<<endl;
        width = map->info.width;
        height = map->info.height;
        resolution = map->info.resolution;
        //cout<<width<<" "<<height<<" "<<resolution<<endl;
    
        pcl::PointXYZ tempPoint;
    
        for(int i = 0; i < width; i++)
        {
          for(int j = 0; j < height; j++)
          {
            if(map->data[j * width + i] >= 90)
            {
              tempPoint.x = i * resolution + origin_x;
              tempPoint.y = j * resolution + origin_y;
              //cout<<tempPoint.x<<" "<<tempPoint.y<<endl;
              mapCloud->push_back(tempPoint);
            }
          }
        }
    
        pcl::PointCloud<pcl::PointXYZ>::Ptr temp_ptr(new pcl::PointCloud<pcl::PointXYZ>);
        temp_ptr = mapCloud;
        /* down size */
        pcl::VoxelGrid<pcl::PointXYZ> sor;
        sor.setInputCloud(temp_ptr);
        sor.setLeafSize(1, 1, 1);
        sor.filter(*mapCloud);
    
        //DEBUG
        sensor_msgs::PointCloud2 cloud;
        //cout<<"road_cloud_->size() = "<<road_cloud_->size()<<endl;
        pcl::toROSMsg(*mapCloud, cloud);
        cloud.header.frame_id = "map";
        cloudPub.publish(cloud);
    
        updateMap = true;
      }
    }
    
    void initialCB(const geometry_msgs::PoseWithCovarianceStamped::ConstPtr& pose)
    {
      ROS_INFO_STREAM("initial");
      tempPose.pose = pose->pose.pose;
      path.header.frame_id = "map";
      path.poses.push_back(tempPose);
    }
    
    double distanceToGoal(const geometry_msgs::Pose& currentPose)
    {
      double distance;
      distance = sqrt(pow(currentPose.position.x - goalPose.pose.position.x, 2) + pow(currentPose.position.y - goalPose.pose.position.y, 2));
      return distance;
    }
    
    double distance(pcl::PointXYZ x1, pcl::PointXYZ x2)
    {
      double distance;
      distance = sqrt(pow(x1.x - x2.x, 2) + pow(x1.y - x2.y, 2));
      return distance;
    }
    
    void findOrientation(tf::Vector3& cross)
    {
      pcl::PointXYZ searchPoint;
      searchPoint.x = tempPose.pose.position.x;
      searchPoint.y = tempPose.pose.position.y;
      int K = 20;
      std::vector<int> pointIdxNKNSearch(K);
      std::vector<float> pointNKNSquaredDistance(K);
    
      double crossX, crossY;
    
      if(kdtree.nearestKSearch(searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0)
      {
        double currentForceX, currentForceY;
        double force;
        double forceX, forceY;
        double repulsionX = 0, repulsionY = 0;
        double attractForce, attractForceX, attractForceY;
        for(int i = 0; i < K; i++)
        {
          /* 计算受力的合力,对于斥力来说模型是类似于电磁力的斥力,与距离平方成反比 */
          force = double(repulsion / pow(pointNKNSquaredDistance[i], 2));
          forceX = force * (searchPoint.x - mapCloud->points[pointIdxNKNSearch[i]].x) / distance(searchPoint, mapCloud->points[pointIdxNKNSearch[i]]);
          forceY = force * (searchPoint.y - mapCloud->points[pointIdxNKNSearch[i]].y) / distance(searchPoint, mapCloud->points[pointIdxNKNSearch[i]]);
          repulsionX += forceX;
          repulsionY += forceY;
        }
        /* 对于引力,是与距离成正比的,也就是说可以把环境理解为抛物面模型 */
        attractForce = attraction * distanceToGoal(tempPose.pose);
        attractForceX = attractForce * (goalPose.pose.position.x - searchPoint.x)/distanceToGoal(tempPose.pose);
        attractForceY = attractForce * (goalPose.pose.position.y - searchPoint.y)/distanceToGoal(tempPose.pose);
    
        currentForceX = attractForceX + repulsionX;
        currentForceY = attractForceY + repulsionY;
    
        crossX = currentForceX / sqrt(pow(currentForceX, 2) + pow(currentForceY, 2));
        crossY = currentForceY / sqrt(pow(currentForceX, 2) + pow(currentForceY, 2));
        tf::Vector3 temp(crossX, crossY, 0);
        cross = temp;
      }
      else
      {
        ROS_ERROR("No neighbor?");
      }
    }
    
    void goalCB(const geometry_msgs::PoseStamped::ConstPtr& pose)
    {
      ROS_INFO_STREAM("goal");
      goalPose = *pose;
      kdtree.setInputCloud(mapCloud);
    
      double distance = distanceToGoal(tempPose.pose);
      while(distance > goalTolerance)
      {
        tf::Vector3 cross;
        findOrientation(cross);
        tempPose.pose.position.x = tempPose.pose.position.x + searchStep * cross.getX();
        tempPose.pose.position.y = tempPose.pose.position.y + searchStep * cross.getY();
        path.poses.push_back(tempPose);
        distance = distanceToGoal(tempPose.pose);
      }
      tempPose.pose = pose->pose;
      path.poses.push_back(tempPose);
      pathPub.publish(path);
    }
    
    int main(int argc, char** argv)
    {
      ros::init(argc, argv, "force_path");
      ros::NodeHandle n;
      pathPub = n.advertise<nav_msgs::Path>("force_path", 1);
      cloudPub = n.advertise<sensor_msgs::PointCloud2>("map_cloud", 1);
      ros::Subscriber initSub = n.subscribe<geometry_msgs::PoseWithCovarianceStamped>("initialpose", 1, &initialCB);
      ros::Subscriber goalSub = n.subscribe<geometry_msgs::PoseStamped>("move_base_simple/goal", 1, &goalCB);
      ros::Subscriber mapSub = n.subscribe<nav_msgs::OccupancyGrid>("map", 1, &mapCB);
      ros::spin();
      return 0;
    }

     效果图如下,仅限参考。。。好像引力和斥力常数需要再调整一下,防止震荡。。。各位看官有空还是看一下论文吧。最初提出的论文应该是Oussama Khatib,Real-Time obstacle Avoidance for Manipulators and Mobile Robots. Proc of The 1994 IEEE

    以及这一篇http://kovan.ceng.metu.edu.tr/~kadir/academia/courses/grad/cs548/hmws/hw2/report/apf.pdf

    展开全文
  • 随后,在传统人工势场的势场函数中加入速度因子,使用户可以躲避动态障碍物并到达动态目标,同时进行最大转弯角度设定,微调生成路径,以便获得相对平滑的路径。最后进行仿真实验,仿真实验首先证明本文所提算法在...
  • NPC 长难句分析

    2019-02-24 16:37:10
    影响英文阅读的主要障碍之一,就是长难句 如何快速、准确地读懂长难句,直接决定了阅读的速度和质量 成分 含义 N None-finite verb 非谓语动词:在句子中,不做句子谓语的动词 P Preposition 介词短语...

    一、前言

    • 长难句的难点在于修饰
    • NPC
    成分 含义
    N None-finite verb
    非谓语动词:在句子中,不做句子谓语的动词
    P Preposition
    介词短语构成的修饰
    C Clause
    从句引导的修饰
    • 修饰的三个要素:
    1. 修饰对象(被描述的对象)
    2. 修饰内容(描述修饰对象的内容)
    3. 修饰关系(修饰对象和修饰内容的匹配关系)

    二、修饰原则

    左三右三原则:

    sequenceDiagram
    A->>B: How are you?
    B->>A: Great!
    

    难点就在后置修饰的三种情况

    三、 NPC 分析法

    (一)步骤

    1. 找到 NPC 三类后置修饰的标志
    2. 将长句车拆分成多个短句
    3. 匹配对应的修饰关系

    (二)成分解析

    1. 非谓语动词 N

    在句子中,不做谓语的动词,被称为非谓语动词。非谓语动词主要有以下这三类:

    1. 动名词(v. + ing)
    2. 不定式(to do)
    3. 分词(v. + ing 现在分词/ v. + ed 过去分词)

    在长难句中,在这三类词前面进行断句划分。

    例:These are poor kids / raised by alcoholic mothers.

    2. 介词短语 P

    由介词短语构成的修饰。常见的介词有:on, in, at, by, as, with, about, until, after, before, besides, despite…
    在长难句中,在介词前断句划分。

    例:They accelerate the development / by financial support.

    3. 从句 C

    由从句引导词引导的从句类型的修饰。常见的从句引导词有:that, what, which, who, whose, where, when, if, whether, than…
    在长难句中,在从句引导词前进行断句的划分。

    例:He tries to hire people / that he likes.

    (三)断句划分

    NPC引导的修饰从哪里开始?到哪里结束?

    1. 非谓语动词 N

    开始:非谓语动词 N
    结束:- 下一个 NPC 前,谓语动词前

    例:
    These are poor kids / raised by alcoholic mothers / who has little sense of responsibility.
    These poor kids / raised by alcoholic mothers / are from China.

    2. 介词短语 P

    开始:介词 P
    结束:下一个NPC前,名词/代词前

    例:
    They accelerate the development / by financial support / from the government.
    By financial support, / they accelerate the development.

    3. 从句 C

    开始:从句引导词C
    结束:下一个 NPC 前,谓语动词前

    例:
    He tries to hire people / that he likes /in order to cooperate happily.
    Hiring people / that he likes / makes him happy.

    (四)匹配修饰关系

    1. 就近原则
      后置的修饰往往用于修饰紧靠其左边的对象。
    2. 根据拆分后的短小部分的意思:
      有时,后置的修饰还可以修饰左边的对象(不一定紧靠),或者作为状语修饰句子。这种时候, 需要结合意思来判定修饰关系。

    四、注意事项

    使用NPC分析法,需要注意以下几点:

    1. 固定搭配不作划分
    2. 标点符号有天然的断句作用
    展开全文
  • 浅谈贪吃蛇的创新玩

    千次阅读 2017-12-28 16:14:15
    首先,我们可以在开始游戏前让玩家选择游戏的难度(比如:“简单”、“普通”、“困难”),不同的难度对应不同的障碍物以及蛇运动的速度。然后,我们可以引入一个在游戏过程中的积分系统,每当蛇吃掉一个食物,游戏...

    在上一篇博客中,我介绍了我是如何设计一条贪吃蛇的,但这条贪吃蛇过于简单,玩法也很单调。那么,贪吃蛇还有什么创新的玩法呢?


    首先,我们可以在开始游戏前让玩家选择游戏的难度(比如:“简单”、“普通”、“困难”),不同的难度对应不同的障碍物以及蛇运动的速度。然后,我们可以引入一个在游戏过程中的积分系统,每当蛇吃掉一个食物,游戏的分值就会相应地增加。当分值满足一定的条件时,系统会给予奖励,比如说,玩家的分值每增加十分,蛇就会获得5秒钟的加成效果,可穿越自己的身体。与此同时,为了提高游戏的难度,系统每隔一段时间就会设置一段墙壁,蛇撞到墙壁就会死亡。

    以上就是我对贪吃蛇创新玩法的一些想法,希望对大家有帮助。

     

    在最后,我想介绍一款在2016年很火的游戏——贪吃蛇大作战。

    这款游戏有两大特点,从游戏设计上来说,它更具挑战性。这款游戏的玩法跟传统的“贪吃蛇”是一样的,“贪吃蛇”只需要吃豆子。但是同一场游戏里,会出现很多条“贪吃蛇”,你稍微不注意就会撞到别人,游戏结束。如果你吃的豆子越多,你会变得越长,这样你可以主动去“击杀”别人,比如用身体把其他玩家包裹起来围剿。你也可以加速去攻击别人,然后吃掉它的身体。如果“贪吃蛇”的长度达到一定数值,其他“贪吃蛇”就会变得很小,你基本可以畅行无阻,但是也要注意有可能被其他人偷袭,所以游戏随时可能出现“逆袭”。

    这些创新极大地增加了这款游戏的魅力,使该游戏多次登上了App Store应用的第一名。


    展开全文
  • 研究并对比了加速度计的静态标定和在线标定方法,实现了偏差的动态识别和补偿,并且根据Allan方差有效识别了加速度计的随机误差,为数据融合算法奠定了基础。进而根据捷联惯导工作机制和实际机器人运动,分析简化...
  • 好的测试可以提高开发速度。 可能一开始,这句格言会和你的直觉相矛盾。你可能会断言,测试是自由的障碍物。事实上恰恰相反,如果你十分完整的运行那些测试来检查你的软件的公共接口,你就可能在不改变(或者更加...
  • DeFi的发展速度快得让人吃惊,但其用户体验却一直难以跟上,这给新用户带来了很大的障碍。目前已经有很多项目试图在改善这种用户体验,比如Argent通过将资金存储在智能合约钱包中来实现这一...
  • 针对向量场直方图(VFH)算法对阈值敏感的问题,基于激光测距仪提出一种通过自适应调节阈值求 可行方向的移动机器人实时避障算法....0.8 m/s 时,机器人能够以0.61 m/s 的平均速度安全平滑地通过障碍
  • 除此之外,在经历了近四十年科学不太依赖自主创新的成长期且创新成为战略目标之后, 这些影响是否会浮出水面,成为中国发展的重大障碍。 对这些问题的分析往往分为两类。经济学的视角,但是由于数据本身的局限性,...
  • 游戏中DDA算法和Bresenham算法的应用

    千次阅读 2014-12-09 15:46:13
    游戏场景的地面情况复杂,而且场面大,若采用盲目式搜索,例如盲目穷举,则几乎要遍历整个场景,效率非常低,造成角色反应速度过慢,实践证明是一种不适合网络游戏寻路方法。而启发式搜索算法在障碍较少的情况下也显得...
  • 手法肌力测定肌张力评定 Ashworth痉挛量表或改良Ashworth痉挛量表步行能力评定观察测量步速和步长的测量 10m步行速度评测足印量表评定Hoffer步行能力分级吞咽功能评定反复唾液吞咽测试饮水试验构音障碍的...
  • 栅格选的大,环境分辨率较小,环境信息存储量小,决策速度快,但在密集障碍物环境中发现路径的能力较弱。 2.障碍物栅格确定 当机器人新进入一个环境时,它是不知道室内障碍物信息的,这就需要机器人能够遍历整个...
  • 其次,通过预处理静态障碍物,实现对障碍物的分类以及分别处理,可大幅降低代价地图更新过程中的计算量,变相地提高代价地图的计算速度;再次,通过等距膨胀构建完整的多层代价地图;最后,在实验室的自主机器人平台上进行...
  • 动态窗口 DWA 的实现包含两个步骤: (1)对机器人速度进行约束限制,形成动态窗口进行速度采样; (2)根据速度采样点求出待评价轨迹,最大化评价函数选取最优速度命令。 动态窗口是由一系列的约束构成,其中约束...
  • 蓝桥杯单片机必备知识-----(9)超声波测距

    千次阅读 多人点赞 2020-11-23 11:36:55
    蓝桥杯单片机必备知识-----(9)超声波测距 ...超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际
  • 超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离。 超声波发射器向某一方向发射超声波,在发射时刻的...
  • 针对移动机器人在有大型障碍物和运动空间相对狭窄的复杂环境中,人工势场(APF)容易出现反复震荡、路径规划时间较长以及大型障碍物附近避障困难的问题,提出了在结合边缘探测的APF路径规划基础上,加入自适应...
  • 结合原有的传统人工势场,通过将相对速度场和相对加速度场引入势场函数中,改进引力势场函数,使矿井机器人、无人机等导航装置在路径规划中,充分考虑导航装置自身的移动信息,使躲避移动障碍物成为可能,并且避免动目标...
  • DWA的局部规划方法

    千次阅读 2018-04-09 15:16:34
    动态窗口(DWA) 通过搜索良好选择的速度空间来考虑机器人的运动学特性 速度空间-&gt;一类构型空间 机器人假设沿弧线运动 保证机器人在撞到障碍物前停下来 使用目标函数o( )选择优化速度 DWA代码 ...
  • 由于简洁,高效等优点,人工势场已预先设定了自动移动机器人的在线实时路径规划,并受到广泛关注。...最终,机器人能够避免大量无谓避障,当与障碍物相对速度穿透时能提前避障,并且快速跟踪到目标。
  • 一、超声波模块:(HC-SR04) 超声波发射器向某一方向发射超声波,在...超声波测距原理:时间差测距详解:声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离s,即:s=34...
  • 为了提高平面提取的速度,我们首先计算深度图像中点的向量,通过向量来判断这些点是否在一个平面上。运用求点的向量可以同时检测多个复杂的平面,而且实验结果显示该方法比传统的3D Hough Transform以及RANSAC...
  • 、超声测距 原理

    千次阅读 2011-12-19 09:35:08
    其原理是超声波传感器发射一定频率的超声波,借助空气媒质传播,到达测量目标或障碍物后反射回来,经反射后由超声波接收器接收脉冲,其所经历的时间即往返时间,往返时间与超声波传播的路程的远近有关。测试传输时间...

空空如也

空空如也

1 2 3 4 5 6
收藏数 111
精华内容 44
关键字:

速度障碍法