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*/
9int FT_SetConfig(int company, int device, int softvesion, int bus);
11.2. 获取力传感器配置
1/**
2* @brief 获取力传感器配置
3* @param [out] deviceID 力传感器编号
4* @param [out] company 力传感器厂商,,力传感器厂商,17-坤维科技,19-航天十一院,20-ATI传感器,21-中科米点,22-伟航敏芯
5* @param [out] device 设备号,坤维(0-KWR75B),航天十一院(0-MCS6A-200-4),ATI (0-AXIA80 -M8),中科米点(0-MST2010),伟航敏芯(0-WHC6L-YB-10A)
6* @param [out] softvesion 软件版本号,暂不使用,默认为 0
7* @return 错误码
8*/
9int FT_GetConfig(ref int deviceID, ref int company, ref int device, ref int softvesion);
11.3. 力传感器激活
1/**
2* @brief 力传感器激活
3* @param [in] act 0-复位,1-激活
4* @return 错误码
5*/
6int FT_Activate(byte act);
11.4. 力传感器校零
1/**
2* @brief 力传感器校零
3* @param [in] act 0-去除零点,1-零点矫正
4* @return 错误码
5*/
6int FT_SetZero(byte act);
11.5. 代码示例
1private void btnFT_Click(object sender, EventArgs e)
2{
3 Robot robot = new Robot();
4 robot.RPC("192.168.58.2");
5
6 int company = 17;
7 int device = 0;
8 int softversion = 0;
9 int bus = 1;
10 int index = 1;
11 byte act = 0;
12
13 robot.FT_SetConfig(company, device, softversion, bus);
14 Thread.Sleep(1000);
15 company = 0;
16 robot.FT_GetConfig(ref company, ref device, ref softversion, ref bus);
17 Console.WriteLine($"FT config : {company}, {device}, {softversion}, {bus}");
18 Thread.Sleep(1000);
19
20 robot.FT_Activate(act);
21 Thread.Sleep(1000);
22 act = 1;
23 robot.FT_Activate(act);
24 Thread.Sleep(1000);
25
26 robot.SetLoadWeight(0.0f);
27 Thread.Sleep(1000);
28 DescTran coord = new DescTran(0, 0, 0);
29
30 robot.SetLoadCoord(coord);
31 Thread.Sleep(1000);
32 robot.FT_SetZero(0);//0去除零点 1零点矫正
33 Thread.Sleep(1000);
34
35 ForceTorque ft = new ForceTorque(0, 0, 0, 0, 0, 0);
36 int rtn = robot.FT_GetForceTorqueOrigin(1, ref ft);
37 Console.WriteLine($"ft origin : {ft.fx}, {ft.fy}, { ft.fz}, { ft.tx}, { ft.ty}, { ft.tz} rtn {rtn}");
38 rtn = robot.FT_SetZero(1);//零点矫正
39 //Console.WriteLine($"set zero rtn {rtn}");
40
41 Thread.Sleep(2000);
42 rtn = robot.FT_GetForceTorqueOrigin(1, ref ft);
43 Console.WriteLine($"ft rcs : {ft.fx}, {ft.fy}, {ft.fz}, {ft.tx}, {ft.ty}, {ft.tz} rtn {rtn}");
44
45 robot.FT_GetForceTorqueRCS(1, ref ft);
46 Console.WriteLine($"FT_GetForceTorqueRCS rcs : {ft.fx}, {ft.fy}, {ft.fz}, {ft.tx}, {ft.ty}, {ft.tz}");
47}
11.6. 设置力传感器参考坐标系
1/**
2* @brief 设置力传感器参考坐标系
3* @param [in] ref 0-工具坐标系,1-基坐标系
4* @return 错误码
5*/
6int FT_SetRCS(byte type);
11.7. 负载重量辨识记录
1/**
2* @brief 负载重量辨识记录
3* @param [in] id 传感器坐标系编号,范围[1~14]
4* @return 错误码
5*/
6int FT_PdIdenRecord(int id);
11.8. 负载重量辨识计算
1/**
2* @brief 负载重量辨识计算
3* @param [out] weight 负载重量,单位kg
4* @return 错误码
5*/
6int FT_PdIdenCompute(ref double weight);
11.9. 负载质心辨识记录
1/**
2* @brief 负载质心辨识记录
3* @param [in] id 传感器坐标系编号,范围[1~14]
4* @param [in] index 点编号,范围[1~3]
5* @return 错误码
6*/
7int FT_PdCogIdenRecord(int id, int index);
11.10. 负载质心辨识计算
1/**
2* @brief 负载质心辨识计算
3* @param [out] cog 负载质心,单位mm
4* @return 错误码
5*/
6int FT_PdCogIdenCompute(ref DescTran cog);
11.11. 代码示例
1private void btnFTPdCog_Click(object sender, EventArgs e)
2{
3 Robot robot = new Robot();
4 robot.RPC("192.168.58.2");
5
6 double weight = 0.1;
7 int rtn = -1;
8 DescPose tcoord, desc_p1, desc_p2, desc_p3;
9 tcoord = new DescPose(0, 0, 0, 0, 0, 0);
10 desc_p1 = new DescPose(0, 0, 0, 0, 0, 0);
11 desc_p2 = new DescPose(0, 0, 0, 0, 0, 0);
12 desc_p3 = new DescPose(0, 0, 0, 0, 0, 0);
13
14 robot.FT_SetRCS(0);
15 Thread.Sleep(1000);
16
17 tcoord.tran.z = 35.0;
18 robot.SetToolCoord(10, tcoord, 1, 0);
19 Thread.Sleep(1000);
20 robot.FT_PdIdenRecord(10);
21 Thread.Sleep(1000);
22 robot.FT_PdIdenCompute(ref weight);
23 Console.WriteLine($"payload weight : {weight}");
24
25 desc_p1.tran.x = -47.805;
26 desc_p1.tran.y = -362.266;
27 desc_p1.tran.z = 317.754;
28 desc_p1.rpy.rx = -179.496;
29 desc_p1.rpy.ry = -0.255;
30 desc_p1.rpy.rz = 34.948;
31
32 desc_p2.tran.x = -77.805;
33 desc_p2.tran.y = -312.266;
34 desc_p2.tran.z = 317.754;
35 desc_p2.rpy.rx = -179.496;
36 desc_p2.rpy.ry = -0.255;
37 desc_p2.rpy.rz = 34.948;
38
39 desc_p3.tran.x = -167.805;
40 desc_p3.tran.y = -312.266;
41 desc_p3.tran.z = 387.754;
42 desc_p3.rpy.rx = -179.496;
43 desc_p3.rpy.ry = -0.255;
44 desc_p3.rpy.rz = 34.948;
45
46 rtn = robot.MoveCart(desc_p1, 0, 0, 100.0f, 100.0f, 100.0f, -1.0f, -1);
47 Console.WriteLine($"MoveCart rtn {rtn}");
48 Thread.Sleep(1000);
49 robot.FT_PdCogIdenRecord(10, 1);
50 robot.MoveCart(desc_p2, 0, 0, 100.0f, 100.0f, 100.0f, -1.0f, -1);
51 Thread.Sleep(1000);
52 robot.FT_PdCogIdenRecord(10, 2);
53 robot.MoveCart(desc_p3, 0, 0, 100.0f, 100.0f, 100.0f, -1.0f, -1);
54 Thread.Sleep(1000);
55 robot.FT_PdCogIdenRecord(10, 3);
56 Thread.Sleep(1000);
57 DescTran cog = new DescTran(0, 0, 0);
58
59 robot.FT_PdCogIdenCompute(ref cog);
60 Console.WriteLine($"cog : {cog.x}, {cog.y}, {cog.z}");
61}
11.12. 获取参考坐标系下力/扭矩数据
1/**
2* @brief 获取参考坐标系下力/扭矩数据
3* @param [out] ft 力/扭矩,fx,fy,fz,tx,ty,tz
4* @return 错误码
5*/
6int FT_GetForceTorqueRCS(byte flag, ref ForceTorque ft);
11.13. 获取力传感器原始力/扭矩数据
1/**
2* @brief 获取力传感器原始力/扭矩数据
3* @param [out] ft 力/扭矩,fx,fy,fz,tx,ty,tz
4* @return 错误码
5*/
6int FT_GetForceTorqueOrigin(byte flag, ref 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*/
12int FT_Guard(int flag, int sensor_id, int[] select, ForceTorque ft, double[] max_threshold, double[] min_threshold);
11.15. 代码示例
1private void btnFTGuard_Click(object sender, EventArgs e)
2{
3 Robot robot = new Robot();
4 robot.RPC("192.168.58.2");
5
6 byte flag = 1;
7 byte sensor_id = 1;
8 int[] select = new int[6]{ 1, 0, 0, 0, 0, 0 };//只启用x轴碰撞守护
9 double[] max_threshold = new double[6]{ 5.0f, 0.01f, 0.01f, 0.01f, 0.01f, 0.01f };
10 double[] min_threshold = new double[6]{ 3.0f, 0.01f, 0.01f, 0.01f, 0.01f, 0.01f };
11
12 ForceTorque ft = new ForceTorque(0, 0, 0, 0, 0, 0);
13 DescPose desc_p1, desc_p2, desc_p3;
14 desc_p1 = new DescPose(0, 0, 0, 0, 0, 0);
15 desc_p2 = new DescPose(0, 0, 0, 0, 0, 0);
16 desc_p3 = new DescPose(0, 0, 0, 0, 0, 0);
17
18 desc_p1.tran.x = 1.299;
19 desc_p1.tran.y = -719.159;
20 desc_p1.tran.z = 141.314;
21 desc_p1.rpy.rx = 177.999;
22 desc_p1.rpy.ry = -0.715;
23 desc_p1.rpy.rz = -161.937;
24
25 desc_p2.tran.x = 245.047;
26 desc_p2.tran.y = -675.509;
27 desc_p2.tran.z = 139.538;
28 desc_p2.rpy.rx = 177.987;
29 desc_p2.rpy.ry = -0.129;
30 desc_p2.rpy.rz = -142.238;
31
32 desc_p3.tran.x = 157.233;
33 desc_p3.tran.y = -550.088;
34 desc_p3.tran.z = 112.485;
35 desc_p3.rpy.rx = -176.579;
36 desc_p3.rpy.ry = -2.819;
37 desc_p3.rpy.rz = -148.415;
38 robot.SetSpeed(5);
39
40 int rtn = robot.FT_Guard(flag, sensor_id, select, ft, max_threshold, min_threshold);
41 Console.WriteLine($"FT_Guard start rtn {rtn}");
42 robot.MoveCart(desc_p1, 1, 0, 100.0f, 100.0f, 100.0f, -1.0f, -1);
43 robot.MoveCart(desc_p2, 1, 0, 100.0f, 100.0f, 100.0f, -1.0f, -1);
44 robot.MoveCart(desc_p3, 1, 0, 100.0f, 100.0f, 100.0f, -1.0f, -1);
45 flag = 0;
46 rtn = robot.FT_Guard(flag, sensor_id, select, ft, max_threshold, min_threshold);
47 Console.WriteLine($"FT_Guard end rtn {rtn}");
48}
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*/
14int FT_Control(int flag, int sensor_id, int[] select, ForceTorque ft, double[] ft_pid, int adj_sign, int ILC_sign, double max_dis, double max_ang);
11.17. 代码示例
1private void btnFTConttol_Click(object sender, EventArgs e)
2{
3 Robot robot = new Robot();
4 robot.RPC("192.168.58.2");
5
6 byte flag = 1;
7 byte sensor_id = 1;
8 int[] select = new int[6]{ 0, 0, 1, 0, 0, 0 };
9 double[] ft_pid = new double[6]{ 0.0005f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
10 byte adj_sign = 0;
11 byte ILC_sign = 0;
12 float max_dis = 100.0f;
13 float max_ang = 0.0f;
14
15 ForceTorque ft = new ForceTorque(0, 0, 0, 0 ,0 ,0);
16 DescPose desc_p1, desc_p2, offset_pos;
17 JointPos j1, j2;
18 ExaxisPos epos = new ExaxisPos(0, 0, 0, 0);
19 desc_p1 = new DescPose(0, 0, 0, 0, 0, 0);
20 desc_p2 = new DescPose(0, 0, 0, 0, 0, 0);
21 offset_pos = new DescPose(0, 0, 0, 0, 0, 0);
22
23 j2 = new JointPos(0, 0, 0, 0, 0, 0);
24 j1 = new JointPos(0, 0, 0, 0, 0, 0);
25
26 desc_p1.tran.x = 1.299;
27 desc_p1.tran.y = -719.159;
28 desc_p1.tran.z = 141.314;
29 desc_p1.rpy.rx = 177.999;
30 desc_p1.rpy.ry = -0.715;
31 desc_p1.rpy.rz = -161.937;
32
33 desc_p2.tran.x = 245.047;
34 desc_p2.tran.y = -675.509;
35 desc_p2.tran.z = 139.538;
36 desc_p2.rpy.rx = 177.987;
37 desc_p2.rpy.ry = -0.129;
38 desc_p2.rpy.rz = -142.238;
39 ft.fz = -10.0;
40
41 robot.GetInverseKin(0, desc_p1, -1, ref j1);
42 robot.GetInverseKin(0, desc_p2, -1, ref j2);
43
44 robot.MoveJ(j1, desc_p1, 1, 0, 100.0f, 180.0f, 100.0f, epos, -1.0f, 0, offset_pos);
45 int rtn = robot.FT_Control(flag, sensor_id, select, ft, ft_pid, adj_sign, ILC_sign, max_dis, max_ang);
46 Console.WriteLine($"FT_Control start rtn {rtn}");
47
48 robot.MoveL(j2, desc_p2, 1, 0, 100.0f, 180.0f, 20.0f, -1.0f, epos, 0, 0, offset_pos);
49 flag = 0;
50 rtn = robot.FT_Control(flag, sensor_id, select, ft, ft_pid, adj_sign, ILC_sign, max_dis, max_ang);
51 Console.WriteLine($"FT_Control end rtn {rtn}");
52}
11.18. 柔顺控制开启
1/**
2* @brief 柔顺控制开启
3* @param [in] p 位置调节系数或柔顺系数
4* @param [in] force 柔顺开启力阈值,单位N
5* @return 错误码
6*/
7int FT_ComplianceStart(float p, float force);
11.19. 柔顺控制关闭
1/**
2* @brief 柔顺控制关闭
3* @return 错误码
4*/
5int FT_ComplianceStop();
11.20. 代码示例
1private void btnComplience_Click(object sender, EventArgs e)
2{
3 Robot robot = new Robot();
4 robot.RPC("192.168.58.2");
5
6 byte flag = 1;
7 int sensor_id = 1;
8 int[] select = new int[6]{ 1, 1, 1, 0, 0, 0 };
9 double[] ft_pid = new double[6] { 0.0005f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
10 byte adj_sign = 0;
11 byte ILC_sign = 0;
12 float max_dis = 100.0f;
13 float max_ang = 0.0f;
14
15 ForceTorque ft = new ForceTorque(0, 0, 0, 0, 0, 0);
16 DescPose desc_p1, desc_p2, offset_pos;
17 JointPos j1, j2;
18
19 ExaxisPos epos = new ExaxisPos(0, 0, 0, 0);
20 desc_p1 = new DescPose(0, 0, 0, 0, 0, 0);
21 desc_p2 = new DescPose(0, 0, 0, 0, 0, 0);
22 offset_pos = new DescPose(0, 0, 0, 0, 0, 0);
23
24 j2 = new JointPos(0, 0, 0, 0, 0, 0);
25 j1 = new JointPos(0, 0, 0, 0, 0, 0);
26
27 desc_p1.tran.x = 1.299;
28 desc_p1.tran.y = -719.159;
29 desc_p1.tran.z = 141.314;
30 desc_p1.rpy.rx = 177.999;
31 desc_p1.rpy.ry = -0.715;
32 desc_p1.rpy.rz = -161.937;
33
34 desc_p2.tran.x = 245.047;
35 desc_p2.tran.y = -675.509;
36 desc_p2.tran.z = 139.538;
37 desc_p2.rpy.rx = 177.987;
38 desc_p2.rpy.ry = -0.129;
39 desc_p2.rpy.rz = -142.238;
40 ft.fz = -10.0;
41
42 robot.GetInverseKin(0, desc_p1, -1, ref j1);
43 robot.GetInverseKin(0, desc_p2, -1, ref j2);
44
45 ft.fx = -10.0;
46 ft.fy = -10.0;
47 ft.fz = -10.0;
48 robot.FT_Control(flag, sensor_id, select, ft, ft_pid, adj_sign, ILC_sign, max_dis, max_ang);
49 float p = 0.00005f;
50 float force = 30.0f;
51 int rtn = robot.FT_ComplianceStart(p, force);
52 Console.WriteLine($"FT_ComplianceStart rtn {rtn}");
53 int count = 15;
54 while (count > 0)
55 {
56 robot.MoveL(j1, desc_p1, 1, 0, 100.0f, 180.0f, 100.0f, -1.0f, epos, 0, 1, offset_pos);
57 robot.MoveL(j2, desc_p2, 1, 0, 100.0f, 180.0f, 100.0f, -1.0f, epos, 0, 0, offset_pos);
58 count -= 1;
59 }
60 rtn = robot.FT_ComplianceStop();
61 Console.WriteLine($"FT_ComplianceStop rtn {rtn}");
62 flag = 0;
63 robot.FT_Control(flag, sensor_id, select, ft, ft_pid, adj_sign, ILC_sign, max_dis, max_ang);
64}
11.21. 负载辨识初始化
在 C#SDK-v1.0.4 版本加入.
1/**
2* @brief 负载辨识初始化
3* @return 错误码
4*/
5int LoadIdentifyDynFilterInit();
11.22. 负载辨识变量初始化
在 C#SDK-v1.0.4 版本加入.
1/**
2* @brief 负载辨识变量初始化
3* @return 错误码
4*/
5int LoadIdentifyDynVarInit();
11.23. 负载辨识主程序
在 C#SDK-v1.0.4 版本加入.
1/**
2* @brief 负载辨识主程序
3* @param [in] joint_torque 关节扭矩
4* @param [in] joint_pos 关节位置
5* @param [in] t 采样周期
6* @return 错误码
7*/
8int LoadIdentifyMain(double[] joint_torque, double[] joint_pos, double t);
11.24. 获取负载辨识结果
在 C#SDK-v1.0.4 版本加入.
1/**
2* @brief 获取负载辨识结果
3* @param [in] gain
4* @param [out] weight 负载重量
5* @param [out] cog 负载质心
6* @return 错误码
7*/
8int LoadIdentifyGetResult(double[] gain, ref double weight, ref DescTran cog);