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

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

一、简介

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

二、雅可比矩阵

2.1 数学意义

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

对六个函数微分后得:

对于六轴机器人,其雅可比矩阵J(q)是

阶矩阵,其中前3行代表对末端线速度V的传递比,后3行代表末端角速度W的传递比,同时矩阵每一列代表对应的关节速度对于末端速度和角速度的传递比, 其中

为对应关节n的单位关节速度,

分别为对应关节n的单位关节速度对末端线速度和角速度的影响。

三、操作实现

3.1 记录轨迹

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

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

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

#include

#include

#include

#include

#include

#include

#include

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<:bool>("/robot/bagWirte", 1, write_callback);

motion_sub = nh.subscribe<: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. 六轴机械臂控制原理图_你知道六轴关节机器人的运动原理和机械结构吗?

    原标题:你知道六轴关节机器人的运动原理和机械结构吗? 什么是关节机器人? 关节机器人(Robot joints),也称关节手臂机器人或关节机械手臂,是当今工业领域中最常见的工业机器人的形态之一.适合用 ...

  2. 六轴机械臂控制原理图_六轴工业机器人工作原理解析

    原标题:六轴工业机器人工作原理解析 常见的六轴关节机器人的机械结构如图1所示: 六个伺服电机直接通过谐波减速器.同步带轮等驱动六个关节轴的旋转,注意观察一.二.三.四轴的结构,关节一至关节四的驱动电机 ...

  3. 机械臂——六轴机械臂操作空间运动分析

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

  4. 机械硬盘4k读写速度_颠覆!SSD与机械硬盘不仅仅是速度的差别

    大家都知道,买笔记本一定要选有固态硬盘(SSD)的机型,那么固态硬盘到底和机械硬盘有啥区别,固态硬盘的哪些优势让大家趋之若鹜呢?本文重点从形态.特性.性能和价格四个方面为大家简单介绍固态硬盘与机械硬盘 ...

  5. python控制程控电源_六大步骤认识程控电源的界面操作

    1 程控电源按键说明 2 1) 0-9:用于在输入框里面输入数据: 3 2) 小数点:用于在输入框中输入带小数的数据: 4 3) 10.0%↑键:当操作焦点位于调节滑块上时,可以用来将当前输出值增加额 ...

  6. 两轴机械臂+机械爪整体控制板设计与机械爪控制调试

    简 介: 在实验室样品自动上样双轴机械臂调试之后,出现了肩关节的运动力矩不足,这里使用了57HSXXXX步进电机进行增加力矩.下面是相关的调试过程. 关键词: 两轴机械臂,机械爪,上样机械臂 01为什 ...

  7. 实际的机械臂控制(9)Moveit单独控制机械臂末端在XYZ三个轴的平移和旋转(基于python)

    0. 序言 在moveit中,控制机械臂的末端执行器运动的API有两个,分别是: shift_pose_target set_pose_target 第一个API:shift_pose_target ...

  8. 【从零开始的ROS四轴机械臂控制】(六)- 逻辑控制节点

    [从零开始的ROS四轴机械臂控制(六)] 九.逻辑控制节点 1.运动控制方法 (1)逆向运动学 (2)反馈控制 2.各节点之间的联系 3.相关程序 (1)img_process节点 (2)arm_co ...

  9. matlab机械臂工作空间代码_[连载 5]Vrep--Matlab Robitic Toolbox--PUMA560机械臂控制

    [连载 0]Vrep入门介绍 [连载 1]Vrep小车建模--前进和转向 [连载 2]Vrep小车建模--内嵌脚本 [连载 3]Vrep小车建模--matlab控制 [连载 4]Vrep导入三维模型- ...

最新文章

  1. 3D-2D:PnP算法原理
  2. Java反射之反射权限和静态属性的赋值
  3. P8级别的顶级“并发编程”宝典,最全指南
  4. elementui获取所有树节点_element-ui tree获取子节点全选的父节点信息
  5. matlab没有int函数,matlab 未定义与 'char' 类型的输入参数相对应的函数 'int'。
  6. Django单表,连表查询
  7. Nginx 原理和架构 | 原力计划
  8. 左右伸缩_OPPO概念机将至!横向卷轴+左右伸缩,你期待吗
  9. 让Google chrome支持迅雷
  10. SQL常用语句(大全)
  11. 酷狗音乐分类html,酷狗音乐手机版创建歌单教程 分类自己的音乐库
  12. wgs84坐标系拾取工具_Wgs84坐标系转换为gcj02坐标系及bd09坐标系的验证
  13. 社工小组 计算机小组活动,《社工小组活动常用游戏整理》
  14. publish over ssh、 Kubernetes Continuous Deploy插件
  15. 模型的骨骼动画技术讲解
  16. 如何将matlab设置为默认打开方式,如何设置默认打开方式
  17. 刺激战场 枪支性能雷达图分析
  18. 【密码学篇】虚拟专用网技术原理与应用(商密)
  19. Telegram 查看下载保存的文件
  20. 关于语义分析的简单总结

热门文章

  1. I2C 与 I3C协议
  2. 云+社区技术沙龙丨解析腾讯最新开源项目背后的技术栈
  3. 【Redis】--缓存双写一致性分析、解决方案
  4. 浏览器兼容问题(实战干货)
  5. 关于舵机的漂移与不听指挥乱动的问题
  6. 魅族mx4 android5.0,魅族MX4 Pro长测(2):安卓5.0 Flyme体验
  7. expire_logs_days
  8. 聚信立蜜罐数据深度解析(反欺诈)
  9. .pyc是什么?python
  10. 【汇编实战开发笔记】从汇编代码中找出一段普通的for循环变成“死循环”的根本原因(RT-Thread技术论坛优秀文章)