ROS中机械手臂的运动规划
我是跳过了正逆运动学的内容,可以参考1。
机器人手臂的运动规划是一个很宽泛的领域,包含有寻多子问题。比如,人们可能会关注机器人可以执行的最佳轨迹,以在最短时间内从某个开始姿态到某个最终姿态,这受制于致动器工作和关节运动范围的限制。另一种变形是根据驱动器的机械特性对手臂运动进行规划,比如提重物最省力的运动规划。常见的问题是机器人的各个关节从一个初始位置运动到目标位置过程中的避障问题。要执行的任务可能需要特定的末端执行器轨迹,例如, 如激光切割,密封剂分配或缝焊。 在这种情况下,终点的速度可能受到任务的限制(例如,对于最佳材料移除速率,焊枪速度或分配速率)。在要求苛刻的情况下,运动计划必须实时进行,例如, 产生动作去抓球。 在另一个极端情况下,可以离线计算用于刻板行为的一些运动计划(例如,将手臂折叠成紧凑的运动姿势),并将结果保存用于执行作为死记硬背的技能。 在通信延迟较大的情况下,监督控制可能是最好的方法。 在这种情况下,可以在提交远程系统执行批准的计划之前计划一个动作并在模拟中预览结果。
笛卡尔Cartesian运动规划
cartesian_planner 包包含了多种笛卡尔规划器的源码,包括arm7dof_cartesian_planner.cpp, ur10_cartesian_planner.cpp, baxter_cartesian_planner.cpp等为各自机器人定义的规划库。这些规划库的任务是沿着笛卡尔路径采样点,为路径上的每一个点的位姿计算逆运动学选项,找到完成笛卡尔路径的最优角空间序列。
通常,需要跟踪的笛卡尔路径是任务独立的。笛卡尔规划器展示了路径采样与计算吸引人的角空间轨迹的方法,但是他们的通用性都有一定的限制。这里描述的笛卡尔运动规划器有许多运动规划选项:
- 在角空间坐标中指定一个起始位姿和角速度,在笛卡尔空间中指定目标位姿。根据起始角度到目标姿态的逆运动学解计算关节空间的轨迹。
- 指定角空间中的起始位置和速度,确定笛卡尔空间中的目标位姿,通过沿着一条直线的采样点计算笛卡尔轨迹。这样满足末端抓手方向的轨迹可以很快获得,并且在现行运动过程中得到保持。
- 指定起始位姿、角速度和期望的笛卡尔单步长运动。采样的笛卡尔位姿将会从起始点位姿开始计算,沿着一条直线开始变换,并保持初始的方向不变。
指定笛卡尔起始点和终止点相对于基座的位姿。只考虑终点的方向。忽略起点的方向。在从起始位置到终止位置的直线运动过程中,保证固定方向的一系列位姿就能计算出来。
example_arm7dof_cart_path_planner_main.cpp 节点显示了如何使用笛卡尔规划器arm7dofcartesianplanner.cpp,这个规划器依赖于相关的运动学库arm7dof_ki_ik和关节空间规划器的支持。同样的,也提供了Baxter机器人和Universal Robots UR10机器人的例子。
运行roscore后输入下面的命令启动。会产生一个保存关节路径的文件arm7dof_poses.path
rosrun cartesian_planner example_arm7dof_cart_path_planner_main
对于这个例子,沿笛卡尔路径计算60个样本。 在每个采样点,逆运动学选项以基础接头0.1rad的增量进行计算。 这导致每个笛卡尔采样点大概有200个IK解决方案(在这个例子中,每个笛卡尔姿态的解决方案范围从130到285个IK)。
主要代码
// this will be an arm7dof planner, because we will link with this libraryCartTrajPlanner cartTrajPlanner; //instantiate a cartesian planner objectR_gripper_up = cartTrajPlanner.get_R_gripper_up();//specify start and end poses:a_tool_start.linear() = R_gripper_up;a_tool_start.translation() = flange_origin_start;a_tool_end.linear() = R_gripper_up;a_tool_end.translation() = flange_origin_end;//do a Cartesian plan:found_path = cartTrajPlanner.cartesian_path_planner(a_tool_start, a_tool_end, optimal_path);
根据起始点和目标点进行轨迹规划,结果保存在optimal_path中。一共61行数据,保存在路径文件中。
每一行指明了七个关节的角度,是笛卡尔空间位姿的逆解。从所有逆解中找到最优的角空间值是有支持库提供的,将在下一部分提到。
例子中使用的规划库可以进行离线规划。另外规划库可以使用action server执行运动规划。这些将在后续提到。
角空间规划的动态规划
从逆运动学解中寻找最优角空间解是一项很有挑战的事。这里描述了一种角空间规划的动态编程方法,这种方法应用在了大量的机器人中,至少是在低维度的机器人中,比如七自由度的机器人。
从大量的选项中寻找最优角空间序列的方法是采用动态规划的方法。从概念上来解释考虑如下的前馈图(这个图是这样构成的:完成一条路径计划走多少步就有多少层,即多少列;每一个姿势即每一层有多少个解,那每一列中就有多少个元素)
这个网络由六层组成(六列),每一层都包括了一定数量的节点(每一列中的圆圈)。第l层的第m个节点由nl,mnl,mn_{l,m}表示,它可能与第l+1层的第n个节点有连接,但是nl,mnl,mn_{l,m}与其它层的节点没有连接(连接不会反向传播)。
这个网络中的一条路径从L1层的某个节点开始,在L6层中的某个节点结束,经过了路径上的全部六个节点。任何这样的路径都有一个相应的损失函数C,是所有的状态损失和变换损失的总和。状态损失是经过一个给定节点相关的损失,转换损失是从节点nl,mnl,mn_{l,m}到节点nl+1,nnl+1,nn_{l+1,n}的链路相关的损失,可以表示成Cl,m,nCl,m,nC_{l,m,n}。路径损失函数CCC是标量,是所有的状态和转换损失的总和(在本例中,有六个状态和五个转换)。因此,一个备选路径可以路径损失函数来进行评分。要解决问题的最优目标是寻找到一条从L1层到L6层所需路径成本最小的路径。
对于关节角空间的规划问题,我们可以将每一层解释为沿着特定的笛卡尔路径采样得到的六自由度任务空间姿态。其目的是让工具法兰沿着这条路径运动,比如演示一个切的操作,我们可以沿着这条路径序列标记六个点。对于切的操作,我们没有必要跳过或者返回这些点。而且,每一个笛卡尔子目标点必须实现序列化。我们需要末端点到达每一个笛卡尔位姿。然而,通过计算逆运动学,我们可以找到有许多角空间解可以到达目标位置。我们在第l个笛卡尔位姿中可能会选择第m个角空间解,即节点nl,m" role="presentation">nl,mnl,mn_{l,m}。(依赖于所选择的采样分辨率,在每一个任务空间采样点或每一层中,我们都可能需要考虑大量的逆运动学可替代解)。在网络中的每一个节点都描述了机器人关节空间中的一个姿势。从每一层选择一个节点就描述了关节空间轨迹,这就保证了能够通过沿着任务空间轨迹采样的一系列笛卡尔空间点。
对于上文中提到的给定节点的状态损失函数可能通过多种评价标准来打分。比如,一个机器人的姿态可能会导致自我碰撞或与环境碰撞的话,就会被分配一个无穷大的损失值(或者,更简单的,从网络中移除)。一个节点如果接近碰撞,那么就会得到一个很高的状态损失值。接近奇异点的节点也会有一个惩罚值。其他依赖姿势的评价准则也会考虑其中。转换损失应该惩罚大幅度的运动。比如,一条路径包括从l层到l+1层移动基关节/pi/pi/pi个弧度,这会在高惯性的关节产生很高的加速度……同样的,突然的腕部翻转也是不允许的,尽管两层的逆运动学解都是正确的,但是在层与层之间关节角度大幅度的变化都是不允许的。
不同的最优路径解决方案会导致不同的状态分配策略和转换惩罚方案。设计这需要考虑如何分配关节空间姿势的损失函数,如何分配转换损失,笛卡尔空间采样点的位置和数量,和每一个采样点逆运动学解的数量。我们已经把规划问题表示成了一个前馈图,可以采用图解决技术来整理我们的问题,产生一组关节空间序列来使机器人通过选择的笛卡尔空间姿势。
对于这类图,可以有效地应用动态规划的方法。过程如下。从最后一层向前反馈,每一个节点都分配一个损失值。对于最后一层,损失值只含有状态损失。
回到L-1层(本例中的L5层),这一层的每个节点都分配了一个损失值。比如L5层中的节点1,n5,1n5,1n_{5,1},只有两个操作:以c5,1+c5,1,1+c6,1c5,1+c5,1,1+c6,1c_{5,1}+c_{5,1,1}+c_{6,1}的成本变换到节点n6,1n6,1n_{6,1},或者以c5,2+c5,1,2+c6,2c5,2+c5,1,2+c6,2c_{5,2}+c_{5,1,2}+c_{6,2}的成本转换到节点n6,2n6,2n_{6,2},对于节点n5,1n5,1n_{5,1},它的到达成本应该被分配成两种操作的最小值,记为c5,1c5,1c_{5,1},n5,2n5,2n_{5,2}节点的损失值也按同样的方式计算,记作c5,2c5,2c_{5,2}。
继续向前,当计算到l层节点层损失值时,可以假设l+1层的成本损失值都已经计算得到了。为了计算l层的m节点的损失值cl,mcl,mc_{l,m},考虑l+1层的每个节点n,然后计算相关的cl,m,n=cl,m+cl+1,ncl,m,n=cl,m+cl+1,nc_{l,m,n}=c_{l,m}+c_{l+1,n}。从这些选项中找到最小的损失值,赋给cl,m,ncl,m,nc_{l,m,n}。在这个过程中,损失值计算了网络中的所有节点,并且计算这些成本在每一层都是相当有效的。
考虑到为每个节点分配成本的成本,通过网络可以通过遵循成本cl,mcl,mc_{l,m}最陡的梯度来找到通过网络的最佳路径。
总之,角空间的动态规划就是要构建一个上方的图,该图的层数与所要规划路径长度和单步步长有关,比如我想规划一段从(1.5,0.3,1.5)(1.5,0.3,1.5)(1.5,0.3,1.5)到(−1.5,0.3,1.5)(−1.5,0.3,1.5)(-1.5,0.3,1.5)的路径,单步规划步长取为0.050.050.05,3除以0.05有60段共计61个点,所以取规划图的层数为61层,每一个层也就是在每一个规划点处可能有n个解,每一个解对应一个节点(node),由于规划的机器人有七个自由度,所以每个节点的维数为7。规划过程中要先求出每一层中所有节点的值,然后根据节点静态及动态cost函数进行动态规划,从这样的一个图中找出一个最优解。
笛卡尔运动action server
……
- A Systematic Approach to Learning Robot Programming with ROS。 ↩
ROS中机械手臂的运动规划相关推荐
- MATLAB轨迹规划 发给ROS中机器人实现仿真运动
MATLAB轨迹规划 发给ROS中机器人实现仿真运动 现象如图所示: 0.matlab 与 ROS 通信: https://blog.csdn.net/qq_40569926/article/deta ...
- 【实战+源码】RGB-D移动抓取服务机器人(四)——完结篇(ROS机器人、系统设计、运动规划、目标定位)
毕业设计已经完成三个多月了,四月底答辩结束,上周办完离校手续!善始善终,最后一篇结束把这个题目告一段落! 完整代码github托管地址:https://github.com/pengxinyi-up/ ...
- 遨博协作机器人ROS开发 - 机械臂复杂轨迹规划
目录 一.简介 二.环境版本 三.学习目标 四.知识储备 五.任务实施 六.任务拓展 七.课堂小结 八.课后练习 一.简介 大家好,欢迎关注遨博学院带来的系列技术分享文章(协作机器人ROS开发),今天 ...
- ubuntu16.04安装UR3/UR5/UR10机械臂的ROS驱动并实现gazebo下Moveit运动规划仿真以及真实UR3机械臂的运动控制(3)
在上一节已经进行了UR3机械臂的运动规划仿真,这一节就进行真实的UR3机械臂运动控制. 1. 电脑和UR3机械臂连接配置 在启动UR3机械臂后,笔记本电脑通过网线连接UR3的控制箱,此时需要配置网络连 ...
- ubuntu16.04安装UR3/UR5/UR10机械臂的ROS驱动并实现gazebo下Moveit运动规划仿真以及真实UR3机械臂的运动控制(2)
在上一节已经搭建了UR3机械臂的仿真环境,并且在rviz界面中通过拖拽机械臂实现了Moveit的运动规划.这一节就通过程序实现简单的UR3机械臂的运动规划. 首先,在 ur3工作空间中的 ~/ur_w ...
- ubuntu16.04安装UR3/UR5/UR10机械臂的ROS驱动并实现gazebo下Moveit运动规划仿真以及真实UR3机械臂的运动控制(1)
1. 下载并编译UR3/UR5/UR10驱动包 我们在Home目录下创建一个文件夹(命名为ur_ws),这就是UR驱动的工作空间了,并且创建一个src文件夹,如下. 然后去下载驱动包,如下图. 下载后 ...
- ROS笔记(36) 避障运动规划
ROS笔记(36) 避障运动规划 1. 避障问题 2. 启动机械臂 3. 添加障碍 4. 设置位姿 5. 避障规划 6. 启动避障规划 1. 避障问题 工作环境中会有一些周围物体,这些物体有可能成为机 ...
- ROS笔记(35) 笛卡尔运动规划
ROS笔记(35) 笛卡尔运动规划 1. 笛卡尔运动规划 2. 启动轨迹可视化机械臂 3. 运动规划 4. 部分代码解析 5. 启动规划 1. 笛卡尔运动规划 而在ROS笔记(34) 工作空间规划 中 ...
- 电影里的机械手臂,和现实究竟有多大区别?
在<王牌特工2:黄金圈>中,最夺人眼球的已经不再是Kingsman能当防弹盾牌的雨伞和能发射子弹的手表,而是反派特工的机械手臂. 查理的机械手臂能开车.开枪还能开定位发送信息,可以说是科幻 ...
- 城市道路自动驾驶车辆运动规划和控制技术综述(1)
城市道路自动驾驶车辆运动规划和控制技术综述 本文为翻译<A survey of motion planning and control techniques for self-driving U ...
最新文章
- GitHub下载某分支的代码
- 理解微信小程序Wepy框架的三个事件交互$broadcast,$emit,$invoke
- 【期望】期望分数(金牌导航 期望-4)
- C#LeetCode刷题之#119-杨辉三角 II(Pascal‘s Triangle II)
- pyqt5 判断lineedit是否为空_是否注意过 isEmpty 和 isBlank 区别?
- [Android]解决ClickableSpan中点击后ListView中item的长按冲突的问题
- TelerikUI_RadGrid_Filter 自定义方法
- tkmybatis更新无效
- Sass基础学习(一)
- 微信小程序 会议室课堂考勤签到助手 源码
- java技术 新 阶段作业,北邮网院web技术阶段作业
- java 音频 合成_java实现mp3合并的方法
- 全志A10/RK2918等七款平板芯片横向PK
- 记录Nacos下载安装和使用
- [ NeurIPS 2020 ] 一叶知秋 —— 基于“单目标域样本”的领域自适应方法
- 多策略融合算术优化算法
- 华为南研所机考练习2 -求最大递增数
- 全世界正在被软件占领
- # 0003:fill的游戏
- 手工注入完成SQL注入漏洞
热门文章
- 软件开发每个阶段的任务以及产生的文档
- 开机直接进入键盘布局_我win10开机显示选择键盘布局 进不了界面 求助啊
- unity自动生成敌人_unity 2d AI 敌人 自动追踪(2)
- 计算机打字正确姿势,电脑打字手指的正确姿势,涨知识了
- Error: for..in loops iterate over the entire prototype chain
- c语言 宏常量 pi,宏和常量
- 影响力最大化 IC 蒙特卡洛模拟 贪心算法
- 实体消歧 Entity Disambiguiation
- 易基因|3文解读:微量样本甲基化测序在肿瘤中的应用
- 离谱!程序员业余时间开发的项目,版权也属于公司的?