赞
踩
我是跳过了正逆运动学的内容,可以参考1。
机器人手臂的运动规划是一个很宽泛的领域,包含有寻多子问题。比如,人们可能会关注机器人可以执行的最佳轨迹,以在最短时间内从某个开始姿态到某个最终姿态,这受制于致动器工作和关节运动范围的限制。另一种变形是根据驱动器的机械特性对手臂运动进行规划,比如提重物最省力的运动规划。常见的问题是机器人的各个关节从一个初始位置运动到目标位置过程中的避障问题。要执行的任务可能需要特定的末端执行器轨迹,例如, 如激光切割,密封剂分配或缝焊。 在这种情况下,终点的速度可能受到任务的限制(例如,对于最佳材料移除速率,焊枪速度或分配速率)。在要求苛刻的情况下,运动计划必须实时进行,例如, 产生动作去抓球。 在另一个极端情况下,可以离线计算用于刻板行为的一些运动计划(例如,将手臂折叠成紧凑的运动姿势),并将结果保存用于执行作为死记硬背的技能。 在通信延迟较大的情况下,监督控制可能是最好的方法。 在这种情况下,可以在提交远程系统执行批准的计划之前计划一个动作并在模拟中预览结果。
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 library
CartTrajPlanner cartTrajPlanner; //instantiate a cartesian planner object
R_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个节点由
这个网络中的一条路径从L1层的某个节点开始,在L6层中的某个节点结束,经过了路径上的全部六个节点。任何这样的路径都有一个相应的损失函数C,是所有的状态损失和变换损失的总和。状态损失是经过一个给定节点相关的损失,转换损失是从节点
对于关节角空间的规划问题,我们可以将每一层解释为沿着特定的笛卡尔路径采样得到的六自由度任务空间姿态。其目的是让工具法兰沿着这条路径运动,比如演示一个切的操作,我们可以沿着这条路径序列标记六个点。对于切的操作,我们没有必要跳过或者返回这些点。而且,每一个笛卡尔子目标点必须实现序列化。我们需要末端点到达每一个笛卡尔位姿。然而,通过计算逆运动学,我们可以找到有许多角空间解可以到达目标位置。我们在第l个笛卡尔位姿中可能会选择第m个角空间解,即节点
对于上文中提到的给定节点的状态损失函数可能通过多种评价标准来打分。比如,一个机器人的姿态可能会导致自我碰撞或与环境碰撞的话,就会被分配一个无穷大的损失值(或者,更简单的,从网络中移除)。一个节点如果接近碰撞,那么就会得到一个很高的状态损失值。接近奇异点的节点也会有一个惩罚值。其他依赖姿势的评价准则也会考虑其中。转换损失应该惩罚大幅度的运动。比如,一条路径包括从l层到l+1层移动基关节
不同的最优路径解决方案会导致不同的状态分配策略和转换惩罚方案。设计这需要考虑如何分配关节空间姿势的损失函数,如何分配转换损失,笛卡尔空间采样点的位置和数量,和每一个采样点逆运动学解的数量。我们已经把规划问题表示成了一个前馈图,可以采用图解决技术来整理我们的问题,产生一组关节空间序列来使机器人通过选择的笛卡尔空间姿势。
对于这类图,可以有效地应用动态规划的方法。过程如下。从最后一层向前反馈,每一个节点都分配一个损失值。对于最后一层,损失值只含有状态损失。
回到L-1层(本例中的L5层),这一层的每个节点都分配了一个损失值。比如L5层中的节点1,
继续向前,当计算到l层节点层损失值时,可以假设l+1层的成本损失值都已经计算得到了。为了计算l层的m节点的损失值
考虑到为每个节点分配成本的成本,通过网络可以通过遵循成本
总之,角空间的动态规划就是要构建一个上方的图,该图的层数与所要规划路径长度和单步步长有关,比如我想规划一段从
……
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。