精华内容
下载资源
问答
  • 运动规划

    2018-12-31 13:49:00
    参考:实例介绍机械臂运动规划及前沿研究方向(附PPT+视频) 1.引言  如 果你想要让机器人能帮你拿瓶子、做饭、收拾...有人觉得运动规划已经很 成熟了,无需再研究,但实际上,机械臂运动规划非常难,之所以这么...

    转载:https://www.cnblogs.com/lvchaoshun/p/6681541.html

    参考:实例介绍机械臂运动规划及前沿研究方向(附PPT+视频)

    1.引言

      如 果你想要让机器人能帮你拿瓶子、做饭、收拾屋子等,就必须赋予机器人快速生成无碰撞、最优运动轨迹的能力,这就需要靠运动规划了。有人觉得运动规划已经很 成熟了,无需再研究,但实际上,机械臂运动规划非常难,之所以这么难,主要是因为规划问题的维度太高(具体后面分析),目前暂无兼顾实时性与最优性的规划 算法。

    2.什么是运动规划(Motion Planning)

    2.1 定义

    我们可以从中给运动规划得出一个定义:

    在给定环境中,指定机器人起点与终点,计算出连接起点与终点,并满足一定约束条件(如避障)的轨迹。

    从数学角度上看,移动机器人的路径规划( Path Planning )也属于运动规划的范畴。但由于问题的维度不同,所以使用的算法也不同,大家习惯上将两者区分开。

    2.2 为什么研究路径规划

    (1)社会老龄化

      这是世界银行发布的关于中日两国国内生产总值(GDP)变化曲线图,小图是中日两国的人口结构,可以看到2000年日本和中国2015年的人口结构 已经很接近了,所以未来中国劳动力数量会减少,我们必须提高平均劳动生产力,这样才能防止GDP的增速减缓。机器人是可以解决这些问题的。

    (2)市场转变

      传统工业机器人主要应用在汽车行业,而这个行业的特点是一个车型可以生产很多年,同时每台车的利润也会相较较高,但是从目前来看机器人在汽车行业已 经基本饱和,所以大家的关注点开始转向3C(Computer、Communication、ConsumerElectronics)行业。

      3C产品具备这些特点:更新周期短、款式种类多、单件利润低、整体市场大、劳动力成本增加、对自动化需要加大。

    (3)示教

      现在我们工业机器人的使用方法通常是示教,即使像右图采用拖动示教这种比较便利的方式,效率还是很低,因为每一台机器人的示教都需要人参与进来,而 且示教的路径没办法应对其他一些环境的变化,尤其在3C行业你每次更新一次机型,我们就必须对流水线上所有的机器人重新示教,这样的效率肯定是不够高的。

    (4)加中间点

      当然,目前有些机器人应用是加入了机器视觉等技术,就是在检测之后让机器人应对一些变化情况。左边码垛机器人就是通过视觉可以抓取东西,但它的路径 是人工指定中间点。右边是我做过的类似插秧机器人,原理与前面码垛机器人类似。这类机器人想要在3C行业被灵活运用肯定是不行的,所以如果运动规划研究成 熟算法比较稳定的话,就可以用高级编程语言去编程,比如我们的指令让它抓取零件A然后加工零件B的某一面,这种下达指令的方式就不需要每一步都示教了。

    2.3 怎么做运动规划

    对于规划器的评价标准,我们现在有两个准则:

    • Optimality(最优性): 路径最短、规划速度最快等。
    • Complete(完备性):在有限时间内解决所有有解问题。

    3.运动规划算法

    3.1 二维运动规划

    (1)Walk To

    • 直接朝着目标走,直到到达目标点为止。
    • 很多 RPG 游戏就采用了这种简单的算法
    • 最优性,但不完备

    (2)优化算法(蚁群等)

    • 类似最优控制
    • 大部分情况下效果不错,但复杂问题很容易陷入局部极值
    • 不完备也不最优

    (3)人工势场

    • 在障碍物周围建立排斥势场
    • 从起点到终点构建吸引势场
    • 采用梯度下降等方式求解
    • 容易实现、效果很好
    • 可以与控制结合
    • 可能陷入局部极值
    • 不完备且不最优

    (4)图搜索算法

    • 将问题描述成图(节点+边)
    • 用图搜索算法解决问题
    • Dijkstra、A*
    • 在给定的图中完备且最优

    (5)可视图(Visibility Graph)

    • 用封闭多面体描述障碍物
    • 利用障碍物顶点间的连线构建一个图(graph),之后用图搜索算法求解
    • 站在某个顶点上,环绕四周,把你能看到(无障碍物)的顶点连接起来
    • 完备且最优

    (6)栅格化(Cell Decomposition)

    • 按一定分辨率将地图进行网格划分
    • 用四连通或八连通规则建立网格图
    • 分辨率完备(Resolution Complete)且最优

    (7)随机路图法

    • PRM(Probabilistic Road Maps)
    • 通过随机采样选取不碰撞的点
    • 两点连接采用简单的局部规划器如 Walk to 算法
    • 将起止点连入路图
    • 用图搜索求解
    • 概率完备且不最优

    (8)快速扩展随机树法

    • RRT(Randomly Exploring Randomized Trees)
    • 基于树状结构的搜索算法
    • 概率完备且不最优

    3.2 三维路径规划

      前面我们讲的都是2D点状机器人的情况,现在我们想怎么把这些问题推广到实际机器人上。实际机器人有两个问题,一个是机器人不再是一个点,需要将机器人的体积考虑在内,另外,机器人的自由度更高,原本的算法是否都还可用?

    (1)C空间(理论基础)

    • 构形空间,Configuration Space
    • 用向量描述机器人的构形
    • 在C空间内,机器人是一个点
    • C 空间拓扑性质与笛卡尔坐标系下的情况不同——二自由度机械臂的C空间是一个圆环面
    • 大部分机构(连续旋转关节、平动关节等)形成的构形空间均是微分流形,任一点的邻域均与欧式空间同态
    • 微分流形:大部分算法效果与在笛卡尔坐标下效果相同

    (2)高维度*

    • 蚁群等优化算法:收敛慢,更多局部极值点
    • 可视图法:在高维空间中,算法不成立
    • 栅格法:理论上可行;但会计算量太大;对于一个六自由度机械臂,我们按照6°分辨率(已经是很低的分辨率了)划分网格,那么将会产生606 = 4.67 × 1010 个网格,单是对每个网格进行碰撞检测(如果碰撞检测速度为0.1ms),就需要1296小时。
    • 一般在高于三维的问题上不使用该方法。

    (3)人工势场

    • 在 C 空间内建立势场不方便
    • 只对个别控制点进行计算,折算到每个关节上
    • 不完备且不最优,但对于简单的问题很实用

    (4)PRM 和 RRT

    • 不需要知道 C 空间的具体情况,只对随机采样点进行碰撞检测(判断是否在 C 空间的可行区域内)
    • 两点之间采用简单的局部规划器(如 Walk to)进行连接
    • PRM:获得一个图,采用图搜索算法求解
    • RRT:获得一个连接到终点的树,反向搜索即可
    • 在高维空间内可行,概率完备且不最优

    现状:主要使用 RRT 和 PRM 等 Sampling-based methods;这些算法计算的结果一般需要进行后处理(smoothing等)。

    (5)RRT 和 PRM 变种

    • C 空间
    • 随机采样(各种采样算法 T-RRT)
    • 有效性判断(如碰撞检测算法 AABB、减少碰撞检测 Lazy-RRT)
    • 局部规划器连接(各种连接方法、重新连接 RRT,PRM

    (6)RRT*

    • 渐进最优

    (7)Informed RRT*

    • 先验知识——只在sub-problem下采样

    4.其他

    4.1 理论学习

      Coursera: 宾大 Robotics: Computational Motion Planning (简单编程)

      Choset, Howie M. Principles of robot motion: theory, algorithms, and implementation. MIT press, 2005.

      经典论文+编程实现经典算法。

      • 实践

        ROS MoveIt!:http://moveit.ros.org/

        容易上手+容易修改

    4.2 前沿研究方向

      理论现状是,从运动学规划角度,给定足够多的时间一定能够最优且完备地求解到轨迹。从理论的角度而言,这个问题已经解决了。现在研究方向主要在这两个方面,探索新问题和做一些实用化工作。

    (1)新问题

    • 重规划 re-plan

      这个算是蛮实用的,因为每次规划完执行的过程中会遇到环境变化的问题,这就需要在执行过程中重新规划。重新规划的路线与之前的路线是连接的,而不是中间停下来重新走。上面是RSS在2016年的研究,感兴趣的可以了解下。

    • 考虑系统动力学

      理想状态下机器人在运动规划下直接端一杯水到一个地方就行了,但实际情况下这个过程是有动力学在里面,如果不做任何处理,这个杯子会掉。所以,在考虑了动力学之后,重新进行运动规划,这时候杯子才不会掉。这个问题还是比较简单的,因为你只需要把它变成一个约束就好了。

    • 考虑接触动力学

      因为我没有做这块东西,所以不太清楚它是怎么运作的,但是这个问题是存在的,因为在规划的时候会跟环境接触,例如这个机器人攀爬杆子然后落地,涉及 到整个身体动力学跟你身体运动的协调过程,这个工作是MIT计算机科学与人工智能实验室在2014年的实验。接触动力学比传统的单体动力学复杂很多,因为 我们不知道它接触的碰撞摩擦力这些不好建模。

    • 运动规划+任务规划

      运动规划是指我给你一个大任务,你自动生成一些小任务。这是IROS在2016年的一个工作,它的目标是让机器人到达对面这个点,而它的路径被障碍 物挡住了,这个时候把运动规划加进来,从更高一个空间维度去求解这个问题。第一步,它把这个桌子往前推,发现桌子推不动的时候对任务进行重规划,然后规划 到去推这个桌子,然后发现执行的效果与预计的不一样,所以它又生成新的任务,然后它拉开桌子之后就走到了对面实现了工作。这只是一个很简单的demo,但 实际上生活中会遇到很多这样的问题,比如我想从这个房间到另一个房间,而门是关着的,这个时候就需要把门打开。所以说,不是要给机器人生成很多子任务,而 是一个大任务,未来服务机器人想要做好这块是必须要做的。

    (2)实用化

      另外大部分时间大家都用在了实用化上,虽然说只要有足够时间它一定能求解出来,但实际情况下我们不可能给它无限的时间。另外RRT这些算法生成轨迹 很奇怪, 你可以看右边这个视频,只是让它敲这个东西它要画一大圈,所以这也是一个问题,就是怎么优化它的轨迹。所以需要将研究领域好的算法往工业领域推,目前两者 之间是存在很大缺口的。

    • 轨迹复用(相对固定的动作)

      这个工作是想办法把旧的轨迹给用起来,通过人工的方式指定一个运动微元,也就是原始轨迹,等到了新的环境后再进行改变。当然,这个爬楼梯的过程,环 境和动作基本上都相同,所以可以在这个微元的基础上进行改变。首先,通过变形的工作拉到现在起始点位置,部分起始点会重合,然后对这些新起始点进行重复利 用,它会形成一个好的轨迹。这个工作是Hauser et al在2008年发布的论文。现在存在的问题是运动微元必须由人工来指定,所以研究方向是由系统自动生成运动微元。

    • 旧轨迹信息(相对固定的环境)

      这是之前做的一个内容,比较简单但在相对固定的环境比较好用。大概原理就是根据人工示教的路径,通过高斯混合模型(GMM)对可行C空间进行建模, 之后在这个GMM-C空间内进行规划。这个方法有点类似Learning From Demonstration 的工作,但我只用了它们前面一半的步骤,后面一半还是采用采样的方法。

    • 加约束

      这个是我针对加工过程做的另一个工作。我们在工业领域用机器人往往期望的不是整个机械臂的动作,而只是末端的动作。假设我要抛光一个面,首先我要对 末端进行规划,用CAD模型就可以计算实现;得到路径后发给机器人,之后直接求逆解或者用雅克比迭代过去。当然,这种方法大部分时候够用,但有时候也会遇 到奇异点或者碰到障碍物。我就是针对这个七轴的机械臂,利用它的一个冗余自由度进行规划。因为末端是固定的轨迹,这个时候,只要找到冗余自由度对应的C空 间流形,我们就可以在这么一个低维(2维)流形内进行很快速的规划,实现末端固定轨迹,且关节避障避奇异。

    • 深度强化学习 DRL

      我个人现在现在最关注的一块,目前还没有实质性的东西出来,在这里就和大家讨论下,我觉得这一块未来会出来不少的研究成果。

      假设深度学习做运动规划,那么它进行一次运动规划的时间就是一次网络正向传播时间,这个时间非常短的,所以只要网络训练好后,运动规划需要耗费很长 时间的问题就没有了。目前这块也有一些这方面的研究,上面左边图是用深度学习玩游戏,Nature上的一篇论文,效果比人还厉害;右上角是谷歌用深度学习 来开门;右下角就是AlphaGo下围棋了。这个是很有意思的,它也是运动规划和控制的问题,但它是用网络来做的映射。

      我为什么对这方面很感兴趣呢?首先,CNN已经具备强大的环境理解能力,很容易从观测估计状态,观测是图片这类,而状态,如果是物体识别,就是是什 么物体,如果是定位,那就是物体在什么地方。也就是说,在给定信息满足系统状态可观性的前提下,CNN环境理解能力是非常强大的。

      第二个就是RL(强化学习)可以进行路径规划,通过 value iteration 等方式建立表格,这个表格纪录的是从状态到动作的映射。不过运动规划的维度这么高不可能用表格来存,所以可以通过神经网来解决这个映射问题。

    5.参考网址

    V-rep学习笔记:机器人路径规划1

    RRT路径规划算法

    基于Mathematica的机器人仿真环境(机械臂篇)

    RRT基本概念

    基于RRT搜索算法的六自由度机械臂

     

    转载于:https://www.cnblogs.com/guojun-junguo/p/10201945.html

    展开全文
  • 机器人运动控制与规划第一章移动机器人的非完整运动规划指南pdf,机器人运动控制与规划第一章移动机器人的非完整运动规划指南
  • 运动规划大纲

    2019-11-06 10:50:33
    运动规划在整个机器人中的地位 现在一般的机器人的运动规划都是在地图里面的 (已知地图) 运动规划的过程 运动规划一般分成前端和后端 前端一般是直接规划出一条从起点到终点的路径,一般情况下,前端只要保证不和...

    运动规划在整个机器人中的地位

    • 现在一般的机器人的运动规划都是在地图里面的 (已知地图)

    运动规划的过程

    运动规划一般分成前端和后端
    前端一般是直接规划出一条从起点到终点的路径,一般情况下,前端只要保证不和障碍物相撞就行了。
    后端是在前端规划的路径上进行优化(eg.加入动力学模型).
    值得注意的是,后端在优化的时候不是一次对全部的前端路径进行优化,
    而是只截取离机器人较近的一段进行优化。
    
    • 前端
      1.只需要搜索出一条从起点到终点的安全路径
      2.路径是低维的(一般只含有path的position)
      3.路径是离散的
    • 后端
      1.要搜索(优化)出一条机器人可执行的路径
      2.路径是高维的(必须包含控制信息)
      3.路径是连续的

    运动规划的方法

    • 前端(path finding)
      基于搜索
      1.图搜索
      2.Dijkstra 和 A*
      3.jump point search
      基于采样
      1.probabilistic road map
      2.rapidly-exploring random tree(RRT)
      3.optimal sampling-based method
      4.advance sampling-based method
    快速扩展随机树RRT:
    在状态空间中向所有可扩散的区域扩散树(碰撞检测),生成一个随机扩展树。
    当树上的叶子节点触碰(包含)目标节点之后,就能通过树干生成一条路径。
    

    满足动力学约束
    1.state-state boundary value optimal control problem
    2.state lattice search
    3.kindynamic RRT*
    4.Hybrid A*

    Hybrid A*
    2010年,斯坦福首次提出一种满足车辆运动学的算法(Hybrid A*),并在(DARPA)的城市挑战赛中得以运用。
    
    • 后端(trajectory generation)
      1.minimum-snap trajectory generation
      2.sotf and hard constrained trajectory optimization

    运动规划的难点和应用

    map

    • occupancy grid map
    • octo-map
    • voxel hashing
    • point cloud map
    • tsdf map
    • esdf map
    展开全文
  • 运动规划/路径规划/轨迹规划

    万次阅读 多人点赞 2017-01-07 16:01:27
    引言查阅互联网资料与相关文献,略作总结,以期完善:运动规划、路径规划、轨迹规划的联系与区别? motion planning path planning trajectory planning

    引言

    查阅互联网资料与相关文献,略作总结,以期完善:


    运动规划、路径规划、轨迹规划的联系与区别?

    • motion planning
    • path planning
    • trajectory planning

    路径规划是运动规划的主要研究内容之一。运动规划由路径规划和轨迹规划(时间)组成,连接起点位置和终点位置的序列点或曲线称之为路径,构成路径的策略称之为路径规划。
    路径是机器人位姿的一定序列,而不考虑机器人位姿参数随时间变化的因素。路径规划(一般指位置规划)是找到一系列要经过的路径点,路径点是空间中的位置或关节角度,而轨迹规划是赋予路径时间信息。
    运动规划(又称运动插补)是在给定的路径端点之间插入用于控制的中间点序列从而实现沿给定的平稳运动。运动控制则是主要解决如何控制目标系统准确跟踪指令轨迹的问题。即对于给定的指令轨迹,选择适合的控制算法和参数,产生输出,控制目标实时,准确地跟踪给定的指令轨迹。
    路径规划的目标是使路径与障碍物的距离尽量远同时路径的长度尽量短;轨迹规划的目的主要是机器人关节空间移动中使得机器人的运行时间尽可能短,或者能量尽可能小。轨迹规划在路径规划的基础上加入时间序列信息,对机器人执行任务时的速度与加速度进行规划,以满足光滑性和速度可控性等要求。


    根据分类标准不同,有

    a. 基于模型和基于传感器的路径规划

    c-空间法、自由空间法、网格法、四叉树法、矢量场流的几何表示法等。相应的搜索算法有A*、遗传算法等。

    b. 全局路径规划(global path planning)和局部路径规划(local path planning)

    局部路径规划主要解决机器人定位和路径跟踪问题,方法有人工势场法、模糊逻辑法等。全局路径规划将全局目标分解为局部目标,再由局部规划实现局部目标,方法有可视图法、环境分割法(自由空间法、栅格法)等。

    c. 离线路径规划和在线路径规划

    离线路径规划是基于环境先验完全信息的路径路径规划。完整的先验信息只能适用于静态环境,路径是离线规划的;在线路径规划是基于传感器信息的不确定环境的路径规划,路径必须是在线规划的。


    其他:

    环境类型:

    已知环境下的静态障碍物;已知环境下的动态障碍物;未知环境下的静态障碍物;未知环境下的动态障碍物。(已知环境指障碍物大小、形状和位置对规划系统精确已知;未知环境指上述未知或部分未知。)

    运动规划算法通常有两个评价指标:

    完备性(complete): 利用该算法,在有限时间内能解决所有有解问题;
    最优性(optimality): 利用该算法,能找到最优路径(距离最短、耗时最小、耗能最少等)

    研究目的:

    一则找到最优解;一则快速找到有效解。

    开源运动规划库(OMPL):

    开源运动规划库(open motion planning library)是一个运动规划C++库,其中包含很多运动规划领域的前沿算法。总体上OMPL是一个基于采样规划算法库。
    为什么选择OMPL?OMPL由于其模块化的设计和稳定的更新,成为最流行的规划软件库之一,很多新算法都在OMPL上开发。很多其他软件(ROS/MoveIt)都使用OMPL做运动规划。

    MoveIt:

    OMPL有单独的ROS接口,但是繁杂,而MoveIt是OMPL ROS接口的接口,并且还结合了其他一些功能。通俗来说,MoveIt就是一个模块化接口,让你在最短的时间内,不用自己编写过多代码,就能配置出一个ROS Package。

    参考:

    • Coursera公开课《Robotics:Computational Motion Planning》
    • 《Planning Algorithms》
    • 《Principles of Robot Motion Theory, Algorithms, and Implementations》
    展开全文
  • 卡耐基梅隆大学的机器人运动规划课件,全英文,适合入门
  • 综述了基于随机采样的运动规划方法. 首先介绍了基于随机采样的运动规划的发展历程和几种典型方法; 然后分析了这一类规划方法的重要性质及目前仍然存在的问题; 最后展望了基于随机采样的运动规划的应用前景.</p>
  • ROS笔记(35) 笛卡尔运动规划

    万次阅读 热门讨论 2019-08-29 08:20:36
    笛卡尔运动规划、启动轨迹可视化机械臂、运动规划、部分代码解析、启动规划


    1. 笛卡尔运动规划

    而在ROS笔记(34) 工作空间规划 中的运动规划并没有对机器人终端轨迹有任何约束
    目标位资给定后,可以通过运动学反解获得关节空间下的各轴弧度
    接下来的规划和运动依然在关节空间中完成

    但是在很多应用场景中,不仅关心机械臂的起始、终止位姿,对运动过程中的位姿也有要求
    比如希望机器人终端能够走出一条直线或圆弧轨迹
    Movelt!同样提供笛卡尔运动规划的接口

    笛卡尔何许人也?
    人可能不认识,但他的哲学命题“我思故我在”一定听说过
    不会哲学的数学家和物理学家,不是一个好的神学家
    所运用的是笛卡尔坐标系,就是直角坐标系和斜坐标系的统称


    2. 启动轨迹可视化机械臂

    hharm_planning功能包中创建一个arm_planning_with_trail.launch文件启动所需要的各种节点并且可视化终端轨迹
    内容与arm_planning.launch的几乎一致,只是修改了rviz启动文件
    添加了终端轨迹的可视化显示设置,可以更方便地对比运动效果

    <!-- 启动rviz可视化界面 -->
    <node name="rviz" pkg="rviz" type="rviz" args="-d $(find hharm_planning)/rviz/arm_paths.rviz" required="true" />
    

    启动arm_planning_with_trail.launch文件

    $ roslaunch hharm_planning arm_planning_with_trail.launch
    

    在这里插入图片描述


    3. 运动规划

    创建一个moveit_cartesian_demo.py文件启动笛卡尔运动规划

    import rospy, sys
    import moveit_commander
    from moveit_commander import MoveGroupCommander
    from geometry_msgs.msg import Pose
    from copy import deepcopy
    
    class MoveItCartesianDemo:
        def __init__(self):
    
            # 初始化move_group的API
            moveit_commander.roscpp_initialize(sys.argv)
    
            # 初始化moveit_cartesian_demo节点
            rospy.init_node('moveit_cartesian_demo', anonymous=True)
            
            # 是否需要使用笛卡尔空间的运动规划
            cartesian = rospy.get_param('~cartesian', True)
                            
            # 初始化需要使用move group控制的机械臂中的arm group
            arm = MoveGroupCommander('arm')
            
            # 当运动规划失败后,允许重新规划
            arm.allow_replanning(True)
            
            # 设置目标位置所使用的参考坐标系
            arm.set_pose_reference_frame('base_link')
                    
            # 设置位置(单位:米)和姿态(单位:弧度)的允许误差
            arm.set_goal_position_tolerance(0.01)
            arm.set_goal_orientation_tolerance(0.1)
            
            # 获取终端link的名称
            end_effector_link = arm.get_end_effector_link()
                                            
            # 控制机械臂运动到之前设置的“forward”姿态
            arm.set_named_target('forward')
            arm.go()
            
            # 获取当前位姿数据最为机械臂运动的起始位姿
            start_pose = arm.get_current_pose(end_effector_link).pose
                    
            # 初始化路点列表
            waypoints = []
                    
            # 将初始位姿加入路点列表
            if cartesian:
                waypoints.append(start_pose)
                
            # 设置第二个路点数据,并加入路点列表
            # 第二个路点需要向后运动0.2米,向右运动0.2米
            wpose = deepcopy(start_pose)
            wpose.position.x -= 0.2
            wpose.position.y -= 0.2
    
            if cartesian:
                waypoints.append(deepcopy(wpose))
            else:
                arm.set_pose_target(wpose)
                arm.go()
                rospy.sleep(1)
             
            # 设置第三个路点数据,并加入路点列表
            wpose.position.x += 0.05
            wpose.position.y += 0.15
            wpose.position.z -= 0.15
              
            if cartesian:
                waypoints.append(deepcopy(wpose))
            else:
                arm.set_pose_target(wpose)
                arm.go()
                rospy.sleep(1)
            
            # 设置第四个路点数据,回到初始位置,并加入路点列表
            if cartesian:
                waypoints.append(start_pose)
            else:
                arm.set_pose_target(start_pose)
                arm.go()
                rospy.sleep(1)
                
            if cartesian:
                fraction = 0.0   #路径规划覆盖率
                maxtries = 100   #最大尝试规划次数
                attempts = 0     #已经尝试规划次数
                
                # 设置机器臂当前的状态作为运动初始状态
                arm.set_start_state_to_current_state()
         
                # 尝试规划一条笛卡尔空间下的路径,依次通过所有路点
                while fraction < 1.0 and attempts < maxtries:
                    (plan, fraction) = arm.compute_cartesian_path (
                                            waypoints,   # waypoint poses,路点列表
                                            0.01,        # eef_step,终端步进值
                                            0.0,         # jump_threshold,跳跃阈值
                                            True)        # avoid_collisions,避障规划
                    
                    # 尝试次数累加
                    attempts += 1
                    
                    # 打印运动规划进程
                    if attempts % 10 == 0:
                        rospy.loginfo("Still trying after " + str(attempts) + " attempts...")
                             
                # 如果路径规划成功(覆盖率100%),则开始控制机械臂运动
                if fraction == 1.0:
                    rospy.loginfo("Path computed successfully. Moving the arm.")
                    arm.execute(plan)
                    rospy.loginfo("Path execution complete.")
                # 如果路径规划失败,则打印失败信息
                else:
                    rospy.loginfo("Path planning failed with only " + str(fraction) + " success after " + str(maxtries) + " attempts.")  
    
            # 控制机械臂回到初始化位置
            arm.set_named_target('home')
            arm.go()
            rospy.sleep(1)
            
            # 关闭并退出moveit
            moveit_commander.roscpp_shutdown()
            moveit_commander.os._exit(0)
    
    if __name__ == "__main__":
        try:
            MoveItCartesianDemo()
        except rospy.ROSInterruptException:
            pass
    

    还增加了cartesian参数设置,方便看到不同类型规划的运动效果


    4. 部分代码解析

    相比之前的例程以上代码略显复杂,因为需要兼容两种运动模式
    在不需要使用笛卡尔运动规划的模式下,与 ROS笔记(34) 工作空间规划 的工作空间规划相同
    主要分析笛卡尔路径规划部分的代码

    waypoints = []
    
    if cartesian:
        waypoints.append(start_pose)
    

    这里需要了解 “waypoints” 的概念,也就是路点
    waypoints 是一个路点列表,意味着笛卡尔路径中需要经过的每个位姿点,相邻两个路点之间使用直线轨迹运动

    wpose = deepcopy(start_pose)
    wpose.position.x -= 0.2
    wpose.position.y -= 0.2
    
    if cartesian:
        waypoints.append(deepcopy(wpose))
    

    这里要说明一下为什么用深度复制deepcopy
    如果直接用“=”,而start_pose是可变对象,只是拷贝了内存中的地址引用,两个对象的地址引用一样
    所以两个对象的值会随着一方的修改而修改
    而深度复制的值是完全隔离的,与复制对象是完全不同的两个对象
    这样可以在最后执行调用规划时
    后续才可以实现每个阶段累加修改,而不是某个变量取最后修改的状态
    即,第二和第三步实现终端位置x-0.2,y-0.2的改变
    然后在此基础上x+0.05,y+0.15,z-0.15的改变
    并且最后start_pose维持不变

    while fraction < 1.0 and attempts < maxtries:
    	(plan, fraction) = arm.compute_cartesian_path (
    	                        waypoints,   # waypoint poses,路点列表
    	                        0.01,        # eef_step,终端步进值
    	                        0.0,         # jump_threshold,跳跃阈值
    	                        True)        # avoid_collisions,避障规划
    	
    	# 尝试次数累加
    	attempts += 1
    	
    	# 打印运动规划进程
    	if attempts % 10 == 0:
    	    rospy.loginfo("Still trying after " + str(attempts) + " attempts...")
    

    将运动需要经过的路点都加入路点列表中,但此时并没有开始运动规划
    这是整个例程的核心部分,使用了笛卡尔路径规划的API compute_cartesian_path
    它共有四个参数:
    第一个参数:之前创建的路点列表
    第二个参数:终端步进值
    第三个参数:跳跃阈值,设置为0代表不允许跳跃
    第四个参数:设置运动过程中是否考虑避障
    compute_cartesian_path 执行后会返回两个值:plan 和 fraction
    plan:规划出来的运动轨迹
    fraction:描述规划成功的轨迹在给定路点列表中的覆盖率,从0到1,如果fraction小于1,说明给定的路点列表没办法完整规划,这种情况下可以重新进行规划,但需要人为设置规划次数

    if fraction == 1.0:
        rospy.loginfo("Path computed successfully. Moving the arm.")
        arm.execute(plan)
        rospy.loginfo("Path execution complete.")
    

    如果规划成功,fraction的值为1
    此时就可以使用execute控制机器人执行规划成功的路径轨迹了

    这个例程的关键是了解compute_cartesian_path 这个API的使用方法
    可以实现一系列路点之间的笛卡尔直线运动规划

    如果希望机器人的终端走出圆弧轨迹
    也可以将圆弧分解为多段直线后,使用compute_cartesian_path控制机器人运动


    5. 启动规划

    运行moveit_cartesian_demo.py文件启动笛卡尔运动规划

    rosrun hharm_planning moveit_cartesian_demo.py _cartesian:=True
    

    可以看到运动轨迹,机器人终端以直线方式完成多个目标点之间的运动

    在这里插入图片描述
    再使用如下命令运行不带路径约束的运动规划

    rosrun hharm_planning moveit_cartesian_demo.py _cartesian:=False
    

    机器人终端的运动轨迹不再以直线轨迹运动

    在这里插入图片描述

    从以上两种运动规划的轨迹可以看出,笛卡尔运动规划需要保证机械臂运动的中间姿态


    参考:

    ROS官方wiki
    古月居


    相关推荐:

    ROS笔记(34) 工作空间规划
    ROS笔记(33) 关节空间规划
    ROS笔记(32) MoveIt!关节控制器
    ROS笔记(31) ArbotiX关节控制器
    ROS笔记(30) Movelt!配置文件


    谢谢!

    展开全文
  • 运动规划简介

    千次阅读 2018-01-24 20:57:10
    运动规划简介 当虚拟人开始一次漫游时,首先全局规划器根据已有的长期信息进行全局静态规划,确定虚拟人应该经过的最优化路线。然后全局规划器控制执行系统按照该路径运动。在运动过程中,感知系统会持续对周围环境...
  • MoveIt!运动规划库OMPL和路径规划算法

    千次阅读 2020-03-23 11:25:55
    运动规划(Motion Planning):要让一个机器人实现运动规划,需要先将机器人抽象到构形空间(C-Space)。MoveIt就可以帮大家把这些工作给做了,只需提供机器人URDF模型,就可以调用几大运动规划库的规划算法(如OMPL...
  • 在ROS平台下,建立移动...通过ROS平台下移动平台的自主导航功能包和实现机械臂运动规划的Motion Planning插件共同完成移动操作臂的运动规划。通过分析运动规划过程中机械臂各关节的运动信息,验证运动规划结果的合理性。
  • 多机器人运动规划研究现状pdf,提供“多机器人运动规划研究现状”免费资料下载,主要包括多机器人技术研究现状、多机器人运动规划研究现状、多机器人系统仿真平台的研究现状 等内容,可供学习使用。
  • 文章目录运动规划、路径规划和轨迹规划路径规划算法随机采样的算法梯度下降法轨迹规划算法基本思路开源算法介绍总结参考资料: 运动规划、路径规划和轨迹规划 机器人的运动规划可以看做是包括了路径规划和轨迹规划两...
  • 针对现有煤矿井下移动机器人运动规划所生成的轨迹存在超调、碰撞、不连续、不光滑等问题,提出了一种由路径规划、轨迹生成、轨迹优化3个部分构成的煤矿井下移动机器人运动规划方法。路径规划采用基于图搜索的A*算法...
  • 开源运动规划库(OMPL)
  • 七. 运动规划与任务规划

    千次阅读 2018-09-22 14:53:04
    运动规划和任务规划同属机器人的研究热点,对于初学者来说,这两个概念比较容易混淆。 运动规划,即motion planning(和路径规划即path planning做的事情也类似,因此有时可以看做一个东西),顾名思义,就是在给定...
  • 基于行为的机器人运动规划算法及仿真实验,郑嫦娥,刘晋浩,基于行为的运动规划方法在障碍物较多时机器人一直处于避障模式,运动效率低。针对此问题,本文提出了基于不同权重行为的运动规划
  • 多移动机器人分布式运动规划与应用pdf,多移动机器人分布式运动规划与应用
  • 提出了一种移动机器人局部运动规划方法,用于增强机器人的寻优能力,降低时间复杂度.该运动规划方法以相对方位作为导航中决策的基本依据.这种决策方法完全抛弃了决策过程中的全局评估部分,采用了一种单纯的局部评估...
  • 粉色系产后瘦身运动规划机构网站html模板
  • 基于在线图搜索的移动机器人遍历运动规划
  • ROS moveit运动规划

    2019-11-28 11:12:40
    使用moveit中的c++接口进行运动规划 拟解决的问题是已知末端的几个关键位姿,规划一条路径,使得机械臂能够从静止开始经过每个路点直到停止。使用的关键函数是computeCartesianPath 该函数说明如下 double moveit::...
  • 下面的视频展示了DARPA Urban Challenge(DARPA 2007)中Stanford Racing Team的无人车Junior使用的运动规划(Motion Planning)算法Hybird A*在增量构建的迷宫场景、阻断的道路场景和停车场狭窄停车位场景的实际表现。...
  • 提出一种基于GA 和SQP 求解机械臂最优运动规划问题的混合算法. 首先采用B 样条函数逼近关节运动 轨迹, 将最优控制问题转化为有约束的非线性规划问题, 然后引入基于种群的GA 算法, 给出全局最优解的初始估 ...
  • Q:运动规划、轨迹规划、路径规划的区别与联系? A:这几个概念在国内的教材里确实比较混乱,所以我按照我的理解大概说一下:①运动规划(Motion Planning)就是我这次说的主要内容;②路径规划(Path Planning)跟...
  • 复杂环境下基于RRT的智能车辆运动规划算法
  • 绿色系户外跑步路线减脂运动规划网站html模板
  • 知乎 运动规划和路径规划 Making animations that “feel right” can be tricky. 制作“感觉不错”的动画可能很棘手。 When I’m stuck, I find Disney’s 12 principles of animation useful. They’re ...
  • 文章目录前言发展历程通用运动规划方法基于自由空间 Cfree几何构造的规划方法可视图法 前言 阅读移动机器人运动规划研究综述心得 总结一下,机器人运动规划的发展历程,算法和思路。 搜索策略和环境建模的角度将它们...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,772
精华内容 1,108
关键字:

运动规划