jjzjj

IRB 1600-6/1.45 ABB 改进DH参数计算正解逆解

小修勾 2023-11-11 原文

IRB 1600-6/1.45 ABB机器人正解逆解计算

一、参考文章

最近在项目中,需要通过笛卡尔空间已知点的位置求解机器人关节空间的状态,最终选择最优方式到达目标点。实验室正好有ABB机器人,型号为IRB 1600-6/1.45。
方法步骤:
1、获取机器人DH参数
2、fk、ik代码
3、robotstudio验证

abb dh参数获取:
dh参数1
dh参数2

参考视频:哔哩哔哩,强烈推荐
台大机器人运动学

fk-ik计算推导参考:
fk-ik2
fk_ik2

二、改进DH参数获取

在上文链接中,按照链接1、2所述,获取到的DH参数应为MDH,其获取结果如下图所示,但是通过最终验证,只有欧拉角计算正确,空间位置并不正确。

后续通过其他途径获取相关改进DH参数,见下述内容,如有需要,见私信。

三、fk推导

根据上述链接,建立相关坐标系,建立过程如下图所示;

以课程中示例所示,第i-1与第i杆之间坐标经历α(i-1),a(i-1),θ(i),d(i)。该方法为改进DH参数。其中:
α(i-1) 表示第i-1坐标系z轴经旋转后与第i坐标系z轴平行,逆时针为正;
a(i-1) 表示经过上述操作后的第i-1坐标系z轴与第i坐标系z轴异面直线距离;
θ(i)表示经过上述操作后的第i-1坐标系x轴经旋转后与第i坐标系x轴平行;
d(i) 表示经过上述操作后的i-1坐标系与第i坐标系之间偏移距离。

注意初始坐标系与末尾坐标系中参数,具体见推荐课程。
参考fk-ik2链接中图片,对ABB六轴机器人建立对应的坐标系,轻易可得:


可得ABB中对应的MDH为,具体型号见技术参数:

最终变换公式如下图所示,T的左上角为以哪一个坐标系作为基准。将上表中数带入下图公式,最终可以得到机器人正解。

最终,将变换矩阵转换为XYZABC格式,只需将旋转矩阵转换为欧拉角即可。

四、ik推导

针对ik推导,具体推导公式不详细列出,最终结果存在多解,为下图所示;


懒得写了,抽时间再写,依据上述链接中计算后续的theta。

五、测试验证

打开robotstudio,建立机器人工程,打开虚拟示教器,随意设定一个位姿,分别记录笛卡尔空间坐标与关节空间状态,如下图所示,分别进行fk ik计算。

最终得到位姿如下图所示:
可以看出fk、ik计算正确,为了验证其他关节状态是否正确,分别移动虚拟示教器,让关节状态满足其余七个状态,记录笛卡尔坐标。

关节空间验证

大概位姿,非准确,只是测试是否准确:
第2组、


第3组、第4组中第五轴超出量程范围;
第5组:

第6组


第7组、第8组中二轴的超出量程范围;

综上,可以验证abb机器人正解及逆解的正确性;

附录-代码部分

#include <iostream>
#include <cmath>
#include <vector>
#include <Eigen/core>
#include <cmath>
using namespace std;
const double pi = 3.14159265397932384626433;

//MDH参数
vector<double> joints_alpha = { 0, -90, 0, 90, -90, 90 };
vector<double> joints_a = { 0, a1, -a2, -0, 0, 0 };
vector<double> joints_d = { d1, 0, 0, d4, 0, d6 };
vector<double> joints_theta = { 0, 90, 0, 0, 0, 0 };
//MDH参数-矩阵
Eigen::Matrix4d dh_matrix(double alpha, double a, double d, double theta);

//旋转矩阵转换为欧拉角
vector<double> computeEularAngles(Eigen::Matrix4d & R, bool israd);

//欧拉角转换为旋转矩阵 xyzabc
Eigen::Matrix4d computeTrans(vector<double> pos);

//fk计算
vector<double> fk_robot(vector<double>joints_alpha, vector<double> joints_a, vector<double> joints_d, vector<double> joints_theta);

//ik计算
vector<vector<double>> ik_robot(Eigen::Matrix4d trans);

int main()
{

	vector<double> temp_theta = { 20.24,14.44,24.48,-22.07,26.14,-84.27 };//关节空间表示
	vector<double> pos = { 773.17,273.55,730.15,-60.93,-14.71,-155.71 };//笛卡尔空间表示

	 //fk 
	vector<double> theta1;
	for (int i = 0; i < joints_theta.size(); i++)
	{
		theta1.push_back(joints_theta[i]+ temp_theta[i]);
	}
	auto rst = fk_robot(joints_alpha, joints_a, joints_d, theta1);
	
	cout << "笛卡尔空间表示:\n"<<"x: "<<rst[0] << "\ty: " << rst[1] << "\tz:" << rst[2] << "\tA: " << rst[3] << "\tB: " << rst[4] << "\tC: " << rst[5] << endl;


	//ik计算
	auto test = computeTrans(pos);
	auto joint=ik_robot(test);

	cout << "关节空间表示:" << endl;
	for (int i = 0; i < joint.size(); i++)
	{
		for (int j = 0; j < joint[i].size(); j++)  cout << "theta"+ to_string(j)+":   "<<joint[i][j] << "\t";
		cout << "\n";
	}

	system("pause");
	return 0;
}

有关IRB 1600-6/1.45 ABB 改进DH参数计算正解逆解的更多相关文章

  1. ruby - 无法覆盖 irb 中的 to_s - 2

    我在pry中定义了一个函数:to_s,但我无法调用它。这个方法去哪里了,怎么调用?pry(main)>defto_spry(main)*'hello'pry(main)*endpry(main)>to_s=>"main"我的ruby版本是2.1.2看了一些答案和搜索后,我认为我得到了正确的答案:这个方法用在什么地方?在irb或pry中定义方法时,会转到Object.instance_methods[1]pry(main)>defto_s[1]pry(main)*'hello'[1]pry(main)*end=>:to_s[2]pry(main)>defhello[2]pry(main)

  2. Ruby 默认将 IRB 配置为 Pretty_Inspect - 2

    我是ruby​​的新手,正在配置IRB。我喜欢pretty-print(需要'pp'),但总是输入pp来漂亮地打印它似乎很麻烦。我想做的是默认情况下让它漂亮地打印出来,所以如果我有一个var,比如说,'myvar',然后键入myvar,它会自动调用pretty_inspect而不是常规检查。我从哪里开始?理想情况下,我将能够向我的.irbrc文件添加一个自动调用的方法。有什么想法吗?谢谢! 最佳答案 irb中默认pretty-print对象正是hirb被迫去做。Theseposts解释hirb如何将几乎所有内容转换为ascii表。虽

  3. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

  4. ruby-on-rails - 我可以用鸭子类型(duck typing)改进这种方法吗? - 2

    希望我没有误解“ducktyping”的含义,但从我读到的内容来看,这意味着我应该根据对象如何响应方法而不是它是什么类型/类来编写代码。代码如下:defconvert_hash(hash)ifhash.keys.all?{|k|k.is_a?(Integer)}returnhashelsifhash.keys.all?{|k|k.is_a?(Property)}new_hash={}hash.each_pair{|k,v|new_hash[k.id]=v}returnnew_hashelseraise"CustomattributekeysshouldbeID'sorPropertyo

  5. ruby-on-rails - 在 irb 中阅读文档 - 2

    我怀念ipython的一件事是它有一个?为特定功能挖掘文档的运算符。我知道ruby​​有一个类似的命令行工具,但是我在irb中调用它非常不方便。ruby/irb有类似的东西吗? 最佳答案 Pry是IPython的Ruby版本,它支持?命令来查找有关方法的文档,但语法略有不同:pry(main)>?File.dirnameFrom:file.cinRubyCore(CMethod):Numberoflines:6visibility:publicsignature:dirname()Returnsallcomponentsofthef

  6. ruby - Ruby 脚本如何检测到它正在 irb 中运行? - 2

    我有一个定义类的Ruby脚本。我希望脚本执行语句BoolParser.generate:file_base=>'bool_parser'仅当脚本作为可执行文件被调用时,而不是当它被irbrequire(或通过-r在命令行上传递)时。我可以用什么来包装上面的语句,以防止它在我的Ruby文件加载时执行? 最佳答案 条件$0==__FILE__...!/usr/bin/ruby1.8classBoolParserdefself.generate(args)p['BoolParser.generate',args]endendif$0==_

  7. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  8. ruby-on-rails - 如何在不退出 IRB session 的情况下退出调试器? - 2

    这是一个长期存在的挫败感来源,但也许我遗漏了什么。如果我正在调试,并且我想退出调试器并返回到IRB或Rails控制台,“退出”将不起作用,因为它将退出IRB。“完成”似乎也与继续具有相同的效果。使用“删除”删除断点然后尝试“继续”或“完成”不起作用。有什么想法吗? 最佳答案 至少在byebug中,你可以这样做:evalreturn它具有计算当前函数的return语句的净效果。这有时会奏效,具体取决于调用堆栈的外观。现在虽然这不会删除当前断点....如果您只是想收回控制权,在大多数情况下这会做到这一点,具体取决于您的代码结构。在您的代

  9. ruby - 为什么在 IRB 中使用 Refinement 时得到 "main.using is permitted only at toplevel"? - 2

    我尝试在IRB(v0.9.6,Ruby2.3.0)中使用Refinement:moduleFoorefineObjectdodeffoo()"foo"endendendusingFoo#=>RuntimeError:main.usingispermittedonlyattoplevel这基本上是theexactsetupfromthedocumentation(这会导致相同的错误)。出了什么问题?我该如何解决这个问题? 最佳答案 这可能是IRb的错误或功能不当。众所周知,由于IRb的实现方式非常骇人听闻,因此它无法在所有极端情况下正

  10. ruby - IRB - Ruby 1.9.x 哈希语法 : {if: true} is not equal to {:if => true} - 2

    长话短说,我正在编写一个包含选项参数的方法,如果键的值:if评估为真,该方法将执行某些操作。当我使用新语法在IRB中尝试哈希时,我在IRB中遇到语法错误,提示保持打开状态:1.9.3p374:010>{if:true}1.9.3p374:011?>使用旧语法,效果很好:1.9.3p374:011>{:if=>true}=>{:if=>true}开始语句的所有关键字都表现出相同的行为。例如。def,do,module,case出现在中间和class中的其他保留字可以正常工作:else、end我的问题是:这是预期的行为、错误还是限制? 最佳答案

随机推荐