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}