11. 机器人力控
11.1. 力传感器配置
1/**
2* @brief 配置力传感器
3* @param [in] company 力传感器厂商,17-坤维科技
4* @param [in] device 设备号,暂不使用,默认为0
5* @param [in] softvesion 软件版本号,暂不使用,默认为0
6* @param [in] bus 设备挂在末端总线位置,暂不使用,默认为0
7* @return 错误码
8*/
9errno_t FT_SetConfig(int company, int device, int softvesion, int bus);
11.2. 获取力传感器配置
1/**
2* @brief 获取力传感器配置
3* @param [in] company 力传感器厂商,待定
4* @param [in] device 设备号,暂不使用,默认为0
5* @param [in] softvesion 软件版本号,暂不使用,默认为0
6* @param [in] bus 设备挂在末端总线位置,暂不使用,默认为0
7* @return 错误码
8*/
9errno_t FT_GetConfig(int *company, int *device, int *softvesion, int *bus);
11.3. 力传感器激活
1/**
2* @brief 力传感器激活
3* @param [in] act 0-复位,1-激活
4* @return 错误码
5*/
6errno_t FT_Activate(uint8_t act);
11.4. 力传感器校零
1/**
2* @brief 力传感器校零
3* @param [in] act 0-去除零点,1-零点矫正
4* @return 错误码
5*/
6errno_t FT_SetZero(uint8_t act);
11.5. 代码示例
1#include <cstdlib>
2#include <iostream>
3#include <stdio.h>
4#include <cstring>
5#include <unistd.h>
6
7#include "FRRobot.h"
8#include "RobotTypes.h"
9
10using namespace std;
11
12int main(void)
13{
14 FRRobot robot; //实例化机器人对象
15 robot.RPC("192.168.58.2"); //与机器人控制器建立通信连接
16
17 int company = 17;
18 int device = 0;
19 int softversion = 0;
20 int bus = 1;
21 int index = 1;
22 int act = 0;
23
24 robot.FT_SetConfig(company, device, softversion, bus);
25 sleep(1);
26 robot.FT_GetConfig(&company, &device, &softversion, &bus);
27 printf("FT config:%d,%d,%d,%d\n", company, device, softversion, bus);
28 sleep(1);
29
30 robot.FT_Activate(act);
31 sleep(1);
32 act = 1;
33 robot.FT_Activate(act);
34 sleep(1);
35
36 robot.SetLoadWeight(0.0);
37 sleep(1);
38 DescTran coord;
39 memset(&coord, 0, sizeof(DescTran));
40 robot.SetLoadCoord(&coord);
41 sleep(1);
42 robot.FT_SetZero(0);
43 sleep(1);
44
45 ForceTorque ft;
46 memset(&ft, 0, sizeof(ForceTorque));
47 robot.FT_GetForceTorqueOrigin(&ft);
48 printf("ft origin:%f,%f,%f,%f,%f,%f\n", ft.fx,ft.fy,ft.fz,ft.tx,ft.ty,ft.tz);
49 robot.FT_SetZero(1);
50 sleep(1);
51 memset(&ft, 0, sizeof(ForceTorque));
52 printf("ft rcs:%f,%f,%f,%f,%f,%f\n",ft.fx,ft.fy,ft.fz,ft.tx,ft.ty,ft.tz);
53
54 return 0;
55}
11.6. 设置力传感器参考坐标系
1/**
2* @brief 设置力传感器参考坐标系
3* @param [in] ref 0-工具坐标系,1-基坐标系
4* @return 错误码
5*/
6errno_t FT_SetRCS(uint8_t ref);
11.7. 负载重量辨识记录
1/**
2* @brief 负载重量辨识记录
3* @param [in] id 传感器坐标系编号,范围[1~14]
4* @return 错误码
5*/
6errno_t FT_PdIdenRecord(int id);
11.8. 负载重量辨识计算
1/**
2* @brief 负载重量辨识计算
3* @param [out] weight 负载重量,单位kg
4* @return 错误码
5*/
6errno_t FT_PdIdenCompute(float *weight);
11.9. 负载质心辨识记录
1/**
2* @brief 负载质心辨识记录
3* @param [in] id 传感器坐标系编号,范围[1~14]
4* @param [in] index 点编号,范围[1~3]
5* @return 错误码
6*/
7errno_t FT_PdCogIdenRecord(int id, int index);
11.10. 负载质心辨识计算
1/**
2* @brief 负载质心辨识计算
3* @param [out] cog 负载质心,单位mm
4* @return 错误码
5*/
6errno_t FT_PdCogIdenCompute(DescTran *cog);
11.11. 代码示例
1#include <cstdlib>
2#include <iostream>
3#include <stdio.h>
4#include <cstring>
5#include <unistd.h>
6#include "FRRobot.h"
7#include "RobotTypes.h"
8
9using namespace std;
10
11int main(void)
12{
13 FRRobot robot; //实例化机器人对象
14 robot.RPC("192.168.58.2"); //与机器人控制器建立通信连接
15
16 float weight;
17
18 DescPose tcoord, desc_p1, desc_p2, desc_p3;
19 memset(&tcoord, 0, sizeof(DescPose));
20 memset(&desc_p1, 0, sizeof(DescPose));
21 memset(&desc_p2, 0, sizeof(DescPose));
22 memset(&desc_p3, 0, sizeof(DescPose));
23
24 robot.FT_SetRCS(0);
25 sleep(1);
26
27 tcoord.tran.z = 35.0;
28 robot.SetToolCoord(10, &tcoord, 1, 0);
29 sleep(1);
30 robot.FT_PdIdenRecord(10);
31 sleep(1);
32 robot.FT_PdIdenCompute(&weight);
33 printf("payload weight:%f\n", weight);
34
35 desc_p1.tran.x = -160.619;
36 desc_p1.tran.y = -586.138;
37 desc_p1.tran.z = 384.988;
38 desc_p1.rpy.rx = -170.166;
39 desc_p1.rpy.ry = -44.782;
40 desc_p1.rpy.rz = 169.295;
41
42 desc_p2.tran.x = -87.615;
43 desc_p2.tran.y = -606.209;
44 desc_p2.tran.z = 556.119;
45 desc_p2.rpy.rx = -102.495;
46 desc_p2.rpy.ry = 10.118;
47 desc_p2.rpy.rz = 178.985;
48
49 desc_p3.tran.x = 41.479;
50 desc_p3.tran.y = -557.243;
51 desc_p3.tran.z = 484.407;
52 desc_p3.rpy.rx = -125.174;
53 desc_p3.rpy.ry = 46.995;
54 desc_p3.rpy.rz = -132.165;
55
56 robot.MoveCart(&desc_p1, 9, 0, 100.0, 100.0, 100.0, -1.0, -1);
57 sleep(1);
58 robot.FT_PdCogIdenRecord(10, 1);
59 robot.MoveCart(&desc_p2, 9, 0, 100.0, 100.0, 100.0, -1.0, -1);
60 sleep(1);
61 robot.FT_PdCogIdenRecord(10, 2);
62 robot.MoveCart(&desc_p3, 9, 0, 100.0, 100.0, 100.0, -1.0, -1);
63 sleep(1);
64 robot.FT_PdCogIdenRecord(10, 3);
65 sleep(1);
66 DescTran cog;
67 memset(&cog, 0, sizeof(DescTran));
68 robot.FT_PdCogIdenCompute(&cog);
69 printf("cog:%f,%f,%f\n",cog.x, cog.y, cog.z);
70
71 return 0;
72}
11.12. 获取参考坐标系下力/扭矩数据
1/**
2* @brief 获取参考坐标系下力/扭矩数据
3* @param [out] ft 力/扭矩,fx,fy,fz,tx,ty,tz
4* @return 错误码
5*/
6errno_t FT_GetForceTorqueRCS(ForceTorque *ft);
11.13. 获取力传感器原始力/扭矩数据
1/**
2* @brief 获取力传感器原始力/扭矩数据
3* @param [out] ft 力/扭矩,fx,fy,fz,tx,ty,tz
4* @return 错误码
5*/
6errno_t FT_GetForceTorqueOrigin(ForceTorque *ft);
11.14. 碰撞守护
1/**
2* @brief 碰撞守护
3* @param [in] flag 0-关闭碰撞守护,1-开启碰撞守护
4* @param [in] sensor_id 力传感器编号
5* @param [in] select 选择六个自由度是否检测碰撞,0-不检测,1-检测
6* @param [in] ft 碰撞力/扭矩,fx,fy,fz,tx,ty,tz
7* @param [in] max_threshold 最大阈值
8* @param [in] min_threshold 最小阈值
9* @note 力/扭矩检测范围:(ft-min_threshold, ft+max_threshold)
10* @return 错误码
11*/
12errno_t FT_Guard(uint8_t flag, int sensor_id, uint8_t select[6], ForceTorque *ft, float max_threshold[6], float min_threshold[6]);
11.15. 代码示例
1#include <cstdlib>
2#include <iostream>
3#include <stdio.h>
4#include <cstring>
5#include <unistd.h>
6#include "FRRobot.h"
7#include "RobotTypes.h"
8
9using namespace std;
10
11int main(void)
12{
13 FRRobot robot; //实例化机器人对象
14 robot.RPC("192.168.58.2"); //与机器人控制器建立通信连接
15
16 uint8_t flag = 1;
17 uint8_t sensor_id = 1;
18 uint8_t select[6] = {1,1,1,1,1,1};
19 float max_threshold[6] = {10.0,10.0,10.0,10.0,10.0,10.0};
20 float min_threshold[6] = {5.0,5.0,5.0,5.0,5.0,5.0};
21
22 ForceTorque ft;
23 DescPose desc_p1, desc_p2, desc_p3;
24 memset(&ft, 0, sizeof(ForceTorque));
25 memset(&desc_p1, 0, sizeof(DescPose));
26 memset(&desc_p2, 0, sizeof(DescPose));
27 memset(&desc_p3, 0, sizeof(DescPose));
28
29 desc_p1.tran.x = -160.619;
30 desc_p1.tran.y = -586.138;
31 desc_p1.tran.z = 384.988;
32 desc_p1.rpy.rx = -170.166;
33 desc_p1.rpy.ry = -44.782;
34 desc_p1.rpy.rz = 169.295;
35
36 desc_p2.tran.x = -87.615;
37 desc_p2.tran.y = -606.209;
38 desc_p2.tran.z = 556.119;
39 desc_p2.rpy.rx = -102.495;
40 desc_p2.rpy.ry = 10.118;
41 desc_p2.rpy.rz = 178.985;
42
43 desc_p3.tran.x = 41.479;
44 desc_p3.tran.y = -557.243;
45 desc_p3.tran.z = 484.407;
46 desc_p3.rpy.rx = -125.174;
47 desc_p3.rpy.ry = 46.995;
48 desc_p3.rpy.rz = -132.165;
49
50 robot.FT_Guard(flag, sensor_id, select, &ft, max_threshold, min_threshold);
51 robot.MoveCart(&desc_p1,9,0,100.0,100.0,100.0,-1.0,-1);
52 robot.MoveCart(&desc_p2,9,0,100.0,100.0,100.0,-1.0,-1);
53 robot.MoveCart(&desc_p3,9,0,100.0,100.0,100.0,-1.0,-1);
54 flag = 0;
55 robot.FT_Guard(flag, sensor_id, select, &ft, max_threshold, min_threshold);
56
57 return 0;
58}
11.16. 恒力控制
1/**
2* @brief 恒力控制
3* @param [in] flag 0-关闭恒力控制,1-开启恒力控制
4* @param [in] sensor_id 力传感器编号
5* @param [in] select 选择六个自由度是否检测碰撞,0-不检测,1-检测
6* @param [in] ft 碰撞力/扭矩,fx,fy,fz,tx,ty,tz
7* @param [in] ft_pid 力pid参数,力矩pid参数
8* @param [in] adj_sign 自适应启停控制,0-关闭,1-开启
9* @param [in] ILC_sign ILC启停控制, 0-停止,1-训练,2-实操
10* @param [in] 最大调整距离,单位mm
11* @param [in] 最大调整角度,单位deg
12* @return 错误码
13*/
14errno_t FT_Control(uint8_t flag, int sensor_id, uint8_t select[6], ForceTorque *ft, float ft_pid[6], uint8_t adj_sign, uint8_t ILC_sign, float max_dis, float max_ang);
11.17. 代码示例
1#include <cstdlib>
2#include <iostream>
3#include <stdio.h>
4#include <cstring>
5#include <unistd.h>
6#include "FRRobot.h"
7#include "RobotTypes.h"
8
9using namespace std;
10
11int main(void)
12{
13 FRRobot robot; //实例化机器人对象
14 robot.RPC("192.168.58.2"); //与机器人控制器建立通信连接
15
16 uint8_t flag = 1;
17 uint8_t sensor_id = 1;
18 uint8_t select[6] = {0,0,1,0,0,0};
19 float ft_pid[6] = {0.0005,0.0,0.0,0.0,0.0,0.0};
20 uint8_t adj_sign = 0;
21 uint8_t ILC_sign = 0;
22 float max_dis = 100.0;
23 float max_ang = 0.0;
24
25 ForceTorque ft;
26 DescPose desc_p1, desc_p2, offset_pos;
27 JointPos j1,j2;
28 ExaxisPos epos;
29 memset(&ft, 0, sizeof(ForceTorque));
30 memset(&desc_p1, 0, sizeof(DescPose));
31 memset(&desc_p2, 0, sizeof(DescPose));
32 memset(&offset_pos, 0, sizeof(DescPose));
33 memset(&epos, 0, sizeof(ExaxisPos));
34 memset(&j1, 0, sizeof(JointPos));
35 memset(&j2, 0, sizeof(JointPos));
36
37 j1 = {-68.987,-96.414,-111.45,-61.105,92.884,11.089};
38 j2 = {-107.596,-109.154,-104.735,-56.176,90.739,11.091};
39
40 desc_p1.tran.x = 62.795;
41 desc_p1.tran.y = -511.979;
42 desc_p1.tran.z = 291.697;
43 desc_p1.rpy.rx = -179.545;
44 desc_p1.rpy.ry = 3.027;
45 desc_p1.rpy.rz = -170.039;
46
47 desc_p2.tran.x = -294.768;
48 desc_p2.tran.y = -503.708;
49 desc_p2.tran.z = 233.158;
50 desc_p2.rpy.rx = 179.799;
51 desc_p2.rpy.ry = 0.713;
52 desc_p2.rpy.rz = 151.309;
53
54 ft.fz = -10.0;
55
56 robot.MoveJ(&j1,&desc_p1,9,0,100.0,180.0,100.0,&epos,-1.0,0,&offset_pos);
57 robot.FT_Control(flag, sensor_id, select, &ft, ft_pid, adj_sign, ILC_sign, max_dis, max_ang);
58 robot.MoveL(&j2,&desc_p2,9,0,100.0,180.0,20.0,-1.0,&epos,0,0,&offset_pos);
59 flag = 0;
60 robot.FT_Control(flag, sensor_id, select, &ft, ft_pid, adj_sign, ILC_sign, max_dis, max_ang);
61
62 return 0;
63}
11.18. 螺旋线探索
1/**
2* @brief 螺旋线探索
3* @param [in] rcs 参考坐标系,0-工具坐标系,1-基坐标系
4* @param [in] dr 每圈半径进给量
5* @param [in] ft 力/扭矩阈值,fx,fy,fz,tx,ty,tz,范围[0~100]
6* @param [in] max_t_ms 最大探索时间,单位ms
7* @param [in] max_vel 最大线速度,单位mm/s
8* @return 错误码
9*/
10errno_t FT_SpiralSearch(int rcs, float dr, float ft, float max_t_ms, float max_vel);
11.19. 旋转插入
1/**
2* @brief 旋转插入
3* @param [in] rcs 参考坐标系,0-工具坐标系,1-基坐标系
4* @param [in] angVelRot 旋转角速度,单位deg/s
5* @param [in] ft 力/扭矩阈值,fx,fy,fz,tx,ty,tz,范围[0~100]
6* @param [in] max_angle 最大旋转角度,单位deg
7* @param [in] orn 力/扭矩方向,1-沿z轴方向,2-绕z轴方向
8* @param [in] max_angAcc 最大旋转加速度,单位deg/s^2,暂不使用,默认为0
9* @param [in] rotorn 旋转方向,1-顺时针,2-逆时针
10* @return 错误码
11*/
12errno_t FT_RotInsertion(int rcs, float angVelRot, float ft, float max_angle, uint8_t orn, float max_angAcc, uint8_t rotorn);
11.20. 直线插入
1/**
2* @brief 直线插入
3* @param [in] rcs 参考坐标系,0-工具坐标系,1-基坐标系
4* @param [in] ft 力/扭矩阈值,fx,fy,fz,tx,ty,tz,范围[0~100]
5* @param [in] lin_v 直线速度,单位mm/s
6* @param [in] lin_a 直线加速度,单位mm/s^2,暂不使用
7* @param [in] max_dis 最大插入距离,单位mm
8* @param [in] linorn 插入方向,0-负方向,1-正方向
9* @return 错误码
10*/
11errno_t FT_LinInsertion(int rcs, float ft, float lin_v, float lin_a, float max_dis, uint8_t linorn);
11.21. 代码示例
1#include <cstdlib>
2#include <iostream>
3#include <stdio.h>
4#include <cstring>
5#include <unistd.h>
6#include "FRRobot.h"
7#include "RobotTypes.h"
8
9using namespace std;
10
11int main(void)
12{
13 FRRobot robot; //实例化机器人对象
14 robot.RPC("192.168.58.2"); //与机器人控制器建立通信连接
15
16 //恒力参数
17 uint8_t status = 1; //恒力控制开启标志,0-关,1-开
18 int sensor_num = 1; //力传感器编号
19 float gain[6] = {0.0001,0.0,0.0,0.0,0.0,0.0}; //最大阈值
20 uint8_t adj_sign = 0; //自适应启停状态,0-关闭,1-开启
21 uint8_t ILC_sign = 0; //ILC控制启停状态,0-停止,1-训练,2-实操
22 float max_dis = 100.0; //最大调整距离
23 float max_ang = 5.0; //最大调整角度
24
25 ForceTorque ft;
26 memset(&ft, 0, sizeof(ForceTorque));
27
28 //螺旋线探索参数
29 int rcs = 0; //参考坐标系,0-工具坐标系,1-基坐标系
30 float dr = 0.7; //每圈半径进给量,单位mm
31 float fFinish = 1.0; //力或力矩阈值(0~100),单位N或Nm
32 float t = 60000.0; //最大探索时间,单位ms
33 float vmax = 3.0; //线速度最大值,单位mm/s
34
35 //直线插入参数
36 float force_goal = 20.0; //力或力矩阈值(0~100),单位N或Nm
37 float lin_v = 0.0; //直线速度,单位mm/s
38 float lin_a = 0.0; //直线加速度,单位mm/s^2,暂不使用
39 float disMax = 100.0; //最大插入距离,单位mm
40 uint8_t linorn = 1; //插入方向,1-正方向,2-负方向
41
42 //旋转插入参数
43 float angVelRot = 2.0; //旋转角速度,单位°/s
44 float forceInsertion = 1.0; //力或力矩阈值(0~100),单位N或Nm
45 int angleMax= 45; //最大旋转角度,单位°
46 uint8_t orn = 1; //力的方向,1-fz,2-mz
47 float angAccmax = 0.0; //最大旋转角加速度,单位°/s^2,暂不使用
48 uint8_t rotorn = 1; //旋转方向,1-顺时针,2-逆时针
49
50 uint8_t select1[6] = {0,0,1,1,1,0}; //六个自由度选择[fx,fy,fz,mx,my,mz],0-不生效,1-生效
51 ft.fz = -10.0;
52 robot.FT_Control(status,sensor_num,select1,&ft,gain,adj_sign,ILC_sign,max_dis,max_ang);
53 robot.FT_SpiralSearch(rcs,dr,fFinish,t,vmax);
54 status = 0;
55 robot.FT_Control(status,sensor_num,select1,&ft,gain,adj_sign,ILC_sign,max_dis,max_ang);
56
57 uint8_t select2[6] = {1,1,1,0,0,0}; //六个自由度选择[fx,fy,fz,mx,my,mz],0-不生效,1-生效
58 gain[0] = 0.00005;
59 ft.fz = -30.0;
60 status = 1;
61 robot.FT_Control(status,sensor_num,select2,&ft,gain,adj_sign,ILC_sign,max_dis,max_ang);
62 robot.FT_LinInsertion(rcs,force_goal,lin_v,lin_a,disMax,linorn);
63 status = 0;
64 robot.FT_Control(status,sensor_num,select2,&ft,gain,adj_sign,ILC_sign,max_dis,max_ang);
65
66 uint8_t select3[6] = {0,0,1,1,1,0}; //六个自由度选择[fx,fy,fz,mx,my,mz],0-不生效,1-生效
67 ft.fz = -10.0;
68 gain[0] = 0.0001;
69 status = 1;
70 robot.FT_Control(status,sensor_num,select3,&ft,gain,adj_sign,ILC_sign,max_dis,max_ang);
71 robot.FT_RotInsertion(rcs,angVelRot,forceInsertion,angleMax,orn,angAccmax,rotorn);
72 status = 0;
73 robot.FT_Control(status,sensor_num,select3,&ft,gain,adj_sign,ILC_sign,max_dis,max_ang);
74
75 uint8_t select4[6] = {1,1,1,0,0,0}; //六个自由度选择[fx,fy,fz,mx,my,mz],0-不生效,1-生效
76 ft.fz = -30.0;
77 status = 1;
78 robot.FT_Control(status,sensor_num,select4,&ft,gain,adj_sign,ILC_sign,max_dis,max_ang);
79 robot.FT_LinInsertion(rcs,force_goal,lin_v,lin_a,disMax,linorn);
80 status = 0;
81 robot.FT_Control(status,sensor_num,select4,&ft,gain,adj_sign,ILC_sign,max_dis,max_ang);
82
83 return 0;
84}
11.22. 表面定位
1/**
2* @brief 表面定位
3* @param [in] rcs 参考坐标系,0-工具坐标系,1-基坐标系
4* @param [in] dir 移动方向,1-正方向,2-负方向
5* @param [in] axis 移动轴,1-x轴,2-y轴,3-z轴
6* @param [in] lin_v 探索直线速度,单位mm/s
7* @param [in] lin_a 探索直线加速度,单位mm/s^2,暂不使用,默认为0
8* @param [in] max_dis 最大探索距离,单位mm
9* @param [in] ft 动作终止力/扭矩阈值,fx,fy,fz,tx,ty,tz
10* @return 错误码
11*/
12errno_t FT_FindSurface(int rcs, uint8_t dir, uint8_t axis, float lin_v, float lin_a, float max_dis, float ft);
11.23. 计算中间平面位置开始
1/**
2* @brief 计算中间平面位置开始
3* @return 错误码
4*/
5errno_t FT_CalCenterStart();
11.24. 计算中间平面位置结束
1/**
2* @brief 计算中间平面位置结束
3* @param [out] pos 中间平面位姿
4* @return 错误码
5*/
6errno_t FT_CalCenterEnd(DescPose *pos);
11.25. 代码示例
1#include <cstdlib>
2#include <iostream>
3#include <stdio.h>
4#include <cstring>
5#include <unistd.h>
6#include "FRRobot.h"
7#include "RobotTypes.h"
8
9using namespace std;
10
11int main(void)
12{
13 FRRobot robot; //实例化机器人对象
14 robot.RPC("192.168.58.2"); //与机器人控制器建立通信连接
15
16 int rcs = 0;
17 uint8_t dir = 1;
18 uint8_t axis = 1;
19 float lin_v = 3.0;
20 float lin_a = 0.0;
21 float maxdis = 50.0;
22 float ft_goal = 2.0;
23
24 DescPose desc_pos, xcenter, ycenter;
25 ForceTorque ft;
26 memset(&desc_pos, 0, sizeof(DescPose));
27 memset(&xcenter, 0, sizeof(DescPose));
28 memset(&ycenter, 0, sizeof(DescPose));
29 memset(&ft, 0, sizeof(ForceTorque));
30
31 desc_pos.tran.x = -230.959;
32 desc_pos.tran.y = -364.017;
33 desc_pos.tran.z = 217.5;
34 desc_pos.rpy.rx = -179.004;
35 desc_pos.rpy.ry = 0.002;
36 desc_pos.rpy.rz = 89.999;
37
38 ft.fx = -2.0;
39
40 robot.MoveCart(&desc_pos, 9,0,100.0,100.0,100.0,-1.0,-1);
41
42 robot.FT_CalCenterStart();
43 robot.FT_FindSurface(rcs, dir, axis, lin_v, lin_a, maxdis, ft_goal);
44 robot.MoveCart(&desc_pos, 9,0,100.0,100.0,100.0,-1.0,-1);
45 robot.WaitMs(1000);
46
47 dir = 2;
48 robot.FT_FindSurface(rcs, dir, axis, lin_v, lin_a, maxdis, ft_goal);
49 robot.FT_CalCenterEnd(&xcenter);
50 printf("xcenter:%f,%f,%f,%f,%f,%f\n",xcenter.tran.x,xcenter.tran.y,xcenter.tran.z,xcenter.rpy.rx,xcenter.rpy.ry,xcenter.rpy.rz);
51 robot.MoveCart(&xcenter, 9,0,60.0,50.0,50.0,-1.0,-1);
52
53 robot.FT_CalCenterStart();
54 dir = 1;
55 axis = 2;
56 lin_v = 6.0;
57 maxdis = 150.0;
58 robot.FT_FindSurface(rcs, dir, axis, lin_v, lin_a, maxdis, ft_goal);
59 robot.MoveCart(&desc_pos, 9,0,100.0,100.0,100.0,-1.0,-1);
60 robot.WaitMs(1000);
61
62 dir = 2;
63 robot.FT_FindSurface(rcs, dir, axis, lin_v, lin_a, maxdis, ft_goal);
64 robot.FT_CalCenterEnd(&ycenter);
65 printf("ycenter:%f,%f,%f,%f,%f,%f\n",ycenter.tran.x,ycenter.tran.y,ycenter.tran.z,ycenter.rpy.rx,ycenter.rpy.ry,ycenter.rpy.rz);
66 robot.MoveCart(&ycenter, 9,0,60.0,50.0,50.0,0.0,-1);
67
68 return 0;
69}
11.26. 柔顺控制开启
1/**
2* @brief 柔顺控制开启
3* @param [in] p 位置调节系数或柔顺系数
4* @param [in] force 柔顺开启力阈值,单位N
5* @return 错误码
6*/
7errno_t FT_ComplianceStart(float p, float force);
11.27. 柔顺控制关闭
1/**
2* @brief 柔顺控制关闭
3* @return 错误码
4*/
5errno_t FT_ComplianceStop();
11.28. 负载辨识初始化
1/**
2 * @brief 负载辨识初始化
3 * @return 错误码
4 */
5errno_t LoadIdentifyDynFilterInit();
11.29. 负载辨识初始化
1/**
2 * @brief 负载辨识初始化
3 * @return 错误码
4 */
5errno_t LoadIdentifyDynVarInit();
11.30. 负载辨识主程序
1/**
2 * @brief 负载辨识主程序
3 * @param [in] joint_torque 关节扭矩
4 * @param [in] joint_pos 关节位置
5 * @param [in] t 采样周期
6 * @return 错误码
7 */
8errno_t LoadIdentifyMain(double joint_torque[6], double joint_pos[6], double t);
11.31. 获取负载辨识结果
1/**
2 * @brief 获取负载辨识结果
3 * @param [in] gain
4 * @param [out] weight 负载重量
5 * @param [out] cog 负载质心
6 * @return 错误码
7 */
8errno_t LoadIdentifyGetResult(double gain[12], double *weight, DescTran *cog);
11.32. 传动带启动、停止
1/**
2 * @brief 传动带启动、停止
3 * @param [in] status 状态,1-启动,0-停止
4 * @return 错误码
5 */
6errno_t ConveyorStartEnd(uint8_t status);
11.33. 记录IO检测点
1/**
2 * @brief 记录IO检测点
3 * @return 错误码
4 */
5errno_t ConveyorPointIORecord();
11.34. 记录A点
1/**
2 * @brief 记录A点
3 * @return 错误码
4 */
5errno_t ConveyorPointARecord();
11.35. 记录参考点
1/**
2 * @brief 记录参考点
3 * @return 错误码
4 */
5errno_t ConveyorRefPointRecord();
11.36. 记录B点
1/**
2 * @brief 记录B点
3 * @return 错误码
4 */
5errno_t ConveyorPointBRecord();
11.37. 传送带工件IO检测
1/**
2 * @brief 传送带工件IO检测
3 * @param [in] max_t 最大检测时间,单位ms
4 * @return 错误码
5 */
6errno_t ConveyorIODetect(int max_t);
11.38. 获取物体当前位置
1/**
2 * @brief 获取物体当前位置
3 * @param [in] mode
4 * @return 错误码
5 */
6errno_t ConveyorGetTrackData(int mode);
11.39. 传动带跟踪开始
1/**
2 * @brief 传动带跟踪开始
3 * @param [in] status 状态,1-启动,0-停止
4 * @return 错误码
5 */
6errno_t ConveyorTrackStart(uint8_t status);
11.40. 传动带跟踪停止
1/**
2 * @brief 传动带跟踪停止
3 * @return 错误码
4 */
5errno_t ConveyorTrackEnd();
11.41. 传动带参数配置
在 C++SDK-v2.1.2.0 版本发生变更.
1 /**
2 * @brief 传动带参数配置
3 * @param [in] para[0] 编码器通道 1~2
4 * @param [in] para[1] 编码器转一圈的脉冲数
5 * @param [in] para[2] 编码器转一圈传送带行走距离
6 * @param [in] para[3] 工件坐标系编号 针对跟踪运动功能选择工件坐标系编号,跟踪抓取、TPD跟踪设为0
7 * @param [in] para[4] 是否配视觉 0 不配 1 配
8 * @param [in] para[5] 速度比 针对传送带跟踪抓取选项(1-100) 其他选项默认为1
9 * @return 错误码
10 */
11errno_t ConveyorSetParam(float param[5]);
11.42. 传动带抓取点补偿
在 C++SDK-v2.1.2.0 版本发生变更.
1 /**
2 * @brief 传动带抓取点补偿
3 * @param [in] cmp 补偿位置 double[3]{x, y, z}
4 * @return 错误码
5 */
6errno_t ConveyorCatchPointComp(double cmp[3]);
11.43. 直线运动
1/**
2 * @brief 直线运动
3 * @param [in] status 状态,1-启动,0-停止
4 * @return 错误码
5 */
6errno_t TrackMoveL(char name[32], int tool, int wobj, float vel, float acc, float ovl, float blendR, uint8_t flag, uint8_t type);
11.44. 获取SSH公钥
1/**
2 * @brief 获取SSH公钥
3 * @param [out] keygen 公钥
4 * @return 错误码
5 */
6errno_t GetSSHKeygen(char keygen[1024]);
11.45. 下发SCP指令
1/**
2 * @brief 下发SCP指令
3 * @param [in] mode 0-上传(上位机->控制器),1-下载(控制器->上位机)
4 * @param [in] sshname 上位机用户名
5 * @param [in] sship 上位机ip地址
6 * @param [in] usr_file_url 上位机文件路径
7 * @param [in] robot_file_url 机器人控制器文件路径
8 * @return 错误码
9 */
10errno_t SetSSHScpCmd(int mode, char sshname[32], char sship[32], char usr_file_url[128], char robot_file_url[128]);
11.46. 计算指定路径下文件的MD5值
1/**
2 * @brief 计算指定路径下文件的MD5值
3 * @param [in] file_path 文件路径包含文件名,默认Traj文件夹路径为:"/fruser/traj/",如"/fruser/traj/trajHelix_aima_1.txt"
4 * @param [out] md5 文件MD5值
5 * @return 错误码
6 */
7errno_t ComputeFileMD5(char file_path[256], char md5[256]);
11.47. 获取机器人急停状态
1/**
2 * @brief 获取机器人急停状态
3 * @param [out] state 急停状态,0-非急停,1-急停
4 * @return 错误码
5 */
6errno_t GetRobotEmergencyStopState(uint8_t *state);
11.48. 获取SDK与机器人的通讯状态
1/**
2 * @brief 获取SDK与机器人的通讯状态
3 * @param [out] state 通讯状态,0-通讯正常,1-通讯异常
4 */
5errno_t GetSDKComState(int *state);
11.49. 获取安全停止信号
1/**
2 * @brief 获取安全停止信号
3 * @param [out] si0_state 安全停止信号SI0,0-无效,1-有效
4 * @param [out] si1_state 安全停止信号SI1,0-无效,1-有效
5 */
6errno_t GetSafetyStopState(uint8_t *si0_state, uint8_t *si1_state);
11.50. 代码示例
1#include <cstdlib>
2#include <iostream>
3#include <stdio.h>
4#include <cstring>
5#include <unistd.h>
6#include "FRRobot.h"
7#include "RobotTypes.h"
8
9using namespace std;
10
11int main(void)
12{
13 FRRobot robot; //实例化机器人对象
14 robot.RPC("192.168.58.2"); //与机器人控制器建立通信连接
15
16 uint8_t flag = 1;
17 int sensor_id = 1;
18 uint8_t select[6] = {1,1,1,0,0,0};
19 float ft_pid[6] = {0.0005,0.0,0.0,0.0,0.0,0.0};
20 uint8_t adj_sign = 0;
21 uint8_t ILC_sign = 0;
22 float max_dis = 100.0;
23 float max_ang = 0.0;
24
25 ForceTorque ft;
26 DescPose desc_p1, desc_p2, offset_pos;
27 ExaxisPos epos;
28 JointPos j1, j2;
29 memset(&ft, 0, sizeof(ForceTorque));
30 memset(&desc_p1, 0, sizeof(DescPose));
31 memset(&desc_p2, 0, sizeof(DescPose));
32 memset(&offset_pos, 0, sizeof(DescPose));
33 memset(&j1, 0, sizeof(JointPos));
34 memset(&j2, 0, sizeof(JointPos));
35 memset(&epos, 0, sizeof(ExaxisPos));
36
37 j1 = {-105.3,-68.0,-127.9,-75.5,90.8,77.8};
38 j2 = {-105.3,-97.9,-101.5,-70.3,90.8,77.8};
39
40 desc_p1.tran.x = -208.9;
41 desc_p1.tran.y = -274.5;
42 desc_p1.tran.z = 334.6;
43 desc_p1.rpy.rx = 178.8;
44 desc_p1.rpy.ry = -1.3;
45 desc_p1.rpy.rz = 86.7;
46
47 desc_p2.tran.x = -264.8;
48 desc_p2.tran.y = -480.5;
49 desc_p2.tran.z = 341.8;
50 desc_p2.rpy.rx = 179.2;
51 desc_p2.rpy.ry = 0.3;
52 desc_p2.rpy.rz = 86.7;
53
54 ft.fx = -10.0;
55 ft.fy = -10.0;
56 ft.fz = -10.0;
57 robot.FT_Control(flag, sensor_id, select, &ft, ft_pid, adj_sign, ILC_sign, max_dis, max_ang);
58 float p = 0.00005;
59 float force = 30.0;
60 robot.FT_ComplianceStart(p, force);
61 int count = 15;
62 while (count)
63 {
64 robot.MoveL(&j1,&desc_p1,9,0,100.0,180.0,100.0,-1.0,&epos,0,1,&offset_pos);
65 robot.MoveL(&j2,&desc_p2,9,0,100.0,180.0,100.0,-1.0,&epos,0,0,&offset_pos);
66 count -= 1;
67 }
68 robot.FT_ComplianceStop();
69 flag = 0;
70 robot.FT_Control(flag, sensor_id, select, &ft, ft_pid, adj_sign, ILC_sign, max_dis, max_ang);
71
72 return 0;
73}
11.51. 代码示例
在 C++SDK-v2.1.2.0 版本加入.
1#include "libfairino/robot.h"
2
3//如果使用Windows,包含下面的头文件
4#include <string.h>
5#include <windows.h>
6//如果使用linux,包含下面的头文件
7/*
8#include <cstdlib>
9#include <iostream>
10#include <stdio.h>
11#include <cstring>
12#include <unistd.h>
13*/
14#include <chrono>
15#include <thread>
16#include <string>
17
18using namespace std;
19
20int main(void)
21{
22 FRRobot robot;
23 robot.RPC("192.168.58.2");
24
25 int retval = 0;
26
27 retval = robot.LoadIdentifyDynFilterInit();
28 printf("LoadIdentifyDynFilterInit retval is: %d \n", retval);
29
30 retval = robot.LoadIdentifyDynVarInit();
31 printf("LoadIdentifyDynVarInit retval is: %d \n", retval);
32
33 double joint_toq[6] = {0};
34 double joint_pos[6] = {0};
35 retval = robot.LoadIdentifyMain(joint_toq, joint_pos,1);
36 printf("LoadIdentifyMain retval is: %d \n", retval);
37
38 double gain[12] = {0};
39 double weight = 0;
40 DescTran load_pos;
41 memset(&load_pos, 0, sizeof(DescTran));
42 retval = robot.LoadIdentifyGetResult(gain, &weight, &load_pos);
43 printf("LoadIdentifyGetResult retval is: %d \n", retval);
44 printf("weight is: %f, load pose is: %f, %f, %f\n", weight, load_pos.x, load_pos.y, load_pos.z);
45
46 retval = robot.WaitMs(10);
47 printf("WaitMs retval is: %d \n", retval);
48}
11.52. 代码示例
在 C++SDK-v2.1.2.0 版本加入.
1#include "libfairino/robot.h"
2
3//如果使用Windows,包含下面的头文件
4#include <string.h>
5#include <windows.h>
6//如果使用linux,包含下面的头文件
7/*
8#include <cstdlib>
9#include <iostream>
10#include <stdio.h>
11#include <cstring>
12#include <unistd.h>
13*/
14#include <chrono>
15#include <thread>
16#include <string>
17
18using namespace std;
19
20int main(void)
21{
22 FRRobot robot;
23 robot.RPC("192.168.58.2");
24
25 int retval = 0;
26
27 retval = robot.ConveyorStartEnd(1);
28 printf("ConveyorStartEnd retval is: %d\n", retval);
29
30 retval = robot.ConveyorPointIORecord();
31 printf("ConveyorPointIORecord retval is: %d\n", retval);
32
33 retval = robot.ConveyorPointARecord();
34 printf("ConveyorPointARecord retval is: %d\n", retval);
35
36 retval = robot.ConveyorRefPointRecord();
37 printf("ConveyorRefPointRecord retval is: %d\n", retval);
38
39 retval = robot.ConveyorPointBRecord();
40 printf("ConveyorPointBRecord retval is: %d\n", retval);
41
42 retval = robot.ConveyorStartEnd(0);
43 printf("ConveyorStartEnd retval is: %d\n", retval);
44
45 retval = 0;
46 float param[6] ={1,10000,200,0,0,20};
47 retval = robot.ConveyorSetParam(param);
48 printf("ConveyorSetParam retval is: %d\n", retval);
49
50 double cmp[3] = {0.0, 0.0, 0.0};
51 retval = robot.ConveyorCatchPointComp(cmp);
52 printf("ConveyorCatchPointComp retval is: %d\n", retval);
53
54 int index = 1;
55 int max_time = 30000;
56 uint8_t block = 0;
57 retval = 0;
58
59 /* 下面是一个传送带抓取流程 */
60 DescPose desc_p1;
61 desc_p1.tran.x = -351.553;
62 desc_p1.tran.y = 87.913;
63 desc_p1.tran.z = 354.175;
64 desc_p1.rpy.rx = -179.680;
65 desc_p1.rpy.ry = -0.133;
66 desc_p1.rpy.rz = 2.472;
67
68 DescPose desc_p2;
69 desc_p2.tran.x = -351.535;
70 desc_p2.tran.y = -247.222;
71 desc_p2.tran.z = 354.173;
72 desc_p2.rpy.rx = -179.680;
73 desc_p2.rpy.ry = -0.137;
74 desc_p2.rpy.rz = 2.473;
75
76
77 retval = robot.MoveCart(&desc_p1, 1, 0, 100.0, 100.0, 100.0, -1.0, -1);
78 printf("MoveCart retval is: %d\n", retval);
79
80 retval = robot.WaitMs(1);
81 printf("WaitMs retval is: %d\n", retval);
82
83 retval = robot.ConveyorIODetect(10000);
84 printf("ConveyorIODetect retval is: %d\n", retval);
85
86 retval = robot.ConveyorGetTrackData(1);
87 printf("ConveyorGetTrackData retval is: %d\n", retval);
88
89 retval = robot.ConveyorTrackStart(1);
90 printf("ConveyorTrackStart retval is: %d\n", retval);
91
92 retval = robot.TrackMoveL("cvrCatchPoint", 1, 0, 100, 100, 100, -1.0, 0, 0);
93 printf("TrackMoveL retval is: %d\n", retval);
94
95 retval = robot.MoveGripper(index, 51, 40, 30, max_time, block);
96 printf("MoveGripper retval is: %d\n", retval);
97
98 retval = robot.TrackMoveL("cvrRaisePoint", 1, 0, 100, 100, 100, -1.0, 0, 0);
99 printf("TrackMoveL retval is: %d\n", retval);
100
101 retval = robot.ConveyorTrackEnd();
102 printf("ConveyorTrackEnd retval is: %d\n", retval);
103
104 robot.MoveCart(&desc_p2, 1, 0, 100.0, 100.0, 100.0, -1.0, -1);
105
106 retval = robot.MoveGripper(index, 100, 40, 10, max_time, block);
107 printf("MoveGripper retval is: %d\n", retval);
108
109 return 0;
110}
11.53. 代码示例
在 C++SDK-v2.1.2.0 版本加入.
1#include "libfairino/robot.h"
2
3//如果使用Windows,包含下面的头文件
4#include <string.h>
5#include <windows.h>
6//如果使用linux,包含下面的头文件
7/*
8#include <cstdlib>
9#include <iostream>
10#include <stdio.h>
11#include <cstring>
12#include <unistd.h>
13*/
14#include <chrono>
15#include <thread>
16#include <string>
17
18using namespace std;
19
20int main(void)
21{
22 FRRobot robot;
23 robot.RPC("192.168.58.2");
24
25 char file_path[256] = "/fruser/traj/test_computermd5.txt.txt";
26 char md5[256] = {0};
27 uint8_t emerg_state = 0;
28 uint8_t si0_state = 0;
29 uint8_t si1_state = 0;
30 int sdk_com_state = 0;
31
32 char ssh_keygen[1024] = {0};
33 int retval = robot.GetSSHKeygen(ssh_keygen);
34 printf("GetSSHKeygen retval is: %d\n", retval);
35 printf("ssh key is: %s \n", ssh_keygen);
36
37 char ssh_name[32] = "fr";
38 char ssh_ip[32] = "192.168.58.44";
39 char ssh_route[128] = "/home/fr";
40 char ssh_robot_url[128] = "/root/robot/dhpara.config";
41 retval = robot.SetSSHScpCmd(1, ssh_name, ssh_ip, ssh_route, ssh_robot_url);
42 printf("SetSSHScpCmd retval is: %d\n", retval);
43 printf("robot url is: %s\n", ssh_robot_url);
44
45 robot.ComputeFileMD5(file_path, md5);
46 printf("md5 is: %s \n", md5);
47
48 robot.GetRobotEmergencyStopState(&emerg_state);
49 printf("emergency state is: %u \n", emerg_state);
50
51 robot.GetSafetyStopState(&si0_state, &si1_state);
52 printf("safety stop state is: %u, %u \n", si0_state, si1_state);
53
54 robot.GetSDKComState(&sdk_com_state);
55 printf("sdk com state is: %d", sdk_com_state);
56 return 0;
57}