vrep中的运动规划(主要是针对机械臂)(未完)_如何在v-rep中实现自己的规划算法-程序员宅基地

技术标签: 机器人学  机器人仿真软件verp  

1.0是什么 

具体可以看看vrep中自带的几个demo,以及之前的博客

robot motion planning介绍  

Vrep中支持的运动规划算法

Vrep中的RRT算法

还有大神冬木远景的博客:

V-rep学习笔记:机器人路径规划1 - 冬木远景  
V-rep学习笔记:机器人路径规划2 - 冬木远景


A motion planning task allows to compute a trajectory (usually in the configuration space of the manipulator) from a start configuration to a goal configuration, by taking into account following main
items(主要考虑以下四个要素):

  • the manipulator kinematics (机械臂的正逆运动学)
  • the manipulator joint limits  
  • the manipulator self-collisions
  • the collisions between manipulator and obstacles(机械臂的自我碰撞也是需要考虑的)

1.1一个运动规划任务可以分为以下两个步骤:

  • Finding a goal configuration that matches a goal pose
  • Finding a collision-free path from a start configuration to a goal configuration

相关图示:


1.2过程

  • Finding a goal configuration( goal pose已知,寻找合适的goal configuration)

       When the goal configuration is not known, but only a goal pose is known (i.e. a position and orientation of
the end-effector) then an appropriate manipulator configuration that satisfies the goal pose constraint has

to be found. There can be multiple (or even an infinitie number of) solutions:


不过有一点需要注意,找到的configuration并不一定需要完全符合goal pose,只要按照一定space metric计算方法,找到的configuration接近目标pose就可以了。


  • Finding a collision-free path(找到一条无碰撞的路径)
When searching for a collision-free path from a start configuration to a goal configuration, depending on
the manipulator type, there can be multiple (or even an infinitie number of) solutions, mainly also because

the search algorithm is based on a randomized resolution method:


  • Simplifying a found path (简化找到的路径) 

计算得出的原始路径可能很复杂,而且没有满足一些既定要求比如说路径最短、能量最少等等,需要进行简化。

Finding a path involves trying to link the start configuration to the goal configuration via randomly generated configurations. The found trajectory is usually a succession of straight lines in the configuration space, and the output of the operation is a succession of path nodes (or path configurations) that are distant to each other by a maximum of D, which is a configuration space distance:


A raw path is often not optimized and can rarely be used as-is. A simplification pass is usually required and involves trying to successively link path nodes via straight lines in the configuration space:

You should be aware that, depending on the selected parameters, the simplification procedure can be more lengthy than the path search in itself. For that reason a common practice to find an optimal path is to calculate several raw paths, then select the shortest path that will finally be simplified.

1.3伪代码示例

1. Starting with a manipulator start configuration, we want the end-effector to
move without collisions to a specific goal pose.
2. Search for a goal configuration that matches the goal pose 
3. Search for a path between the start and goal configurations
4. Repeat above steps 2 & 3 n times.
5. Select the shortest calculated path, and simplify it 

2.注意事项

2.1 机械臂运动学的选择

为了避免过约束,在vrep中逆运动学方法选择伪逆方法

The IK group should use an undamped resolution method (i.e. the pseudo inverse method), which means
that the IK element should not be overconstrained.

2.2 碰撞对象的设置

碰撞对象的检测主要有两类,一类是机械臂自身连杆之间的碰撞检测,二是机械臂和外界物理环境障碍物之间的碰撞检测。

collisionPairs: an array containing 2 entity handles for each collision pair. A collision pair is represented by a collider and a collidee, that will be tested against each other. The first pair could be used for robot self-collision testing, and a second pair could be used for robot-environment collision testing. The collider can be an object or a collection handle. The collidee can be an object or collection handle, or sim_handle_all, in which case the collider will be checked agains all other collidable objects in the scene. Can be NULL if collision checking is not required.

  • self-collisions: define a collection that contains the collidable links of the manipulator.
  • manipulator-environment collisions
那么,如果机械臂是要去抓取一个object,那这个object是要设置为障碍物吗?
  • 选择1     

    you can temporarily make that object non-collidable (or non-measurable). It will then not be detected as an obstacle anymore, however, it will neither be seen as part of the manipulator (i.e. a motion planning task will not take into account possible collisions between the object and the environment).

  • 选择2

        you can also make that object temporarily part of the manipulator. This way, a motion planning task will take into account possible collisions between the object and the environment too. To do this, best is to define a manipulator collection as the tree including all objects of the manipulator starting at its base, then by attaching the object to the manipulator base (i.e. making the manipulator base parent of the object), the object will also be part of the manipulator collection.

————————————————————————————————————————————————

2.在vrep中的实现

2.1 vrep中使用OMPL进行运动规划

  • Decide of a start and goal state. When the path planning object is a serial manipulator, a goal pose (or end-effector position/orientation) is often provided instead of a goal state. In that case function sim.getConfigForTipPose can be used to find one or several goal states that satisfy the provided goal pose.
  • Create a path planning task with simOMPL.createTask.
  • Select an algorithm with simOMPL.setAlgorithm.
  • Create the required state space, which can be composed as a compound object: simOMPL.createStateSpace and simOMPL.setStateSpace.
  • Specify which entities are not allowed to collide with simOMPL.setCollisionPairs.
  • Specify the start and goal state with simOMPL.setStartState and simOMPL.setGoalState.
  • Compute one or several paths with simOMPL.compute.
  • Destroy the path planning task with simOMPL.destroyTask.
  • Often, path planning is used in combination with inverse kinematics: in a pick-and-place task for instance, the final approach should usually be a straight-line path, which can be generated with sim.generateIkPath.

一下为代码实例:

findPath=function(startConfig,goalConfigs,cnt)
    -- Here we do path planning between the specified start and goal configurations. We run the search cnt times,
    -- and return the shortest path, and its length
	--1.创建任务
    local task=simOMPL.createTask('task')
	--2.选择合适的算法  RRTConnect
    simOMPL.setAlgorithm(task,simOMPL.Algorithm.RRTConnect)
	--3.创建状态空间  每一个关节都要创建一个状态空间
    local j1_space=simOMPL.createStateSpace('j1_space',simOMPL.StateSpaceType.joint_position,jh[1],{-170*math.pi/180},{170*math.pi/180},1)
    local j2_space=simOMPL.createStateSpace('j2_space',simOMPL.StateSpaceType.joint_position,jh[2],{-120*math.pi/180},{120*math.pi/180},2)
    local j3_space=simOMPL.createStateSpace('j3_space',simOMPL.StateSpaceType.joint_position,jh[3],{-170*math.pi/180},{170*math.pi/180},3)
    local j4_space=simOMPL.createStateSpace('j4_space',simOMPL.StateSpaceType.joint_position,jh[4],{-120*math.pi/180},{120*math.pi/180},0)
    local j5_space=simOMPL.createStateSpace('j5_space',simOMPL.StateSpaceType.joint_position,jh[5],{-170*math.pi/180},{170*math.pi/180},0)
    local j6_space=simOMPL.createStateSpace('j6_space',simOMPL.StateSpaceType.joint_position,jh[6],{-120*math.pi/180},{120*math.pi/180},0)
    local j7_space=simOMPL.createStateSpace('j7_space',simOMPL.StateSpaceType.joint_position,jh[7],{-170*math.pi/180},{170*math.pi/180},0)
    --4.设置状态空间
	simOMPL.setStateSpace(task,{j1_space,j2_space,j3_space,j4_space,j5_space,j6_space,j7_space})
    --5.设置碰撞对
    simOMPL.setCollisionPairs(task,collisionPairs)
    --6.设置开始和目标状态
    simOMPL.setStartState(task,startConfig)
    simOMPL.setGoalState(task,goalConfigs[1])--
    for i=2,#goalConfigs,1 do
	    --Add a goal state, without clearing previously set goal state(s), if any.
        simOMPL.addGoalState(task,goalConfigs[i])
    end
    local path=nil
    local l=999999999999
    forbidThreadSwitches(true)
    for i=1,cnt,1 do
    --7.计算出合适的路径
        local res,_path=simOMPL.compute(task,4,-1,300)
        if res and _path then
            local _l=getPathLength(_path)
            if _l<l then
                l=_l
                path=_path
            end
        end
    end
    forbidThreadSwitches(false)
    --8.destroy 创建的任务
    simOMPL.destroyTask(task)
    return path,l
end

以上的8个步骤为常规方法,缺乏灵活性,为了提高灵活性可以使用以下三个回调函数;

  • simOMPL.setStateValidationCallback
  • simOMPL.setProjectionEvaluationCallback
  • simOMPL.setGoalCallback



configuration space metric 也要讲一讲  看看怎么插进来


1.运动规划主要注意事项

 

 

5. 关于验证state

6.不足之处:规划出的路径并不完美,会有锯齿:


生成的路径曲线乍一看还不错,但是放大一些局部地区可以知道其实还不是很平滑,也许放慢机器人的动作速度,就可以知道

它运动的是否平滑。局部还有一些其它这样的突变。如何改善这个缺点我想是一个大课题。



参考:

1.Path and motion planning



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013528298/article/details/80495075

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签