六轴机械臂控制库dawa校园版本使用指南:

作者: dawa库已经升级至2.0版本,请点击下面链接访问:

dawa 2.0 链接

————————————————————————————————————————————————

  • •dawa1.3xx 较 1.2xx 版本调整部分:2021/08/07 

1.在Input()命令中增加了纯折线路径规划命令,原来的折线路径规划在拐点处有小圆弧过渡。

2.在 set_rest_position命令中,增加了两个参数,允许用户设置路径为每一次循环都回到预设的rest_position.

3.纠正一处函数名称拼写,将原来的函数 shut_down_restposition 名称 改为 shutdown_rest_position.

4.一些其它的细节修正。

————————————————————————————————————————————————

  • •dawa1.2xx 较 1.1ab 版本调整部分:2021/07/10 

1.增加了UR型机械臂的库,为了便于区分,调整库文件命名规则:

原ABB型机械臂的库libdawa.so 更名为libdawaA.so 与新增的UR型机械臂的库 libdawaU.so 相对应。

2.进一步调整了角度自主回转动作的速度。

3.将原来的工具长度 即 gongjucd 变量,改名为 tool_length,并将其从public属性移入private属性,新增设置工具长度的函数

set_tool_length;

4.纠正一处函数名称拼写错误,将原来的函数 set_path_pause_in_secends名称 改为 set_path_pause_in_seconds

————————————————————————————————————————————————

  • •dawa1.1ab 较 1.0ab 版本调整部分:2021/06/28 

1.增加了实时控制操作中的时间信息回馈管控功能,更适合于没有机械臂3D仿真的按键界面开发。用户可以使用新增的bool Busy(void)函数来测知机械臂是否处于上一条实时控制指令引发的未完成动作状态 .

2.在原有的基础上,对防止一轴快速回转运动的机制 ,作了进一步改进。

————————————————————————————————————————————————

本说明文档实时更新,请参阅 dawa-robot.com

http://www.dawa-robot.com/readmedoc/chinese.html

一、dawa校园版本基于ubuntu操作系统,控制目标为ABB型机械臂,该版本为c++编写,主要文件有

r6a.h

libdawa.so

校园版本系免费对外发布,适用于各类科研机构和个人研究者进行机械臂控制的辅助研究。

二、库应用框架的输入输出模式:

建立机械臂的派生对象r6a,并运行

r6a.assist_Thread()

方法以后,系统处于等待输入的指令的状态,并在一个数组thetas[]里面反映出来计算结果。 数组数据是“动态播放”的。

例如,输入一条前进指令 moveTo(pose),数组thetas[]前12个数据thetas[0]到thetas[11](前六个是弧度制信息,后六个是角度制信息)就会每隔几十毫秒变化一次,顺序“播放”出从当前所在的点到达目标点(pose)所经过的直线路径插值点所需要的六轴数据变化序列,我们只需要把数组里面的六个轴角度信息根据需要,每隔一段时间(比如25ms)传给机械臂,让机械臂执行这些角度就可以实现机械臂的控制,另外,thetas[12] thetas[13]还分别承载向下位机传递夹爪开合信息,在某个点的停留时间等内容。

需要规划路径时,系统支持随机记录一些当前所处的点,放到一个容器special_points 里面,编程人员可以随时调用这些点,把这些点中的若干个或者全部以任意顺序组成一个点的序列selected_points,并以该序列生成路径。

这样的好处是用户可以永远不必要输入矩阵来指定一个特定位置。

路径规划完毕以后,也是通过时域变化的thetas[]角度序列来实现对机械臂的控制的。

概括起来讲,就是建立机械臂类的实例并运行辅助计算线程以后,dawa就开启了一个等待输入指令的系统,只要输入指令,thetas[ ] 数组会随时间变化(可以称其为“播放数据”),用来表示当前机械臂各轴需要实时到达的位置。同时也播放一些夹爪控制信息,停留时间等信息,从而代替下位机的部分功能。

建议将机械臂的各轴角度与thetas[ ]数组前12个数据建立同步关联。

三、功能特点:

(a) 运行速度快,为实时系统;

(b)不会因为奇异点等问题卡顿停机 ;

(c) 路径运行中,姿态衔接流畅,无失控乱动情形;

(d)c++编写,制作代码精炼,没有对其它机器人库的依赖,库体积小;

(e)系统输入输出应用简练,比如用户只需要给出目标点位姿矩阵,库就可以输出到达该目标的直线路径规划信息,连接实体机械臂即可完成目标任务。用户只需要控制并实时记录机械臂途径若干点位,就可以一键生成一条折线路径;

(f)正逆解等复杂函数已经优化多线程封装,用户只需要处理系统的输入输出即可完成大部分想要的功能,用户只需要有一些c++基础,就可以快速部署出一个六轴控制系统;

(g)路径规划中带有部分夹爪控制信息等。

四、程序代码应用:

库文件名称: r6a.h libdawa.so

文件可以在www.dawa-robot.com下载,应用疑问可以到www.dawa-robot.com/bbs 论坛进行讨论。

用户需要使用c++ 11以上版本作为该库的使用环境。

把r6a.h 放到 /usr/include 下面

把 libdawa.so 放到/usr/lib下面,做好库的链接设置。以免程序找不到该库。( 在后续升级时,文件名不变,包含它们的压缩包名称会有标识,用户需要将旧版本的文件替换掉。)

具体代码示例:

#include <r6a.h> //引用库,设置好相关库的链接。

double dhp[6]={239.0,58.0,300.0,0.1,335.0,83};

//把dh参数放到上面数组里,顺序是d1,a1,a2,a3,d4,d6.

double range[6][2]=

{

{-6.28,6.28},//第一轴角度范围,弧度制

{-6.28,6.28},//第二轴角度范围,弧度制

{-6.28,6.28},//第三轴角度范围,弧度制

{-6.28,6.26},//第四轴角度范围,弧度制

{-6.28,6.26},//第五轴角度范围,弧度制

{-6.28,6.26},//第六轴角度范围,弧度制

};//把各轴角度范围放到上面数组里,大家需要根据自己机械臂各轴实际范围进行修改。

double startangles[6]={0};

//各轴起始角度,相当于其它库中角度的offset,目前校园1.0版本缺省为0即可,校园版本不支持改动;

r6a r6a(dhp,range,startangles);

// 建立机械臂实例;

int main(int argc, char** argv)

{

r6a.assist_Thread();

//一定要在指令代码之前,运行面的r6a方法。

//此处放置各种设置指令,和运行操作(实时控制和路径规划)指令

//

//

return 0;

}

五、r6a类的一些函数和变量介绍:

  • double thetas[15]={0};

//thetas[0]~thetas[11]存储各轴角度信息,其余存储位置为高版本库功能预留。

  • r6a(double dh[6],double axis_range[6][2],double initangles[6]);

//构造函数

  • ~r6a()

{};

//析构函数

  • void Input(int key);

//输入的指令,例如 r6a.Input(key),key参数是具体指令代号。

//key的值目前有下表这些可选项,r6a.Input(119) 等价于r6a.Input(int('w')),之所以使用了字母的ascII码,是为了方便用户在二次开发中直接使用键盘作为输入方式。 开发者也可以根据自己的喜好,完全无视这些字母的存在,直接使用下表第一列的 int 来区分各个指令。

//假如用户要用本库开发一个UI用户操作界面。那只需要绘制一些按钮对应下表中的各个键值,这样最终用户就非常可以方便的控制机械臂。

//需要特别说明的是,由于本系统计算速度非常快,如果编程时连续使用Input的移动和旋转命令,会导致thetas[]数据变化过快,从而引起机械臂的剧烈运动。建议在相邻的实时控制Input命令之间 加上20-50ms左右的延时。例如加入命令 usleep(20000);

//系统在使用thetas[]播放路径规划的插值点时,dawa有加入18ms延时,但在实时控制命令中,考虑到给编程人员提供足够的灵活性,就把这块让编程者来处理(假如程序员使用该库时,输入按键的键盘本来就有基于操作系统的连续按键延迟,那么dawa库自身加上延迟的话,就会造成延迟过大)。

表一:

key

key的字母表达

功能定义

119

w

绕末端x轴正转

115

s

绕末端x轴反转

97

a

绕末端y轴反转

100

d

绕末端y轴正转

122

z

绕末端z轴正转

120

x

绕末端z轴正转

117

u

沿末端y轴反方向移动

106

j

沿末端y轴正方向移动

104

h

沿末端x轴反方向移动

107

k

沿末端x轴正方向移动

110

n

沿末端z轴正方向移动

109

m

沿末端z轴反方向移动

114

r

通过容器selected_points所存储的点来规划折线路径并运行

112

p(小写)

选当前点压入规划路径selected_points里面

80

P(大写)

选当前点压入一个叫做special_points的vector里面

61

=

路径暂停命令

113

q

都清空路径容器general_path,选好的点selected_points和special_points。夹爪信息标记也一起清空。

1000

回到各轴都是0的姿态。

  • void moveTo(double posture[4][4]);

//让末端插值移动到位姿posture;

//表一中的‘u’ 、‘j’等键实时控制按钮每使用一次,机械臂末端只移动一个插值距离(interpolation_dis),这些键值的意义,是在实时控制中,用户在场景可视的情况下,一边拿着按键,一边控制着机械臂朝一个大约的方向运动或者转动,这时候,他每按一次按钮就前进几毫米,如果他一直按着按钮不松开,机械臂就可以朝着既定方向一直前进。直到到达目标,为了精确的到达目标,可以使用后面将介绍的

set_rc_interpolation_dis

命令来调节插值距离,把它调节到很小,那么就可以在操作人员可视的情况下,不断微调,很精确的接近目标。

//与moveTo命令不同,moveTo命令,可以是用户在已经有记录或者输入矩阵的情况下,进行的一键“插值直达”的命令方式。

  • void moveTo(my_elm12 pos);

//让末端插值移动到位姿pos,pos是把上面的posture中的前十二位数字依次放入一个

//一维数组里面。上面两条moveTo 指令其实效果是一样的,用户可以根据自己习惯选择使用。

double posture[4][4]=

{

{a,b,c,d},

{e,f,g,h},

{i,j,k,l},

{0,0,0,1},

}

变为一维数组如下:

my_elm12 pos ={a,b,c,d,e,f,g,h,i,j,k,l}

//其中my_elm12的定义是

// my_elm12 = array<double, 12>;

  • void assist_Thread();

//一个辅助计算子线程,需要在main函数中运行作为计算中心启动。

  • double get_thetas(int position);

//获取指定轴角度值 position 取值(0~5)

  • double d1,a1,a2,a3,d4,d6;

//dh参数,因为在构建r6a的实例时,已经设置了,所以不需要改动。

  • double gongjucd =20;

//末端工具长度,可以直接改动。运行中也可以随时改动。

  • vector<my_elm12> general_path,special_points;

//special_points的作用是一个临时容器,假如应用场景中有若干个点是比较特殊常用的,机械臂需要经常回归这些点,那么我们可能随时需要把它们中的若干个列为moveTo的目标,也可能需要随时把其中的点设为路径的规划参考点,此临时容器可以存储下这些点备用。如果用户要在dawa库的基础上开发一个UI,那么图形界面中可以绘制一个柱状容器,形象的显示这些特殊点,然后通过界面编程让最终用户可以用鼠标拖动这些点中的任意一个,到达其他容器。

由于它是public属性,所以,开发者可以使用vector的常规命令来修改其成员,注意校园版本中,该容器大小为6,超出以后,r6a.Input(int('P'))命令就不可以使用了;

  • int PATH_LOOP_TIMES = 3;

//路径循环次数设置,可以直接更改。比如修改循环次数为5次:

r6a. PATH_LOOP_TIMES = 5;

  • void set_rc_interpolation_dis(double interpolation_dis);

//设置实时控制运动中的插值距离,所有的实时控制都是插值路径,所以,这个参数关系到表一中提及的所有实时控制运动。

  • void set_path_interpolation_dis(double interpolation_dis);

//设置规划路径中的插值距离,对应表一中r/114键的路径规划功能。

  • void set_thetas(int position, double value);

//设置单个轴角度值,position 取值(0~5)用来指代某个轴,使用这条命令的风险请参考下一条指令define_axis 的风险提示;

  • void define_axis(double x[6]);

//一次性定义各轴数值(弧度制),使用这一条命令需要注意,thetas[]前十二个数字直接更改为数组x[]的对应值,系统不会照顾到如何将机械臂的各轴角度从当前位置过渡过去,速度和加速度控制,此类控制完全交给下位机来完成(而路径规划和实时控制中,dawa系统是通过插值来防止失控的情况的)。这条命令的意义,是允许机械臂第一次上线时,它可以处于随机位置,机械臂回传当前各轴角度给上位机,从而把机械臂的各轴位置与r6a实例中的位置保持一致。

  • void set_rest_position(my_elm12 pos);

//设置一个路径规划中的rest点,这个点的作用是,当机械臂运行完一条路径后,让机械臂撤回到一个休息(rest)点位,而不是停留路径的末端点上。 在路径循环运行中,运行完路径重复次数,才会回到这个rest点。

//开发者也可以不设置这个点。

  • void shut_down_rest_position(void);

//开发者如果设置了rest点,又想删除它,就可以使用shut_down_rest_position 命令。

  • void set_gripper_status_for_path(int status);

//设置夹爪状态。系统允许 status有 -1,0,1 三个有效值。 这个status本质上是一个标记信息,给开发者提供更多应用上的灵活性。 我们会多次使用r6a.Input(int('p'))选择了一系列点 作为路径规划依据,而当我们希望机械臂运行到某个点的时候 ,能自动向下位机传递一个信息,比如夹爪张开(可以与下位机约定,平时这个值是0,表示夹爪保持原来的状态,-1表示合上夹爪,1表示开启夹爪)。 就需要在这个点位做一个标记,set_gripper_status_for_path就是作这个标记的指令。系统允许开发者在选定某个点以后,在选择下一个点之前,用一条 set_gripper_status_for_path命令,表示将来规划路径运行到当前点的时候,这个预置的status信息可以被记录在某个容器里并立刻变成预置的值,以方便下位机进行夹爪控制。在系统中,status对应的值会被thetas[12]记录并再现,也就是说,当路径运行到这个点的时候,thetas[12]的值会变得和当时set_gripper_status_for_path预置的status一样,它会在路径运行中一直保持这个值(也就是一直“播放”这个值),直到后续的某一个点预置的status值不同,从而改变了它,后面它又会继续保持新的值。直到路径运行完毕,thetas[12]自动置0,不会干扰下一条路径(或者重复运行该路径)的夹爪预置值.

这样用户在编写下位机时,就不需要额外照顾到这块功能的时间点了。 它可以通过接口简单读取thetas[12] 用来控制夹爪开合,事实上上位机只需要把整个thetas[]数组不断的“播放”给下位机就可以了。 这个机制不单可以用于夹爪控制,也可以用于焊枪起弧、开启打磨转子等上下位机的通信内容。

该命令使用方法举例:假如我们有一个途径三个点(A、B、C)的路径规划,在B点让夹爪合上,在C点的时候,夹爪张开。

r6a.moveTo(…); //到达A,也可以使用多个r6a.Input(key))命令来到达A,下同。

r6a.Input(int('p')); //记下A点。

r6a.moveTo(…); //到达B

r6a.Input(int('p')); //记下B点。

r6a.set_gripper_status_for_path(-1); //让系统记住,到B点时,夹爪处于-1状态。

r6a.moveTo(…); //到达C

r6a.Input(int('p')); //记下C点。

r6a.set_gripper_status_for_path(1); //让系统记住,到B点时,夹爪处于1状态。

于是系统记下来,当使用thetas[]播放路径时,到达这个途经点就会让thetas[12]表达出 -1,0,1 中的一个值。

  • void set_path_pause_in_secends(unsigned int timeforpause);

//与上一条命令相似,这条命令也是标记到达某个点以后系统的动作。本条命令标记的是停留时间,以秒为单位。它的设置方法与上一条命令一样,也是跟随在r6a.Input(int('p'))命令后面。它在路径播放时,系统会自动在相应的点停留选点时所预设的时间长度 也就是以秒为单位的timeforpause,因此这个时间数值不需要传给下位机。

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值