开链(open chain)机器人,是由多个杆件串接而成,即若干刚性杆件首尾连接而成,如下图所示。杆件之间的连接部分称为关节。杆件和关节的编号方法为:基座为杆0,然后依次为杆1,杆2...杆n;关节i连接杆i和杆i+1;除了杆0外,机器人的每个杆都有一个驱动器(actuator),产生的驱动力从关节i传递到连杆i上。(注:这里只讨论转动关节。)所以将关节i的轴称为连杆i的驱动轴(driving axis),而关节i+1是将杆i的运动和力传导到杆i+1上,故关节i+1的轴称为杆i的传动轴(transmitting axis)。


连杆坐标系是与机器人各连杆固连的坐标系,这是由Danevit Harttnberg提出的故称为DH方法。对于n自由度机器人,建立与各杆件固连的坐标系
的步骤为:
第一步:确定各坐标系的Z轴:
基本原则为:选取轴为关节i+1的轴向(指向可以任选,但是通常将各平行的Z轴的指向取为相同)。另外,机器人远端没有关节n+1,这时可以选取
轴和
轴重合 。
第二步:确定各坐标系的原点:
基本原则为:选取原点在过
轴和
轴的公法线上(即公法线与
轴的交点)。注意:①当
轴和
轴平行时,两轴的公法线有无数条,若两轴重合则
取,若两轴平行且不重合则过
点做两轴的公法线,此公法线与
轴的交点即为
。②由于没有
,故
的无法按上面的方法确定,若
与
相交则
,若
与
不相交取
在
与
的公法线上。
第三步:确定各坐标系的X轴:
基本原则为:选取轴沿过
轴和
轴的公法线,方向从
轴指向
轴。 注意:①当
轴与
轴 重合时(这时
),选取
轴满足在初始位置时
轴与
轴重合。②当
轴与
轴相交且不重合时,选择
=
。通常使所有平行的X轴有相同的指向。③当i=0时,由于
或
在
与
的公法线上,选取在初始位置时
轴与
轴重合。
第四步:确定各坐标系的Y轴:
基本原则为:使构成右手坐标系。
1、杆件长度:定义为从
轴到
轴的距离,沿
轴的指向为正;
2、杆件扭角:定义为从
轴到
轴的转角,绕
轴正向转动为正,且
;
3、关节距离:定义为从
轴到
轴的距离,沿
轴的指向为正;
4、关节扭角:定义为从
轴到
轴的转角,绕
轴正向转动为正,且
;

标准DH法连杆坐标系是建立在连杆的传动轴上的,这个方法有一个明显的缺点是对于并联(树形或闭链)机器人,有的杆上会存在多于一个的传动轴,这时标准DH法建立连杆坐标系便会产生歧义。为此发展的修正DH法则将连杆坐标系建立在连杆的驱动轴,从而避免了这个问题。
第一步:确定各坐标系的Z轴:
基本原则为:选取轴为关节i的轴向 。
第二步:确定各坐标系的原点:
基本原则为:选取原点在过
轴和
轴的公法线上。
第三步:确定各坐标系的X轴:
基本原则为:选取轴沿过
轴和
轴的公法线,方向从
轴指向
轴。
第四步:确定各坐标系的Y轴:
基本原则为:使构成右手坐标系。
1、杆件长度:定义为从
轴到
轴的距离,沿
轴的指向为正;
2、杆件扭角:定义为从
轴到
轴的转角,绕
轴正向转动为正,且
;
3、关节距离:定义为从
轴到
轴的距离,沿
轴的指向为正;
4、关节扭角:定义为从
轴到
轴的转角,绕
轴正向转动为正,且
;

通常标准DH参数和修改的DH参数间除i=0和i=n外有如下关系:
标准DH参数{}=修正的DH参数{
}
以上便是关于机器人DH参数建模的相关内容,下面将以一个六轴机械臂为例进行实例建模。
我希望将Favorite模型添加到我的User和Link模型。业务逻辑用户可以有多个链接(即可以添加多个链接)用户可以收藏多个链接(他们自己的或其他用户的)一个链接可以被多个用户收藏,但只有一个所有者我对如何为这种关联建模以及在模型就位后如何创建用户收藏夹感到困惑?classUser 最佳答案 下面的数据模型怎么样:classUser:destroyhas_many:favorite_links,:through=>:favorites,:source=>:linkendclassLink:destroyhas_many:favor
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一