当前位置: 首页 > news >正文

Robotics System Toolbox中的机器人运动(7)--RRT规划避障路径

CSDN话题挑战赛第2期
参赛话题:学习笔记

1、前记

       传统机器人通过人工示教的方式编写机器人的运动程序,在结构化的环境中应用广泛,但对非专业机器人工程师,机器人编程有很大的难度。机器人的路径规划问题可以通过算法的方式在作业环境中寻找一个无碰撞的运动路径,对机器人安全运动很重要。常见的运动路径规划包括基于搜索的方法【A* and D* search】和基于采样【rapidly-exploring random tree (RRT),probabilistic roadmap (PRM)
】的方法,以及基于这两类方法为基础的后续路径平滑等优化方法。

       在这里,我们利用matlab环境,通过机器人系统工具箱来演示通过内置RRT规划器实现基于采样的无碰撞路径规划问题的demo演示。

2、内容

(1)RRT简单描述

机器人系统工具箱中的RRT算法是基于双向快速探索随机树(RRT)算法,并带有可选的连接启发式以潜在地提高速度。双向RRT计划器在指定的开始配置和目标配置处创建两个根节点树。为了扩展每个树,规划器生成一个随机配置,如果有效,则根据MaxConnectionDistance属性从最近的节点执行一步采样扩展。在每次扩展之后,计划器尝试使用新的扩展和对面树上最近的节点连接两个树。与环境冲突的无效配置或连接不会添加到树中。

参考:【Plan motion for rigid body tree using bidirectional RRT - MATLAB- MathWorks 中国

(2)代码,描述部分在代码中有对应注释,这里不展开l描述,按小节运行可以看到没次结果。

%% RRT规划器避障测试
% https://www.mathworks.com/help/robotics/ug/check-for-environmental-collisions-with-manipulators.html
% https://www.mathworks.com/help/robotics/ref/manipulatorrrt.html
%% 构建环境
% Create two platforms
clc
clear
platform1 = collisionBox(0.5,0.5,0.25);
platform1.Pose = trvec2tform([-0.5 0.4 0.2]);
platform2 = collisionBox(0.5,0.5,0.25);
platform2.Pose = trvec2tform([0.5 0.2 0.2]);
% Add a light fixture, modeled as a sphere
lightFixture = collisionSphere(0.25);
lightFixture.Pose = trvec2tform([0 0.6 0.75]);
% Store in a cell array for collision-checking
worldCollisionArray = {platform1 platform2 lightFixture};%1,2,3;worldCollisionArray{1}
% show(worldCollisionArray)%环境还得单独show
%% 创建figure对象显示环境:可以直接用exampleHelperVisualizeCollisionEnvironment(worldCollisionArray);
%  为了演示修改颜色做下
figure;
ax=gca;
% 显示桌子1并上色
[~, patchObj]=show(platform1,'Parent', ax);
patchObj.FaceColor = [1 0.6 0.9];
axis([-0.8,1,-0.8,1.2,0,1.4])%调整图框范围
view(141,22)%调节视角
hold on
%显示桌子2并上色
[~, patchObj]=show(platform2,'Parent', ax);
patchObj.FaceColor = [1 0.6 0.9];
% 显示灯球并上色
[~, patchObj]=show(lightFixture,'Parent', ax);
patchObj.FaceColor = [0 0.8 0.8];
%% 添加机器人模型:可更改为DH方向构建。
robot = loadrobot("kinovaGen3","DataFormat","column","Gravity",[0 0 -9.81]);
show(robot,homeConfiguration(robot),"Parent",ax);
%% 给机器人添加任务起点和终点
startPose = trvec2tform([-0.5,0.5,0.4])*axang2tform([1 0 0 pi]);
endPose = trvec2tform([0.5,0.2,0.4])*axang2tform([1 0 0 pi]);

%% 使用逆运动学求解起点个终点位姿的关节构型并显示
rng(0);% Use a fixed random seed to ensure repeatable results
ik = inverseKinematics("RigidBodyTree",robot);
weights = ones(1,6);
startConfig = ik("EndEffector_Link",startPose,weights,robot.homeConfiguration);
endConfig = ik("EndEffector_Link",endPose,weights,robot.homeConfiguration);
endEffector="EndEffector_Link";
% Show initial and final positions
show(robot,startConfig);
show(robot,endConfig);
%%  RRT属于采样类,一些属性参数:MaxConnetionDistance等会影响结果
rrt=manipulatorRRT(robot,worldCollisionArray);
path=plan(rrt,startConfig',endConfig');
path2=interpolate(rrt,path,14);%没两个插入14个,还有shorten用于shorten path
q=path2;
for i = 1:size(path2,1)
    show(robot,q(i,:)',"PreservePlot",false);%false 不留下重影,true留下
    poseNow = getTransform(robot, q(i,:)', endEffector);%正运动学
    plot3(poseNow(1,4), poseNow(2,4), poseNow(3,4),'b.','MarkerSize',15)%末端轨迹
    drawnow limitrate
end
q1=q';%转换格式,配合检查碰撞的机器人构型
% 初始化输出
inCollision = false(length(q1),1); %===> zeros(length(q),1)
worldCollisionPairIdx = cell(length(q1),1); % 元胞数组,保存与环境碰撞的部件和关节配置的索引
for i = 1:length(q1)
    [inCollision(i),sepDist] = checkCollision(robot,q1(:,i),worldCollisionArray,"IgnoreSelfCollision","on","Exhaustive","on");
    % collisions.免除自身碰撞的检查,因为关节限制保证了大多数自碰撞情况。只寻找构型与环境的碰撞情况
    [bodyIdx,worldCollisionObjIdx] = find(isnan(sepDist)); % 找到碰撞的部件。距离是空NaN,则发生碰撞
    worldCollidingPairs = [bodyIdx,worldCollisionObjIdx]; 
    worldCollisionPairIdx{i} = worldCollidingPairs;  %机器人部件索引第一列,环境物体索引第二列
end
isTrajectoryInCollision = any(inCollision)
if isTrajectoryInCollision==0
    disp('No collison happen')
    title('checkCollisionReslut:MotionWithoutCollision')
end

(3)结果:

 3、小结

记录如何利用matlab的机器人系统工具箱【robotics system toolbox】中内置的RRT算法再复杂环境中规划中一个从起始点到目标点的无碰撞路径。

相关文章:

  • 和一个海归的博士聊人生
  • 移动端布局介绍——css像素/物理像素/设备像素比
  • redis简介及八种数据类型
  • GAN Step By Step -- Step1 GAN介绍
  • vue纯前端结合css动画实现模拟导航效果
  • 【数据增强】90°、180°和270°翻转图片(*4)
  • 【Hadoop---07】HDFS 读 / 写 数据流程(面试重点)
  • 【笔记】C#得到真正的屏幕大小
  • SSH远程端口转发
  • 微信支付配置信息如何获取
  • nginx反向代理实例
  • webpack与vite对比
  • Linux中的权限机制
  • 字符串函数【C语言-3】
  • 【Docker】Docker-Compose基础使用说明
  • 《深入 React 技术栈》
  • ERLANG 网工修炼笔记 ---- UDP
  • HTML-表单
  • Java Agent 学习笔记
  • JS笔记四:作用域、变量(函数)提升
  • mac修复ab及siege安装
  • mockjs让前端开发独立于后端
  • mysql中InnoDB引擎中页的概念
  • vue:响应原理
  • windows下使用nginx调试简介
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 回顾2016
  • 近期前端发展计划
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 用Python写一份独特的元宵节祝福
  • 最近的计划
  • Java性能优化之JVM GC(垃圾回收机制)
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 通过调用文摘列表API获取文摘
  • 组复制官方翻译九、Group Replication Technical Details
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #1014 : Trie树
  • #includecmath
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (1)STL算法之遍历容器
  • (2)Java 简介
  • (五)Python 垃圾回收机制
  • (一)SpringBoot3---尚硅谷总结
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)winform之ListView
  • (转)视频码率,帧率和分辨率的联系与区别
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .describe() python_Python-Win32com-Excel
  • .form文件_一篇文章学会文件上传
  • .NET下的多线程编程—1-线程机制概述
  • @EnableWebMvc介绍和使用详细demo
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [100天算法】-x 的平方根(day 61)
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——