系列文章目录
前言
本示例概述了机器人系统工具箱™中可用的轨迹类型。在机械手运动、规划和控制应用中,必须为机器人选择轨迹。本示例有三个主要部分。第一部分展示了机械手使用的轨迹类型,第二部分演示了生成轨迹的功能,最后一部分则展示了更多轨迹规划工具。
一、机械手的轨迹类型
在机械手中使用轨迹时,目标是在某些约束条件下提供可行的结果。例如,您通常希望轨迹具有平滑和连续的导数,如不需要瞬时速度或加速度的轨迹。轨迹还可能受位置、速度或加速度约束。在关节空间和任务空间中使用轨迹一般有两种方法。
1.1 关节空间轨迹
关节空间轨迹通常包含一组通过平滑运动连接的多个机器人配置的航点。本示例使用梯形速度曲线生成轨迹,每个关节逐渐加速到最大速度,并在接近下一个航点时减速。更多信息,请参阅梯形速度曲线轨迹。
为 Franka Emika Panda™ 机器人生成连接航点的梯形速度曲线轨迹。首先,定义轨迹的时间矢量并加载机器人模型。
tpts = 0:4; sampleRate = 20; tvec = tpts(1):1/sampleRate:tpts(end); numSamples = length(tvec); robot = loadrobot("frankaEmikaPanda",DataFormat="column");
定义关节空间轨迹。对于该轨迹,航点是模型的原点配置和两个随机配置。
rng default frankaWaypoints = [robot.homeConfiguration robot.randomConfiguration robot.randomConfiguration]; frankaTimepoints = linspace(tvec(1),tvec(end),3); [q,qd] = trapveltraj(frankaWaypoints,numSamples);
通过迭代生成的轨迹点 q,可视化机器人执行轨迹。
figure set(gcf,"Visible","on"); rc = rateControl(sampleRate); for i = 1:numSamples show(robot,q(:,i),FastUpdate=true,PreservePlot=false); waitfor(rc); end
要检查不同的关节位置和速度,请绘制所有维度与时间的对比图。使用 helperPlotJointSpaceTraj 辅助函数绘制关节空间轨迹及其航点。
helperPlotJointSpaceTraj("Joint-Space Trajectory and Waypoints", ... tvec,q,qd,frankaWaypoints,frankaTimepoints);
1.2 任务空间轨迹
任务空间轨迹包含代表三维空间中末端执行器运动的航点。生成最小抖动轨迹来连接自由空间中的航点。该轨迹轮廓的目的是创建一个平滑的轨迹,尽量减少生涩的运动。更多信息,请参阅 "最小抖动轨迹"。然后使用逆运动学生成弗兰卡-艾米卡熊猫机器人的关节配置。
首先,创建一组航点,然后使用 minjerkpolytraj 创建最小抖动轨迹。
frankaSpaceWaypoints = [0.5 0.25 0.25; 0.75 0 0.35; 0.5 -0.25 0.25; 0.5 0.25 0.25]'; frankaTimepoints = linspace(tvec(1),tvec(end),4); [pos,vel] = minjerkpolytraj(frankaSpaceWaypoints,frankaTimepoints,numSamples);
使用 inverseKinematics(逆运动学)函数创建一个逆运动学求解器,并求解在轨迹上达到所需末端执行器位置的配置。
rng(0) % Seed the RNG so the inverse kinematics solution is consistent ik = inverseKinematics(RigidBodyTree=robot); ik.SolverParameters.AllowRandomRestart = false; q = zeros(9,numSamples); weights = [0.2 0.2 0.2 1 1 1]; % Prioritize position over orientation initialGuess = [0, 0, 0, -pi/2, 0, 0, 0, 0.01, 0.01]'; % Choose an initial guess within the robot joint limits for i = 1:size(pos,2) targetPose = trvec2tform(pos(:,i)')*eul2tform([0, 0, pi]); q(:,i) = ik("panda_hand",targetPose,weights,initialGuess); initialGuess = q(:,i); % Use the last result as the next initial guess end
使用机器人模型展示结果。
figure set(gcf,"Visible","on") show(robot);
rc = rateControl(sampleRate); for i = 1:numSamples show(robot, q(:,i),FastUpdate=true,PreservePlot=false); waitfor(rc); end
要检查不同的关节位置和速度,可以通过绘制所有维度与时间的对比图来直观地显示这些结果。使用 helperPlotTaskSpaceTraj 辅助函数绘制任务空间轨迹及其航点。
helperPlotTaskSpaceTraj("Task-Space Trajectory and Waypoints", ... tvec,pos,vel,frankaSpaceWaypoints,frankaTimepoints);
二、比较各种轨迹剖面图
使用不同工具生成轨迹,然后使用任务空间和关节空间可视化对它们进行比较。
wpts = [0 45 15 90 45; 90 45 -45 15 90]; tpts = 0:(size(wpts,2)-1); % Derived quantities. sampleRate = 20; tvec = tpts(1):1/sampleRate:tpts(end); numSamples = length(tvec);
2.1 最小运行轨迹
minjerkpolytraj 函数使用平滑、连续的运动来连接航点。在默认边界条件下,轨迹的初速度和最终速度均为零,但以连续的速度通过所有中间航点。
最小力矩轨迹之所以被命名为最小力矩轨迹,是因为它能最大限度地减小力矩(即运动的三次时间导数),从而产生平滑的轮廓,便于机械系统使用。基本的最小颠簸轨迹是一种在指定时间点到达航点的解析解。
[q,qd,~,~,~,~,tvec] = minjerkpolytraj(wpts,tpts,numSamples); helperPlotTaskSpaceTraj("Minimum-Jerk Trajectory",tvec,q,qd,wpts,tpts);
MATLAB - 选择机械臂路径规划、轨迹规划方式(下)+https://developer.aliyun.com/article/1585256