MoveIt! 学习笔记9 -Time Parameterization(时间参数化)(设置机器人运动时的速度/加速度等约束)

此博文主要是用来记录ROS-Kinetic 中,用于机器人轨迹规划的MoveIt功能包的学习记录。 

英文原版教程见此链接:http://docs.ros.org/en/kinetic/api/moveit_tutorials/html/doc/time_parameterization/time_parameterization_tutorial.html

引:之前涉及到的运动学规划主要是控制机器人按照一个指定的轨迹运行,而没有关注到机器人运行速度+机器人运行加速度等限制参数,此教程将谈到这2点。

MoveIt目前主要是一个kinematic运动规划框架-主要用来规划机器人各关节或末端执行器的位置,但没有涉及到机器人的速度和加速度限制。

因此,MoveIt可以利用后处理时间参数化运动轨迹的速度和加速度值。下面将解释MoveIt的这一部分所涉及的设置和组件。

 

比较简单的设置速度和加速度的方法是: 在URDF模型或者yaml文件中,设置相关参数,在ROS启动时,进行加载。

高阶用法是:使用相应的Plugin,这个用法主要应用于轨迹跟随或者对轨迹控制速度要求比较高的情况下使用。


一.Speed Control
1.From File (通过设置某一个文件内部的参数,ROS 在运行Launch文件时,加载这个参数,从而指定速度和加速度值)
默认情况下MoveIt将关节轨迹的速度和加速度,设置在robot的URDF文件中joint_limits.yaml文件中

其中: joint_limits.yaml是从moveit_setup_assistant生成的,最初是URDF中值的精确副本。如果需要特殊的约束,用户可以将这些值修改为小于原始的URDF值。可以使用键max_position、min_position、max_velocity、max_acceleration来更改特定的关节属性。可以通过键has_velocity_limits、has_acceleration_limits来打开或关闭关节限制。
2.During Runtime
参数化的运动轨迹的速度也可以在运行期间修改为配置值中最大速度和加速度集的一部分,即0-1之间的值。要在每个运动计划的基础上更改速度,可以按照MotionPlanRequest.msg中描述的那样设置两个缩放因子。用于设置这两个因素的Spinbox也可以在MoveIt MotionPlanning RViz插件中找到。

二.Time Parameterization Algorithms
MoveIt可以支持不同的算法对运动轨迹进行后处理,以添加时间戳和速度/加速度值。目前两个是默认的MoveIt: Iterative Parabolic Time Parameterization,和Iterative Spline Parameterization
Iterative Parabolic Time Parameterization算法在Motion Planning Pipeline中被默认用作本教程中记录的Planning Request Adapter。虽然Iterative Parabolic Time Parameterization算法,MoveIt在过去的几年里,已经有数百个机器人使用过它,但它也有缺陷。
Iterative Spline Parameterization算法最近被融合到主流MoveIt中。在PR 382中处理这些问题。虽然初步的实验是很有希望的,但在完全取代Iterative Parabolic Time Parameterization算法之前,还在等待社区的更多反馈。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在ROS Noetic版本的MoveIt中,可以使用以下python函数对轨迹进行重规划,该函数使用Iterative Parabolic Time Parameterization算法: ``` from moveit_msgs.msg import RobotTrajectory from moveit_msgs.msg import PositionConstraint from moveit_msgs.msg import Constraints from trajectory_msgs.msg import JointTrajectoryPoint from moveit_msgs.msg import RobotState from moveit_msgs.srv import GetPositionIKRequest from moveit_msgs.srv import GetPositionIKResponse from moveit_msgs.srv import GetPositionIK from urdf_parser_py.urdf import URDF from pykdl_utils.kdl_kinematics import KDLKinematics from tf.transformations import quaternion_from_matrix from tf.transformations import quaternion_multiply from tf.transformations import translation_matrix import numpy as np import rospy import math def rescale_velocity(time_old, time_new, trajectory): '''Rescale the velocities of a given MoveIt trajectory to fit a new time duration. Args: time_old (float): The original time duration of the trajectory. time_new (float): The new time duration to fit the trajectory to. trajectory (moveit_msgs.msg.RobotTrajectory): The trajectory to rescale. Returns: moveit_msgs.msg.RobotTrajectory: The rescaled trajectory. ''' if time_old == time_new: return trajectory scale_factor = time_new / time_old new_traj = RobotTrajectory() new_traj.joint_trajectory.header = trajectory.joint_trajectory.header new_traj.joint_trajectory.joint_names = trajectory.joint_trajectory.joint_names num_points = len(trajectory.joint_trajectory.points) for i in range(num_points): point = JointTrajectoryPoint() point.positions = trajectory.joint_trajectory.points[i].positions point.velocities = [] point.accelerations = [] point.time_from_start = trajectory.joint_trajectory.points[i].time_from_start * scale_factor if i > 0: for j in range(len(point.positions)): vel = (point.positions[j] - new_traj.joint_trajectory.points[-1].positions[j]) / (point.time_from_start - new_traj.joint_trajectory.points[-1].time_from_start) new_traj.joint_trajectory.points[-1].velocities.append(vel) new_traj.joint_trajectory.points[-1].time_from_start = point.time_from_start - (new_traj.joint_trajectory.points[-1].time_from_start - trajectory.joint_trajectory.points[i-1].time_from_start) * scale_factor new_traj.joint_trajectory.points.append(point) return new_traj def time_parameterization(plan, velocity_scaling_factor): '''Perform time parameterization using the Iterative Parabolic Time Parameterization algorithm. Args: plan (moveit_msgs.msg.RobotTrajectory): The trajectory to perform time parameterization on. velocity_scaling_factor (float): The velocity scaling factor to apply. Returns: moveit_msgs.msg.RobotTrajectory: The time-parameterized trajectory. ''' num_points = len(plan.joint_trajectory.points) time_diff = [0] for i in range(1, num_points): time_diff.append((plan.joint_trajectory.points[i].time_from_start - plan.joint_trajectory.points[i-1].time_from_start).to_sec()) time_sum = sum(time_diff) velocity_scaling_factor = min(velocity_scaling_factor, 1.0) if time_sum <= 0: return None time_target = time_sum * velocity_scaling_factor time_current = time_sum trajectory = plan while time_current > time_target: time_factor = time_target / time_current new_trajectory = RobotTrajectory() new_trajectory.joint_trajectory.header = trajectory.joint_trajectory.header new_trajectory.joint_trajectory.joint_names = trajectory.joint_trajectory.joint_names new_trajectory.joint_trajectory.points.append(trajectory.joint_trajectory.points[0]) for i in range(1, num_points): point = JointTrajectoryPoint() point.positions = trajectory.joint_trajectory.points[i].positions point.velocities = [] point.accelerations = [] point.time_from_start = trajectory.joint_trajectory.points[i-1].time_from_start + (trajectory.joint_trajectory.points[i].time_from_start - trajectory.joint_trajectory.points[i-1].time_from_start) * time_factor for j in range(len(point.positions)): vel = (point.positions[j] - new_trajectory.joint_trajectory.points[-1].positions[j]) / (point.time_from_start - new_trajectory.joint_trajectory.points[-1].time_from_start) point.velocities.append(vel) new_trajectory.joint_trajectory.points.append(point) trajectory = new_trajectory time_diff = [0] for i in range(1, len(trajectory.joint_trajectory.points)): time_diff.append((trajectory.joint_trajectory.points[i].time_from_start - trajectory.joint_trajectory.points[i-1].time_from_start).to_sec()) time_current = sum(time_diff) return trajectory def retime_trajectory(robot, group_name, trajectory, velocity_scaling_factor): '''Retiming the trajectory with the given velocity scaling factor. Args: robot (moveit_commander.RobotCommander): The RobotCommander object. group_name (str): The name of the MoveGroup. trajectory (moveit_msgs.msg.RobotTrajectory): The trajectory to retiming. velocity_scaling_factor (float): The velocity scaling factor to apply. Returns: moveit_msgs.msg.RobotTrajectory: The retimed trajectory. ''' if velocity_scaling_factor <= 0: return None # Rescale the trajectory velocity to fit the new time duration. time_old = trajectory.joint_trajectory.points[-1].time_from_start.to_sec() trajectory = rescale_velocity(time_old, time_old / velocity_scaling_factor, trajectory) # Perform time parameterization with the Iterative Parabolic Time Parameterization algorithm. trajectory = time_parameterization(trajectory, velocity_scaling_factor) return trajectory ``` 这个函数可以将给定的轨迹重新计,以适应给定的速度缩放因子,并使用迭代抛物线时间参数化算法对轨迹进行重新计

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值