机械臂建模分析:https://blog.csdn.net/Kalenee/article/details/81990130

MoveIt规划下的关节空间运动分析:http://www.guyuehome.com/752

一、简介

在ROS平台下使用MoveIt进行机械臂控制时,默认调用AddTimeParameterization模块完成轨迹的运动规划,输出结果为各关节在对应时间帧下的关节位置与角速度,并没有机械臂末端的运动信息,为此需要通过rosbag完成运动规划的记录并结合Matlab完成操作空间的运动分析。

二、雅可比矩阵

2.1 数学意义

数学上雅可比矩阵(Jacobian matrix)是一个多元函数的偏导矩阵。设有六个拥有六个变量函数如下:

对六个函数微分后得:

可简写为

其中 为雅可比矩阵,可用J表示。

2.2 机械臂的雅可比矩阵

机械臂的雅可比矩阵J既可表示从关节空间向操作空间的速度传递的线性关系,也可看成是微分运动转换的线性关系。

对于六轴机器人,其雅可比矩阵J(q)是阶矩阵,其中前3行代表对末端线速度V的传递比,后3行代表末端角速度W的传递比,同时矩阵每一列代表对应的关节速度对于末端速度和角速度的传递比, 其中为对应关节n的单位关节速度,分别为对应关节n的单位关节速度对末端线速度和角速度的影响。

三、操作实现

3.1 记录轨迹

在工作空间下创建bag文件,将记录轨迹的.bag文件及脚本放置在该目录下。

(1)编写节点利用rosbag记录轨迹

rosbag api官方教程:http://wiki.ros.org/rosbag/Code%20API

#include <ros/ros.h>
#include <rosbag/bag.h>
#include <rosbag/view.h>
#include <std_msgs/Bool.h>
#include <std_msgs/Float64MultiArray.h>
#include <string>
#include <trajectory_msgs/JointTrajectory.h>ros::Subscriber write_sub, motion_sub;
int nums;bool writeJudge;
rosbag::Bag writeRobot, writePos, writeVel;void data_process(trajectory_msgs::JointTrajectory getData) {writeRobot.write("/moveit/JointTrajectory", ros::Time::now(), getData);for (int j_num = 0; j_num < 6; j_num++) {std_msgs::Float64MultiArray pos_data, vel_data;for (int i = 0; i < getData.points.size(); i++) {pos_data.data.push_back(getData.points[i].positions[j_num]);vel_data.data.push_back(getData.points[i].velocities[j_num]);}writePos.write("pos" + std::to_string(j_num), ros::Time::now(), pos_data);writeVel.write("val" + std::to_string(j_num), ros::Time::now(), vel_data);}
}void write_callback(const std_msgs::Bool::ConstPtr &data) {if (data->data) {writeJudge = true;std::string robotFileName = "bag/motion";robotFileName += std::to_string(nums);robotFileName += ".bag";writeRobot.open(robotFileName, rosbag::bagmode::Write);std::string posFileName = "bag/motion_pos";posFileName += std::to_string(nums);posFileName += ".bag";writePos.open(posFileName, rosbag::bagmode::Write);std::string velFileName = "bag/motion_vel";velFileName += std::to_string(nums);velFileName += ".bag";writeVel.open(velFileName, rosbag::bagmode::Write);} else {writeJudge = false;writeRobot.close();writePos.close();writeVel.close();nums++;}
}void motion_callback(const trajectory_msgs::JointTrajectory::ConstPtr &data) {if (writeJudge) {std::cout << "write" << std::endl;data_process(*data);}
}int main(int argc, char **argv) {ros::init(argc, argv, "record");ros::NodeHandle nh;nums = 1;writeJudge = false;write_sub =nh.subscribe<std_msgs::Bool>("/robot/bagWirte", 1, write_callback);motion_sub = nh.subscribe<trajectory_msgs::JointTrajectory>("/moveit/JointTrajectory", 10, motion_callback);ros::spin();
}

(2)使用脚本将.bag文件转为.csv文件

创建脚本bagtocsv.sh

#! /bin/bash
echo "Enter bag name"
read bagname
for topic in `rostopic list -b $bagname.bag`;
do rostopic echo -p -b $bagname.bag $topic >$bagname-${topic//\//_}.csv;
echo "finish"
done

cd到该目录下,用bash命令执行,根据提示输入.bag文件的名字。

3.2 轨迹处理

Matlab程序

clear;%% 前期准备
%启动工具箱
startup_rvc;%角度转换
du=pi/180;     %度
radian=180/pi; %弧度%关节长度,单位m
L1=0.40;L2=0.39;L3=0.17;L4=0.20;L5=0.08;%% 建立数学模型
% DH法建立模型,关节角,连杆偏移,连杆长度,连杆扭转角,关节类型(0转动,1移动)
L(1) = Link( 'd',L1    ,  'a',0  , 'alpha',-pi/2, 'offset',0          );
L(2) = Link( 'd',0     ,  'a',-L2, 'alpha',0    , 'offset',pi/2       );
L(3) = Link( 'd',0     ,  'a',0  , 'alpha',pi/2 , 'offset',0          );
L(4) = Link( 'd',L3+L4 ,  'a',0  , 'alpha',-pi/2, 'offset',0          );
L(5) = Link( 'd',0     ,  'a',0  , 'alpha',pi/2 , 'offset',0          );
L(6) = Link( 'd',L5    ,  'a',0  , 'alpha',-pi/2, 'offset',0          );
plotopt = {'noraise', 'nowrist', 'nojaxes', 'delay',0};
tool_char=[1 0 0 0;0 1 0 0;0 0 1 0;0 0 0 1];
six_link=SerialLink(L,'name','six link','tool',tool_char);%% 显示机械臂
figure('name','机器臂')
hold on
six_link.plot([0 0 0 0 0 0], plotopt{:});
hold off%% 计算雅可比矩阵
syms theta1 theta2 theta3 theta4 theta5 theta6;
j_trans = six_link.jacob0([theta1 theta2 theta3 theta4 theta5 theta6],'trans');
save('JacobData','j_trans');%% 读取关节运动参数
%获取关节角度
j1 = csvread('robotMotion_pos-pos0.csv');
j2 = csvread('robotMotion_pos-pos1.csv');
j3 = csvread('robotMotion_pos-pos2.csv');
j4 = csvread('robotMotion_pos-pos3.csv');
j5 = csvread('robotMotion_pos-pos4.csv');
j6 = csvread('robotMotion_pos-pos5.csv');%获取角速度
j_v = zeros(6,length(j1));
j_v(1,:) = csvread('robotMotion_vel-val0.csv');
j_v(2,:) = csvread('robotMotion_vel-val1.csv');
j_v(3,:) = csvread('robotMotion_vel-val2.csv');
j_v(4,:) = csvread('robotMotion_vel-val3.csv');
j_v(5,:) = csvread('robotMotion_vel-val4.csv');
j_v(6,:) = csvread('robotMotion_vel-val5.csv');%% 计算末端运动参数
eff_p = zeros(3,length(j1));
eff_v = zeros(3,length(j1));
for  i=1:1:length(j1)theta1 = j1(i);theta2 = j2(i);theta3 = j3(i);theta4 = j4(i);theta5 = j5(i);theta6 = j6(i);% 计算末端位置eff_p(:,i) = six_link.fkine([theta1 theta2 theta3 theta4 theta5 theta6]).t;% 计算末端速度eff_v(:,i) = double(subs(j_trans))*j_v(:,i);
end%% 画图
time = csvread('robotMotion_time.csv');hold on;
figure('name','关节空间运动分析')
subplot(2,1,1);
plot(time,j1,time,j2,time,j3,time,j4,time,j5,time,j6);
subplot(2,1,2);
plot(time,j_v(1,:),time,j_v(2,:),time,j_v(3,:),time,j_v(4,:),time,j_v(5,:),time,j_v(6,:));
hold off;hold on;
figure('name','工作空间运动分析')
subplot(2,1,1);
plot(time,eff_p(1,:),time,eff_p(2,:),time,eff_p(3,:));
subplot(2,1,2);
plot(time,eff_v(1,:),time,eff_v(2,:),time,eff_v(3,:));
hold off;

3.3 结果

关节空间运动分析

工作空间运动分析

参考:

《机器人技术基础》

机械臂——六轴机械臂操作空间运动分析相关推荐

  1. 机械臂——六轴机械臂逆解

    环境:MATLAB 2017B+Robotics Toolbox 9.10.0 前期准备:完成机械臂数学模型的建立+计算机械臂工作空间 https://blog.csdn.net/Kalenee/ar ...

  2. 六轴机械臂控制原理图_机械臂——六轴机械臂操作空间运动分析

    机械臂建模分析:https://blog.csdn.net/Kalenee/article/details/81990130 MoveIt规划下的关节空间运动分析:http://www.guyueho ...

  3. 六轴机械臂下位机(arduino)+上位机(ROS+Moveit)---(一)机械臂硬件

    六轴机械臂下位机(arduino)+上位机(ROS+Moveit)---(一)机械臂硬件 机械部分 机械臂制作时的注意点!!!(坑) 零件的3D打印 控制器接线问题 机械部分 六轴机械臂在工业领域的运 ...

  4. MyCobot六轴机械臂的基本操作(二)

    上一讲我们做ssh和vnc的设置,有小伙伴问设置些有什么用,那么这里我先来解释一下这些功能有什么用处,首先我们可以通过ssh在我们的Windows桌面进行程序开发,然后上传到树莓派进行验证,我们也可以 ...

  5. Qt中动态显示六轴机械臂的STL三维模型

    Qt中动态显示六轴机械臂的STL三维模型 运动仿真 STL模型 openGL显示STL ASCII格式的STL文件 读取STL文件 openGL中显示STL模型 运动学变换 两个坑 最终效果 运动仿真 ...

  6. 桌面小六轴机械臂mechArm

    1 产品简介 mechArm Pi 270隶属于大象机器人"mechArm"系列小六轴机械臂,采用树莓派微处理器,支持ROS仿真模拟软件,是大象机器人面向创客创新和机器人产学研服务 ...

  7. 六轴机械臂DIY(三)开源项目介绍

    就这样一年半了,项目断断续续仍在进行,期间我混了个毕业,相信大家也经历了很多吧.最近上海疫情,毕业后的我哪里也去不了,只能在寝室等学校的投喂,那么正好,让我们项目继续. 本节主要完整介绍这个机械臂的开 ...

  8. 如何实现六轴机械臂的逆解计算?

    1. 机械臂运动学介绍 机械臂运动学 机器人运动学就是根据末端执行器与所选参考坐标系之间的几何关系,确定末端执行器的空间位置和姿态与各关节变量之间的数学关系.包括正运动学(Forward Kinema ...

  9. 【机器人原理与实践(三)】六轴机械臂正逆解控制

    文章目录 3.1 空间转换矩阵的理解 3.1.1平移变换 3.1.2旋转变换 3.2 D-H参数法 3.3 建立机械臂模型 3.3.1 机械臂模型介绍 3.3.2 使用Matlab进行示教仿真 3.4 ...

最新文章

  1. 自律到极致-人生才精致:第11期
  2. 在dos下用csc命令编译,提示“csc不是内部或外部命令,也不是可运行的程序... ”
  3. 【Python】青少年蓝桥杯_每日一题_3.27_画多个正五边形图案
  4. 华中科技大学c语言作业答案,华中科技大学标准C语言程序设计及应用习题答案...
  5. thinkphp5模拟post请求_Thinkphp5.1模拟登录并提交form表单
  6. 最真实的办公自动化案例!
  7. 面试题,说说你理解的中台
  8. 2018年最佳Linux服务器发行版
  9. oracle sequence 应用,oracle应用之使用sequence批量写数据
  10. Entity Framework之问题收集
  11. 如何导出微信的小视频
  12. Java猜拳小游戏(剪刀、石头、布)
  13. 15个简单的JS编码标准让你的代码更整洁
  14. ffplay音视频同步
  15. Python实现词云图的3种方式(词频,一段文本,自定义样式)
  16. python+selenium自动截取政府官网及失信公示平台搜索结果图
  17. python 生物信息学_生物信息学算法之Python实现
  18. 开仓平仓基本类型有哪些?股指开仓平仓指的是什么?
  19. 4.10招商银行笔试编程题
  20. Python SMTP 163邮箱发送邮件不成功

热门文章

  1. 西门子PID程序西门子PLC 1200和多台G120西门子变频器Modbud RTU通讯,带西门子触摸屏
  2. 502 Bad Gateway 错误的可能原因
  3. VS 2019 + CUDA 10 开发环境搭建
  4. php apache日志,Apache日志详解
  5. mimikatz 使用
  6. 微信支付接口(公众号支付)+微信支付回调函数 附代码
  7. 网站推广策略-网站推广120种实用方法_打杂的_新浪博客
  8. 戴尔,华三,华为,中兴,浪潮服务器维保时间抓取
  9. [附源码]计算机毕业设计springboot房产中介管理系统
  10. 地下城与勇士(DNF)万年雪山副本(冰心少年、利库天井、山脊、白色废墟、布万加的修炼场、冰雪宫殿、斯卡萨之巢)(童年的回忆)