MATLAB - 为机械臂路径选择轨迹

系列文章目录


前言

本示例概述了机器人系统工具箱™中可用的轨迹类型。在机械手运动、规划和控制应用中,必须为机器人选择轨迹。本示例有三个主要部分。第一部分展示了机械手使用的轨迹类型,第二部分演示了生成轨迹的功能,最后一部分则展示了更多轨迹规划工具。


一、机械手的轨迹类型

在机械手中使用轨迹时,目标是在某些约束条件下提供可行的结果。例如,您通常希望轨迹具有平滑和连续的导数,如不需要瞬时速度或加速度的轨迹。轨迹还可能受位置、速度或加速度约束。在关节空间和任务空间中使用轨迹一般有两种方法。

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:numSamplesshow(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:numSamplesshow(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);

2.2 梯形速度曲线轨迹

梯形速度曲线会在每个航点停止,并确保点到点的平滑运动。梯形速度曲线的名称来自于连接两个航点的每个线段的三个阶段:

  • 从零速度加速到峰值速度
  • 在峰值速度下保持恒速
  • 减速至零速度

这样,每个航段的速度剖面都是一个梯形。每个分段都有结束时间、峰值速度、峰值加速度和加速时间参数,但指定任意两个参数就足以完全定义运动。更多信息,请参阅 trapveltraj。

当目标是连接一组航点时,可以使用基本梯形剖面,沿途在每个航点停留。例如,这段代码使用 1 秒钟的分段来连接航点。

[q,qd,~,t] = trapveltraj(wpts,100);
helperPlotTaskSpaceTraj("Trapezoidal Profile, Max Velocity = 0.5",t,q,qd,wpts);

 

梯形剖面通常需要满足某些约束条件,如速度或加速度边界。由于梯形剖面是一种精确的规范,因此需要使用辅助函数将约束边界转换为精确的剖面规范。helperProfileForMaxVel 辅助函数接受速度边界。有关使用 trapveltraj 函数设计速度剖面的更多信息,请参阅使用梯形速度剖面设计带速度限制的轨迹示例。 

[endTimes,peakVels] = helperProfileForMaxVel(wpts, 0.5);
[q,qd,~,t] = trapveltraj(wpts,100,EndTime=endTimes,PeakVelocity=peakVels);% The time at which the waypoints are hit is the vector of cumulative sums
% of the end times
trapVelTrajTime = [0 cumsum(endTimes(1,:))];
helperPlotTaskSpaceTraj("Trapezoidal Profile, Max Velocity = 0.5",t,q,qd,wpts,trapVelTrajTime);

2.3 三次和五次多项式轨迹

某些使用情况可能需要更通用的多项式轨迹。三次多项式轨迹(cubicpolytraj)和五次多项式轨迹(quinticpolytraj)函数是创建插值分段多项式的通用工具。与之前的轨迹工具一样,它们也会返回位置、速度和加速度以及分段多项式对象。

在默认情况下,这些函数使用零值边界条件,因此轨迹在每个航点都会停止。

[q,qd] = cubicpolytraj(wpts,tpts,tvec);
helperPlotTaskSpaceTraj("Basic Cubic Polynomial",tvec,q,qd,wpts,tpts);

您可以使用这些函数设计具有自定义边界行为的内插多项式。例如,将这些函数与 spline、pchip 或 makima 等其他分段多项式工具一起使用,就可以在航点处创建具有理想运动的平滑剖面。

本示例代码使用 MATLAB 中的一个内置分段多项式函数导出边界条件。选择一个多项式函数,查看它对三次多项式速度剖面的影响。代码使用辅助文件计算速度。

smoothPP = spline(tpts,wpts);
smoothVelPP = mkpp(smoothPP.breaks,robotics.core.internal.polyCoeffsDerivative(smoothPP.coefs),size(wpts,1));
smoothVelPoly = ppval(smoothVelPP,tpts);

 使用导出的速度作为内部航点的边界条件。将外部边界条件保留为零速度,以确保轨迹以零速度开始和结束

boundaryVel = zeros(size(smoothVelPoly));
boundaryVel(:,2:end-1) = smoothVelPoly(:,2:end-1);
[q,qd] = cubicpolytraj(wpts,tpts,tvec,VelocityBoundaryCondition=boundaryVel);
helperPlotTaskSpaceTraj("Cubic Polynomial with Custom Velocity BCs",tvec,q,qd,wpts,tpts);

使用五次多项式可以确保速度曲线的平滑性。 

[q,qd] = quinticpolytraj(wpts,tpts,tvec,VelocityBoundaryCondition=boundaryVel);
helperPlotTaskSpaceTraj("Quintic Polynomial with Custom Velocity BCs",tvec,q,qd,wpts,tpts);

2.4 B 样条轨迹

B 样条多项式能产生平滑、连续的运动,主要用于任务空间应用。使用 bsplinepolytraj 函数可以创建这种轨迹。与其他轨迹不同的是,B-样条曲线是由一组控制点插值定义的。生成的轨迹只命中初始控制点和最终控制点,但会落在整组控制点的凸壳中。

应用之前使用过的航点作为控制点。

[q,qd] = bsplinepolytraj(wpts,tpts([1 end]),tvec);
helperPlotTaskSpaceTraj("Non-interpolating B-spline",tvec,q,qd,wpts);

 

您可以通过从原始航点推导出一组新的控制点来创建内插 B-样条曲线,B-样条曲线多项式将这些控制点与原始航点进行内插。与标准 B-spline 一样,该多项式主要用于任务空间应用。

使用 helperCreateControlPointsFromWaypoints 辅助函数生成新的控制点。

cpts = helperCreateControlPointsFromWaypoints(wpts);
[q,qd] = bsplinepolytraj(cpts,tpts([1 end]),tvec);
helperPlotTaskSpaceTraj("Interpolating B-spline",tvec,q,qd,wpts);

 

三、任务空间轨迹的更多工具

有些任务空间应用不仅需要计算插值位置的轨迹,还需要计算操纵器的完整姿态。在这种情况下,可以考虑使用 rottraj 和 transformtraj 函数。rottraj 函数在两个旋转之间创建轨迹,而 transformtraj 函数则对两个 4×4 的同质变换矩阵进行同样的处理。除了位置导数外,这些函数还输出角加速度和速度。

本示例连接了两个包含位置和方向数据的姿势 T1 和 T2。

T1 = eul2tform([pi/4 0 pi/3]);
T2 = trvec2tform([5 -2 1]);
tInterval = [0 1];
tvec = 0:0.01:1;

 使用 transformtraj 对两个变换矩阵进行插值,创建一个完整的插值姿势轨迹,以变换矩阵表示。

[tfInterp,v1,a1] = transformtraj(T1,T2,tInterval,tvec);

使用 plotTransforms 在三维空间中绘制轨迹。该函数需要四元数形式的旋转数据和来自插值变换矩阵轨迹的平移数据。使用 tform2quat 查找四元数,使用 tform2trvec 查找轨迹中的平移数据。

figure
rotations = tform2quat(tfInterp);
translations = tform2trvec(tfInterp);
plotTransforms(translations,rotations)
title("Interpolated Transformation Trajectory")
xlabel("X")
ylabel("Y")
zlabel("Z")

三维图显示,旋转和运动都是线性的。回想一下,可行的机械手运动轨迹应该是平滑且连续的。由于插值是线性的,因此并不能保证运动轨迹是平滑的。如果分别绘制位置和速度曲线,这一点就会更加清晰。 

figure
tiles1 = tiledlayout(3,1)
tiles1 = TiledChartLayout with properties:TileArrangement: 'fixed'GridSize: [3 1]Padding: 'loose'TileSpacing: 'loose'Use GET to show all properties
positions = reshape(tfInterp(1:3,4,:),3,size(tfInterp,3));
nexttile
plot(tvec,positions)
title("XYZ Position in Time")
ylim("padded")
nexttile
plot(tvec,v1(1:3,:))
title("Velocity in Time")
ylim("padded")
nexttile
plot(tvec,v1(4:6,:)); 
title("Angular Velocity in Time")
ylim("padded")

速度以非零值开始和结束,这对机械手来说不是可行的轨迹,会导致运动突然而生涩。

你可以使用 transformtraj 的 TimeScaling 名-值参数来解决这个问题。该参数使用中间参数化 s 来定义轨迹时间,这样 transformtraj 就可以使用 s(t) 作为时间来定义。在本示例中使用的默认情况下,时间缩放是均匀的,因此 s(t)=t 。结果是每个姿势之间都是线性运动。取而代之的是使用最小跃迁轨迹定义的时间缩放:s(t)= minjerkpolytraj(t)。

时间缩放是一组离散的值 \left[s;{\frac{d}{\mathrm{d}t}}s;{\frac{d^{2}}{\mathrm{d}t^{2}}}s\right],对定义在区间 s=[0,1] 上的函数 s(t) 进行采样。

% The time scaling is a discrete set of values [s; ds/dt; d^2s/dt^2] that
% are sample the function s(t), defined on the interval s = [0,1]
[s,sd,sdd] = minjerkpolytraj([0 1],tInterval,numel(tvec));
[tfInterp,v1,a1] = transformtraj(T1,T2,tInterval,tvec,TimeScaling=[s; sd; sdd]);

 再次绘制插值变换轨迹图,与之前的图进行比较。

figure
rotations = tform2quat(tfInterp);
translations = tform2trvec(tfInterp);
plotTransforms(translations,rotations)
title("Interpolated Transformation Trajectory")
xlabel("X")
ylabel("Y")
zlabel("Z")

figure
tiles2 = tiledlayout(3,1);
positions = reshape(tfInterp(1:3,4,:),3,size(tfInterp,3));
nexttile
plot(tvec,positions)
title("XYZ Position in Time")
nexttile
plot(tvec,v1(1:3,:))
title("Velocity in Time")
nexttile
plot(tvec,v1(4:6,:))
title("Angular Velocity in Time")

 

虽然空间运动遵循相同的路径,但第二组曲线图表明,速度在时间上是平滑和可跟踪的,从而形成了一个机械手或其他机械系统可以遵循的轨迹。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/628878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hadoop-common: CMake failed with error code 1

问题 在编译hadoop源码时遇到如下错误 hadoop-common: CMake failed with error code 1 看了这个错误表示一脸懵逼 排查 在mvn 的命令中增加 -X 和 -e mvn clean package -e -X -Pdist,native -DskipTests -Dmaven.javadoc.skip -Dopenssl.prefix/usr/local/bin/openssl 在…

CentOs7.8安装原生Jenkins2.38教程

CentOs7.8安装Jenkins教程 前提:1、下载安装包2、安装:3、检验是否安装成功:4、查询java路径5、修改配置文件6、创建jenkins用户7、给jenkins用户授权8、开放防火墙端口9、运行和其他jenkins相关命令10、异常情况10.1 提示超时,查…

计算机网络安全教程(第三版)课后简答题答案大全[1-5章]

目录 第 1 章 网络安全概述与环境配置 第 2 章 网络安全协议基础 第 3 章 网络安全编程基础 第 4 章 网络扫描与网络监听 第 5 章 网络入侵 第 1 章 网络安全概述与环境配置 1、网络攻击和防御分别包括哪些内容? 答: 攻击技术主要包括以下几个方面。…

Linux之kernel(20)kdump支持

Linux之kernel(21)kdump介绍 Author:OnceDay Date:2024年1月14日 漫漫长路,有人对你微笑过嘛… 参考文档: 3.3.2 内核态调测工具:kdump&crash——kdump - 知乎 (zhihu.com)Kernel crash dump | Ubuntu[Linux]K…

工业企业能源管理平台,可以帮助企业解决哪些方面的能源问题?

随着全球工业化进程的加快,工业企业在生产经营过程中消耗的能源也越来越庞大。能源成本的上升和环境保护的压力使得工业企业对能源管理的重要性有了深刻的认识。为了提高能源利用效率、降低能源消耗、减少环境污染,工业企业在能源管理方面迫切需要一套规…

SpringMVC 参数传递见解5

5.参数传递 5.1.ModelAndView传递 编写controller Controller RequestMapping("/account") public class AccountController {//也可以不创建ModelAndView,直接在参数中指定RequestMapping(value "/findAccount9")public ModelAndView findAc…

计算机毕业设计 基于SSM的历史/博物馆藏系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

【Leetcode】2719. 统计整数数目

文章目录 题目思路代码 题目 2719. 统计整数数目 给你两个数字字符串 num1 和 num2 &#xff0c;以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件&#xff0c;我们称它是一个好整数&#xff1a; num1 < x < num2 min_sum < digit_sum(x) < max_su…

浅谈SQL优化

避免使用子查询 例&#xff1a; select * from t1 where id in (select id from t2 where name lolly1023);其子查询在MySQL5.5版本里&#xff0c;内部执行计划是&#xff1a;先查询外表再匹配内表&#xff0c;而不是先查内表t2&#xff0c;当外表的数据很大时&#xff0c;查…

10.9.2 std::function 代替函数指针 Page182~183

std::function是一个模板类&#xff0c;基本可作为函数指针的代替品&#xff0c;具备更多功能&#xff0c;特别是与函数对象及bind配合使用。使用std::function时&#xff0c;需要添加头文件 #include <functional> 1.定义函数指针 18行&#xff0c;定义了一个函数指针类…

SpringBoot的yml多环境配置3种方法

文章目录 SpringBoot的yml多环境配置3种方法1、多个yml文件1.1、创建多个配置文件applicaiton.yml中指定配置 2、单个yml文件3、在pom.xml中指定环境配置3.1、创建多个配置文件3.2、在application.yml中添加多环境配置属性3.3、在pom.xml中指定使用的配置3.4、问题&#xff1a;…

MYSQL高性能索引

正确的选择和创建索引是实现高性能查询的基础&#xff0c;以下是高效使用索引的方法 演示的sql 独立的列 独立的列指的是索引既不是表达式的一部分也不是函数的参数。 mysql> select actor_id from actor where actor_id 1 5;mysql> SELECT actor_id FROM actor WHER…

Mysql root 密码重置详解

文章目录 1 概述1.1 前言1.2 mysql 版本查询 2 windows 操作系统2.1 mysql 8 及以上版本2.1.1 关闭 mysql 服务2.1.2 通过无认证方式启动 mysql2.1.3 新开窗口&#xff0c;登录 mysql&#xff0c;重置密码 1 概述 1.1 前言 不同的操作系统&#xff08;如&#xff1a;windows、…

Android PendingIntent 闪退

先来给大家推荐一个我日常会使用到的图片高清处理在线工具&#xff0c;主要是免费&#xff0c;直接白嫖 。 有时候我看到一张图片感觉很不错&#xff0c;但是图片清晰度不合我意&#xff0c;就想有没有什么工具可以处理让其更清晰&#xff0c; 网上随便搜下就能找到&#xff…

音频筑基:算法时延分析

音频筑基&#xff1a;算法时延分析 前言时延是啥举例分析相关资料 前言 音频算法中&#xff0c;经常遇到时延分析的问题&#xff0c;刚开始接触大多都比较迷惑&#xff0c;这里将自己对时延的学习思考梳理总结于此。 时延是啥 音频领域中&#xff0c;时延(delay/latency)主要指…

Spring Boot 3 + Vue 3实战:实现用户登录功能

文章目录 一、实战概述二、实战步骤​&#xff08;一&#xff09;创建前端项目 - login-vue1、创建Vue项目2、安装axios模块3、安装vue-router模块4、安装less和less-loader模块5、运行Vue项目6、在浏览器里访问首页7、在IDEA里打开Vue项目8、创建登录Vue组件9、创建首页Vue组件…

自动驾驶中的坐标系

自动驾驶中的坐标系 自动驾驶中的坐标系 0.引言1.相机传感器坐标系2.激光雷达坐标系3.车体坐标系4.世界坐标系4.1.地理坐标系4.2.投影坐标系4.2.1.投影方式4.2.2.墨卡托(Mercator)投影4.2.3.高斯-克吕格(Gauss-Kruger)投影4.2.4.通用横轴墨卡托UTM&#xff08;UniversalTransve…

MySQL视图索引基础练习

表定义 学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, C…

Android 布局菜鸟 android中的布局类型和特点?

一、LinearLayout(线性布局) 1、 特点: 主要以水平或垂直方式来排列界面中的控件。并将控件排列到一条直线上。在线性布局中,如果水平排列,垂直方向上只能放一个控件,如果垂直排列,水平方向上也只能放一个控件。 2、适⽤场景: Android开发中最常见的 ⼀种布局⽅式,排列…

CUDA tips

命令行查看核函数消耗的寄存器和共享内存数量 nvcc --ptxas-options-v reduce_sum.cu nvprof 使用 由于 8.0 及以上计算能力的显卡用不了 nvprof&#xff0c;官方建议用 nsight system 和 ncu&#xff0c;但是如果只想命令行打印表格查看 kernel 概况感觉还是 nvprof 方便&am…