MATLAB轨迹规划 发给ROS中机器人实现仿真运动

现象如图所示:

0、matlab 与 ROS 通信:

https://blog.csdn.net/qq_40569926/article/details/112162871

 指定matlab路径:连接三句话
pe = pyenv('Version','D:\python2.7.18\python.exe');%多个python 版本可以用此指定
% 下面四行第一次运行时使用
rosshutdown
setenv('ROS_MASTER_URI','http://192.168.93.131:11311');
% setenv('ROS_IP','202.193.75.81');
%Starting ROS MASTER
rosinit();

当matlab多个版本的时候指定python的版本很重要:

pe = pyenv('Version','D:\python2.7.18\python.exe')
rosinit

1、一个轨迹点的运动:

%% 发送目标消息来移动机器人的手臂
%rosaction list 查看
%等待客户端连接到 ros 操作服务器
[rArm, rGoalMsg] = rosactionclient('/probot_elfin/arm_joint_controller/follow_joint_trajectory');
waitForServer(rArm);
% disp(rGoalMsg.Trajectory)
disp(rGoalMsg)
%ubuntu 通过 rosparam get /probot_elfin/arm_joint_controller/joints
%查看joints的名称
%设置机器人 joints的名称
rGoalMsg.Trajectory.JointNames={'elfin_joint1', ...'elfin_joint2', ...'elfin_joint3', ...'elfin_joint4',...'elfin_joint5',...'elfin_joint6'};
% 通过创建 rostrajectory_msgs/JointTrajectoryPoint
% 消息并指定所有7个关节的位置和速度作为矢量, 在臂关节轨迹中创建设定值。将开始时的时间指定为 ros 持续时间对象。
% Point 1
tjPoint1 = rosmessage('trajectory_msgs/JointTrajectoryPoint');
tjPoint1.Positions = zeros(1,6);%六个关节位置都为0
tjPoint1.Velocities = zeros(1,6);%速度位1
tjPoint1.Accelerations=zeros(1,6);%加速度1
tjPoint1.TimeFromStart = rosduration(1.0);
% Point 2
tjPoint2 = rosmessage('trajectory_msgs/JointTrajectoryPoint');
tjPoint2.Positions = [-1.0 0.2 0.1 -1.2 -1.5 -0.3];%六个关节位置
tjPoint2.Velocities = zeros(1,6);
tjPoint2.Accelerations=zeros(1,6);
tjPoint2.TimeFromStart = rosduration(2.0);
rGoalMsg.Trajectory.Points = [tjPoint1,tjPoint2]; %手臂轨迹点从Point1到Point2
sendGoalAndWait(rArm,rGoalMsg); % 发送消息后右臂移动

2、acro 变换为 urdf 模型:

acro 变换为 urdf 模型 这个在Ubuntu 中进行操作:

rosrun xacro xacro elfin10.urdf.xacro > elfin10.urdf --inorder

3、导入URDF 模型后获取机器人的转态:

elfin3 = importrobot('E:\MATLAB_MIN\ROS_MATLAB\elfin_description\urdf\elfin5.urdf');
% % show(elfin3);
% % showdetails(elfin3);
% %% 获取机器人手臂的状态
% 创建一个订阅者, 从机器人中获取关节状态。
jointSub = rossubscriber('joint_states');
% % % 获取当前的联合状态消息。
jntState = receive(jointSub);
% % 将联合状态从联合状态消息分配到机器人所理解的配置结构的字段。
jntPos =JointMsgToStruct(elfin3,jntState);
% 显示状态%% 可视化当前机器人配置(从虚拟机得到当前的机器人状态,用Show可视化)
show(elfin3,jntPos);

如图所示:

4、创建对象并定义位姿

%% 创建InverseKinematics对象:
ik = robotics.InverseKinematics('RigidBodyTree', elfin3);
%% 禁用随机重新启动以确保安全解决方案一致:
ik.SolverParameters.AllowRandomRestart = false;
%% 为目标姿势的每个组件上的公差指定权重。
weights = [1 1 1 1 1 1];
initialGuess = jntPos; % current jnt pos as initial guess
endEffectorName = 'elfin_end_link';% 末端的link
%% 指定与任务相关的末端效应器姿势。
% 没有末端执行器 忽略
% % % % 指定末端执行器的名称。
% % % endEffectorName = 'r_gripper_tool_frame';
% % % % 指定罐的初始 (当前) 姿势和所需的最终姿势。
% % % TCanInitial = trvec2tform([0.7, 0.0, 0.55]);
% % % TCanFinal = trvec2tform([0.6, -0.5, 0.55]);
% % % % 定义抓取时端部效应器和罐之间所需的相对变换。
% % % TGraspToCan = trvec2tform([0,0,0.08])*eul2tform([pi/8,0,-pi]);
%% 按照特定轨迹进行运动
% 建立运动学模型
% elfin=robot('elfin');
% 机器人初始位姿
xoy = [0.1845   0.03631     0.353 ]; %位置
rpy = [0 pi/2 0];  %姿态
home = [0.266 0 0.7015];
start_home = home;
end_home =  xoy;
%定义位姿
shome_T = trvec2tform(start_home);
end_T =   trvec2tform(end_home)*eul2tform(rpy);
Tf=end_T;

5、轨迹规划

%% 执行动作
% 获取当前的联合状态jntState = receive(jointSub);jntPos = JointMsgToStruct(elfin3,jntState);% 获取末端的T0T0 = getTransform(elfin3,jntPos,endEffectorName);%在关键航路点之间进行插值的百分比numWaypoints = 10;%插值个数t = [0 1];[s,sd,sdd,tvec] = trapveltraj(t,numWaypoints,'AccelTime',0.4);%相对缓慢TWaypoints = transformtraj(T0, Tf, [0 1], tvec, 'TimeScaling', [s; sd; sdd]); % end-effector pose waypoints% joint position waypointsjntPosWaypoints = repmat(initialGuess, numWaypoints, 1);  %使用IK为k = 1:numWaypoints计算每个末端执行器姿势航路点的关节位置rArmJointNames = rGoalMsg.Trajectory.JointNames;rArmJntPosWaypoints = zeros(numWaypoints, numel(rArmJointNames));% Calculate joint position for each end-effector pose waypoint using IKfor k = 1:numWaypointsjntPos  = ik(endEffectorName, TWaypoints(:,:,k), weights, initialGuess);jntPosWaypoints(k,:)  = jntPos ;initialGuess = jntPos ;% Extract right arm joint positions from jntPosrArmJointPos = zeros(size(rArmJointNames));for n = 1:length(rArmJointNames)rn = rArmJointNames{n};idx = strcmp({jntPos.JointName}, rn);rArmJointPos(n) = jntPos(idx).JointPosition;end  rArmJntPosWaypoints(k,:) = rArmJointPos';end% Time points corresponding to each waypointtimePoints = linspace(0,3,numWaypoints); % Estimate joint velocity trajectory numericallyh = diff(timePoints); h = h(1);[~, rArmJntVelWaypoints] = gradient(rArmJntPosWaypoints, h);

6、轨迹发送

 %更新轨迹点jntTrajectoryPoints = arrayfun(@(~) rosmessage('trajectory_msgs/JointTrajectoryPoint'), zeros(1,numWaypoints)); %     jntTrajectoryPoints = repmat(rosmessage('trajectory_msgs/JointTrajectoryPoint'),1,numWaypoints);A = jntTrajectoryPoints.Positions;for m = 1:numWaypointsjntTrajectoryPoints(m).Positions = rArmJntPosWaypoints(m,:);jntTrajectoryPoints(m).Velocities = rArmJntVelWaypoints(m,:);jntTrajectoryPoints(m).TimeFromStart = rosduration(timePoints(m));end% Visualize robot motion and end-effector trajectory in MATLAB(R)hold on
%     for j = 1:numWaypoints
%         show(elfin3, jntPosWaypoints(j,:),'PreservePlot', false);
%         ShowEndEffectorPos(TWaypoints(:,:,j));
%         drawnow;
%         pause(0.1);
%     end% Send the right arm trajectory to the robotrGoalMsg.Trajectory.Points = jntTrajectoryPoints;disp(rGoalMsg.Trajectory)sendGoalAndWait(rArm, rGoalMsg);

8、完整代码:

% clear
clc
% 指定matlab路径:连接三句话
% pe = pyenv('Version','D:\python2.7.18\python.exe');
% % setenv('ROS_MASTER_URI','http://202.193.75.81:11311')
% % rosinit
% % Setting ROS_MASTER_URI
% % 下面四行第一次运行时使用
% rosshutdown
% setenv('ROS_MASTER_URI','http://192.168.93.131:11311');
% % setenv('ROS_IP','202.193.75.81');
% %Starting ROS MASTER
% rosinit();%% 发送目标消息来移动机器人的手臂
%rosaction list 查看
%等待客户端连接到 ros 操作服务器
[rArm, rGoalMsg] = rosactionclient('/probot_elfin/arm_joint_controller/follow_joint_trajectory');
waitForServer(rArm);
% disp(rGoalMsg.Trajectory)
% disp(rGoalMsg)
%ubuntu 通过 rosparam get /probot_elfin/arm_joint_controller/joints
%查看joints的名称
%设置机器人 joints的名称
rGoalMsg.Trajectory.JointNames={'elfin_joint1', ...'elfin_joint2', ...'elfin_joint3', ...'elfin_joint4',...'elfin_joint5',...'elfin_joint6'};
% % 通过创建 rostrajectory_msgs/JointTrajectoryPoint
% % 消息并指定所有7个关节的位置和速度作为矢量, 在臂关节轨迹中创建设定值。将开始时的时间指定为 ros 持续时间对象。
% % Point 1
% tjPoint1 = rosmessage('trajectory_msgs/JointTrajectoryPoint');
% tjPoint1.Positions = zeros(1,6);%六个关节位置都为0
% tjPoint1.Velocities = zeros(1,6);%速度位1
% tjPoint1.Accelerations=zeros(1,6);%加速度1
% tjPoint1.TimeFromStart = rosduration(1.0);
% % Point 2
% tjPoint2 = rosmessage('trajectory_msgs/JointTrajectoryPoint');
% tjPoint2.Positions = [-1.0 0.2 0.1 -1.2 -1.5 -0.3];%六个关节位置
% tjPoint2.Velocities = zeros(1,6);
% tjPoint2.Accelerations=zeros(1,6);
% tjPoint2.TimeFromStart = rosduration(2.0);
% rGoalMsg.Trajectory.Points = [tjPoint1,tjPoint2]; %手臂轨迹点从Point1到Point2
% sendGoalAndWait(rArm,rGoalMsg); % 发送消息后右臂移动%% acro 变换为 urdf 模型
% rosrun xacro xacro elfin10.urdf.xacro > elfin10.urdf --inorder
%% matlab 导入机器人urdf 模型
% elfin3 = importrobot('E:\MATLAB_MIN\ROS_MATLAB\elfin_description\urdf\elfin5.urdf');
% % show(elfin3);
% % showdetails(elfin3);
% %% 获取机器人手臂的状态
% 创建一个订阅者, 从机器人中获取关节状态。
jointSub = rossubscriber('joint_states');
% % % 获取当前的联合状态消息。
jntState = receive(jointSub);
% % 将联合状态从联合状态消息分配到机器人所理解的配置结构的字段。
jntPos =JointMsgToStruct(elfin3,jntState);
% 显示状态%% 可视化当前机器人配置(从虚拟机得到当前的机器人状态,用Show可视化)
% show(elfin3,jntPos);
%% 创建robotics.InverseKinematics pr2机器人对象的逆变运动学对象。
% 逆运动学的目的是计算 pr2 臂的关节角度, 将夹持器 (即末端执行器) 置于所需的姿势。
% 在一段时间内, 一系列的末端效应器被称为轨迹。
% 因此, 在规划过程中, 我们对抬起关节设置了严格的限制。
% 没有抬起关节不需要
% torsoJoint = elfin3.getBody('elfin_link4').Joint
% idx = strcmp({jntPos.JointName}, torsoJoint.Name);
% torsoJoint.HomePosition = jntPos(idx).JointPosition;
% torsoJoint.PositionLimits = jntPos(idx).JointPosition + [-1e-3,1e-3];
%% 创建InverseKinematics对象:
ik = robotics.InverseKinematics('RigidBodyTree', elfin3);
%% 禁用随机重新启动以确保安全解决方案一致:
ik.SolverParameters.AllowRandomRestart = false;
%% 为目标姿势的每个组件上的公差指定权重。
weights = [1 1 1 1 1 1];
initialGuess = jntPos; % current jnt pos as initial guess
endEffectorName = 'elfin_end_link';% 末端的link
%% 指定与任务相关的末端效应器姿势。
% 没有末端执行器 忽略
% % % % 指定末端执行器的名称。
% % % endEffectorName = 'r_gripper_tool_frame';
% % % % 指定罐的初始 (当前) 姿势和所需的最终姿势。
% % % TCanInitial = trvec2tform([0.7, 0.0, 0.55]);
% % % TCanFinal = trvec2tform([0.6, -0.5, 0.55]);
% % % % 定义抓取时端部效应器和罐之间所需的相对变换。
% % % TGraspToCan = trvec2tform([0,0,0.08])*eul2tform([pi/8,0,-pi]);
%% 按照特定轨迹进行运动
% 建立运动学模型
% elfin=robot('elfin');
% 机器人初始位姿
xoy = [0.1845   0.03631     0.353 ]; %位置
rpy = [0 pi/2 0];  %姿态
home = [0.266 0 0.7015];
start_home = home;
end_home =  xoy;
%定义位姿
shome_T = trvec2tform(start_home);
end_T =   trvec2tform(end_home)*eul2tform(rpy);
Tf=end_T;
%% 执行动作
% 获取当前的联合状态jntState = receive(jointSub);jntPos = JointMsgToStruct(elfin3,jntState);% 获取末端的T0T0 = getTransform(elfin3,jntPos,endEffectorName);%在关键航路点之间进行插值的百分比numWaypoints = 10;%插值个数t = [0 1];[s,sd,sdd,tvec] = trapveltraj(t,numWaypoints,'AccelTime',0.4);%相对缓慢TWaypoints = transformtraj(T0, Tf, [0 1], tvec, 'TimeScaling', [s; sd; sdd]); % end-effector pose waypoints% joint position waypointsjntPosWaypoints = repmat(initialGuess, numWaypoints, 1);  %使用IK为k = 1:numWaypoints计算每个末端执行器姿势航路点的关节位置rArmJointNames = rGoalMsg.Trajectory.JointNames;rArmJntPosWaypoints = zeros(numWaypoints, numel(rArmJointNames));% Calculate joint position for each end-effector pose waypoint using IKfor k = 1:numWaypointsjntPos  = ik(endEffectorName, TWaypoints(:,:,k), weights, initialGuess);jntPosWaypoints(k,:)  = jntPos ;initialGuess = jntPos ;% Extract right arm joint positions from jntPosrArmJointPos = zeros(size(rArmJointNames));for n = 1:length(rArmJointNames)rn = rArmJointNames{n};idx = strcmp({jntPos.JointName}, rn);rArmJointPos(n) = jntPos(idx).JointPosition;end  rArmJntPosWaypoints(k,:) = rArmJointPos';end% Time points corresponding to each waypointtimePoints = linspace(0,3,numWaypoints); % Estimate joint velocity trajectory numericallyh = diff(timePoints); h = h(1);[~, rArmJntVelWaypoints] = gradient(rArmJntPosWaypoints, h);%更新轨迹点jntTrajectoryPoints = arrayfun(@(~) rosmessage('trajectory_msgs/JointTrajectoryPoint'), zeros(1,numWaypoints)); %     jntTrajectoryPoints = repmat(rosmessage('trajectory_msgs/JointTrajectoryPoint'),1,numWaypoints);A = jntTrajectoryPoints.Positions;for m = 1:numWaypointsjntTrajectoryPoints(m).Positions = rArmJntPosWaypoints(m,:);jntTrajectoryPoints(m).Velocities = rArmJntVelWaypoints(m,:);jntTrajectoryPoints(m).TimeFromStart = rosduration(timePoints(m));end% Visualize robot motion and end-effector trajectory in MATLAB(R)hold on
%     for j = 1:numWaypoints
%         show(elfin3, jntPosWaypoints(j,:),'PreservePlot', false);
%         ShowEndEffectorPos(TWaypoints(:,:,j));
%         drawnow;
%         pause(0.1);
%     end% Send the right arm trajectory to the robotrGoalMsg.Trajectory.Points = jntTrajectoryPoints;disp(rGoalMsg.Trajectory)sendGoalAndWait(rArm, rGoalMsg);                         

9、几个函数

ShowEndEffectorPos

function ShowEndEffectorPos( T )
%EXAMPLEHELPERSHOWENDEFFECTORPOS Plot end-effector position% Copyright 2016 The MathWorks, Inc.s = 0.005;
[X0,Y0,Z0]=sphere;X = s*X0 + T(1,4);
Y = s*Y0 + T(2,4);
Z = s*Z0 + T(3,4);
surf(X, Y, Z, 'facecolor','r', 'linestyle','none');end

JointMsgToStruct

function jntPos = JointMsgToStruct(robot,jntState)
%   exampleHelperJointMsgToStruct The order of body names in the received
%   jntState message is different from that the pr2 model in MATLAB would
%   expect. This function is to provide a convenient conversion.% Copyright 2016 The MathWorks, Inc.jntPos = robot.homeConfiguration;
% 根据jntState.Name的实际个数改正
for i = 1:length(jntState.Name)-1idx = strcmp({jntPos.JointName}, jntState.Name{i});jntPos(idx).JointPosition = jntState.Position(i);
endfor i = 1:robot.NumBodiesjoint = robot.Bodies{i}.Joint;if ~strcmp(joint.Type,'fixed')idx = strcmp({jntPos.JointName}, joint.Name);jntPos(idx).JointPosition = max(min(jntPos(idx).JointPosition, joint.PositionLimits(2)), joint.PositionLimits(1));end
end
end

例子:
https://download.csdn.net/download/qq_40569926/18233484

10、博客内容主要来源 mathwork 官网:

https://www.mathworks.com/help/robotics/ug/control-pr2-arm-movements-using-actions-and-ik.html#PR2ManipulationExample-5

https://blog.csdn.net/weixin_39090239/article/details/84378770

MATLAB轨迹规划 发给ROS中机器人实现仿真运动相关推荐

  1. 【Matlab路径规划】A_star算法机器人栅格地图路径规划【含源码 116期】

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]A_star算法机器人栅格地图路径规划[含源码 116期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  2. 弯曲圆波导matlab_基于MATLAB编程的圆形波导中能流密度分布图仿真

    基于 MATLAB 编程的圆形波导中能流密度分布图仿真 王永龙 ; 夏昌龙 ; 刘朋 [期刊名称] <临沂大学学报> [年 ( 卷 ), 期] 2008(030)003 [摘要] 基于 M ...

  3. 【机械臂轨迹规划】足式机器人足端摆线轨迹曲线

    系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 一.摆线函数原理 二.摆线函数缺点 总结 参考资料 前言 本文先对摆 ...

  4. 【ROS】—— 机器人导航(仿真)—导航原理(十七)

    文章目录 前言 1. 导航模块简介 1.1 全局地图 1.2 自身定位 1.3 路径规划 1.4 运动控制 1.5 环境感知 2. 导航之坐标系 前言

  5. 【ROS】—— 机器人导航(仿真)—导航实现(十八)[重要][重要][重要]

    文章目录 前言 准备条件 1. 导航实现01_SLAM建图 1.1 gmapping简介 1.2 gmapping节点说明 1.3 gmapping使用 1.3.1 编写gmapping节点相关lau ...

  6. matlab求系统根轨迹代码_广州数控GSK RH06六轴焊接机器人的轨迹规划

    技术参数 运动范围 任务点位置 问题:如实现上图中的 运动轨迹(以基坐标系为参照),请给出相关的轨迹规划算法及其实现方式(结合运动学及动力学方程进行相关的轨迹点选取及工程实现),其中各个点的坐标为A= ...

  7. 机器人轨迹规划(熊友伦)

    机器人轨迹规划(熊友伦) http://blog.csdn.net/jyc1228/article/details/3991881 http://blog.csdn.net/wx545644217/a ...

  8. 六自由度机器人(机械臂)运动学建模及运动规划系列(四)——轨迹规划

    本篇目录 一.轨迹规划概述 二.关节空间规划 1. 点对点规划 2. 多节点规划 示例程序 三.笛卡尔空间规划 1. 速度规划 2. 位置规划 3. 姿态插补 4. 基于几何解法的一种简化位置规划方法 ...

  9. 六轴机器人轨迹规划(直线轨迹规划,弧线轨迹规划)——C#实现+ABB为例(规划直接下发离线程序运动)

    机器人直线插补算法,弧线插补算法+离线编程转换(空间直线插补规划.空间弧线插补规划.离线编程.ABB二次开发.六轴机器人控制.C#) 一,通过对空间点的插补,形成空间点轨迹 1.插补算法原理简述: ( ...

最新文章

  1. 0基础学怎么学习python
  2. 自动化测试框架的隐藏小细节,你都知道么
  3. 以前写的一点东西,放上来吧。否则就扔掉了
  4. Linux /etc/init.d目录
  5. 在.net 2.0中使用了masterpager 重写WebForm_OnSubmit()
  6. Python学习笔记:Day 7 编写MVC
  7. 你面对以希望为名的绝望微笑
  8. win10微软图标点击无反应_win10点击任务栏没反应?这样操作就可以了
  9. LeetCode 1864. 构成交替字符串需要的最小交换次数
  10. 【转】关于PHP的header(P3P: CP=CURa……)
  11. matlab设计一个简单图像直方图均衡的GUI程序
  12. java 反射 接口_Java 怎么通过反射获取并实现这个类里面的接口,并且实现接口中的方法...
  13. 三、用python实现平稳时间序列的建模
  14. Smart3D系列教程3之 《论照片三维重建中Smart3D几个工作模块的功能意义》
  15. Centos7/8 Oracle11g R2 图形化部署
  16. 彻底删除VMware !!!
  17. 兰州理工大学计算机考研好考吗,兰州理工大学考研难吗
  18. 利用ISA防火墙实现安全快速上网
  19. 微信小程序实现封装处理
  20. laravel5.4中orm中的wherein与多条件查询

热门文章

  1. 论5G无线射频芯片CB5746LP
  2. QTableView 设置行间距
  3. Android 控件之Gallery图片集
  4. 用python画竹子_初识Python
  5. 【线代】转置、共轭转置
  6. R语言统计分析|批量单变量Cox回归分析
  7. 红旗系统linux2.6.32屏保咋设置,红旗Linux桌面操作系统 V11社区预览版发布,附新特性介绍...
  8. 汤森路透 Thomson Reuters --使用多模型数据库ArangoDB 打造快速安全的简单视图分析...
  9. 欢迎潍坊市委组织部副部长都焕德一行莅临润达软件考察指导
  10. 跟随自己,让自己的灵魂做主