7. 机器人状态查询
7.1. 获取机器人安装角度
1/**
2* @brief 获取机器人安装角度
3* @param [out] yangle 倾斜角
4* @param [out] zangle 旋转角
5* @return 错误码
6*/
7errno_t GetRobotInstallAngle(float *yangle, float *zangle);
7.2. 获取系统变量值
1/**
2* @brief 获取系统变量值
3* @param [in] id 系统变量编号,范围[1~20]
4* @param [out] value 系统变量值
5* @return 错误码
6*/
7errno_t GetSysVarValue(int id, float *value);
7.3. 获取当前关节位置(角度)
1/**
2* @brief 获取当前关节位置(角度)
3* @param [in] flag 0-阻塞,1-非阻塞
4* @param [out] jPos 六个关节位置,单位deg
5* @return 错误码
6*/
7errno_t GetActualJointPosDegree(uint8_t flag, JointPos *jPos);
7.4. 获取当前关节位置(弧度)
自 C++SDK-v2.1.1.0 版本弃用.
1/**
2* @brief 获取当前关节位置(弧度)
3* @param [in] flag 0-阻塞,1-非阻塞
4* @param [out] jPos 六个关节位置,单位rad
5* @return 错误码
6*/
7errno_t GetActualJointPosRadian(uint8_t flag, JointPos *jPos);
7.5. 获取关节反馈速度
1/**
2 * @brief 获取关节反馈速度-deg/s
3 * @param [in] flag 0-阻塞,1-非阻塞
4 * @param [out] speed 六个关节速度
5 * @return 错误码
6 */
7errno_t GetActualJointSpeedsDegree(uint8_t flag, float speed[6]);
7.6. 获取关节反馈加速度
1/**
2 * @brief 获取关节反馈加速度-deg/s^2
3 * @param [in] flag 0-阻塞,1-非阻塞
4 * @param [out] acc 六个关节加速度
5 * @return 错误码
6 */
7errno_t GetActualJointAccDegree(uint8_t flag, float acc[6]);
7.7. 获取TCP指令速度
1/**
2 * @brief 获取TCP指令速度
3 * @param [in] flag 0-阻塞,1-非阻塞
4 * @param [out] tcp_speed 线性速度
5 * @param [out] ori_speed 姿态速度
6 * @return 错误码
7 */
8errno_t GetTargetTCPCompositeSpeed(uint8_t flag, float *tcp_speed, float *ori_speed);
7.8. 获取TCP反馈速度
1/**
2 * @brief 获取TCP反馈速度
3 * @param [in] flag 0-阻塞,1-非阻塞
4 * @param [out] tcp_speed 线性速度
5 * @param [out] ori_speed 姿态速度
6 * @return 错误码
7 */
8errno_t GetActualTCPCompositeSpeed(uint8_t flag, float *tcp_speed, float *ori_speed);
7.9. 获取TCP指令速度
1/**
2 * @brief 获取TCP指令速度
3 * @param [in] flag 0-阻塞,1-非阻塞
4 * @param [out] speed [x,y,z,rx,ry,rz]速度
5 * @return 错误码
6 */
7errno_t GetTargetTCPSpeed(uint8_t flag, float speed[6]);
7.10. 获取TCP反馈速度
1/**
2 * @brief 获取TCP反馈速度
3 * @param [in] flag 0-阻塞,1-非阻塞
4 * @param [out] speed [x,y,z,rx,ry,rz]速度
5 * @return 错误码
6 */
7errno_t GetActualTCPSpeed(uint8_t flag, float speed[6]);
7.11. 获取当前工具位姿
1/**
2* @brief 获取当前工具位姿
3* @param [in] flag 0-阻塞,1-非阻塞
4* @param [out] desc_pos 工具位姿
5* @return 错误码
6*/
7errno_t GetActualTCPPose(uint8_t flag, DescPose *desc_pos);
7.12. 获取当前工具坐标系编号
1/**
2* @brief 获取当前工具坐标系编号
3* @param [in] flag 0-阻塞,1-非阻塞
4* @param [out] id 工具坐标系编号
5* @return 错误码
6*/
7errno_t GetActualTCPNum(uint8_t flag, int *id);
7.13. 获取当前工件坐标系编号
1/**
2* @brief 获取当前工件坐标系编号
3* @param [in] flag 0-阻塞,1-非阻塞
4* @param [out] id 工件坐标系编号
5* @return 错误码
6*/
7errno_t GetActualWObjNum(uint8_t flag, int *id);
7.14. 获取当前末端法兰位姿
1/**
2* @brief 获取当前末端法兰位姿
3* @param [in] flag 0-阻塞,1-非阻塞
4* @param [out] desc_pos 法兰位姿
5* @return 错误码
6*/
7errno_t GetActualToolFlangePose(uint8_t flag, DescPose *desc_pos);
7.15. 逆运动学求解
1/**
2* @brief 逆运动学求解
3* @param [in] type 0-绝对位姿(基坐标系),1-增量位姿(基坐标系),2-增量位姿(工具坐标系)
4* @param [in] desc_pos 笛卡尔位姿
5* @param [in] config 关节空间配置,[-1]-参考当前关节位置解算,[0~7]-依据特定关节空间配置求解
6* @param [out] joint_pos 关节位置
7* @return 错误码
8*/
9errno_t GetInverseKin(int type, DescPose *desc_pos, int config, JointPos *joint_pos);
7.16. 逆运动学求解
1/**
2* @brief 逆运动学求解,参考指定关节位置求解
3* @param [in] type 0-绝对位姿(基坐标系),1-增量位姿(基坐标系),2-增量位姿(工具坐标系)
4* @param [in] desc_pos 笛卡尔位姿
5* @param [in] joint_pos_ref 参考关节位置
6* @param [out] joint_pos 关节位置
7* @return 错误码
8*/
9errno_t GetInverseKinRef(int type, DescPose *desc_pos, JointPos *joint_pos_ref, JointPos *joint_pos);
7.17. 逆运动学求解
1/**
2* @brief 逆运动学求解,参考指定关节位置判断是否有解
3* @param [in] type 0-绝对位姿(基坐标系),1-增量位姿(基坐标系),2-增量位姿(工具坐标系)
4* @param [in] desc_pos 笛卡尔位姿
5* @param [in] joint_pos_ref 参考关节位置
6* @param [out] result 0-无解,1-有解
7* @return 错误码
8*/
9errno_t GetInverseKinHasSolution(int type, DescPose *desc_pos, JointPos *joint_pos_ref, uint8_t *result);
7.18. 正运动学求解
1/**
2* @brief 正运动学求解
3* @param [in] joint_pos 关节位置
4* @param [out] desc_pos 笛卡尔位姿
5* @return 错误码
6*/
7errno_t GetForwardKin(JointPos *joint_pos, DescPose *desc_pos);
7.19. 获取当前关节转矩
1/**
2* @brief 获取当前关节转矩
3* @param [in] flag 0-阻塞,1-非阻塞
4* @param [out] torques 关节转矩
5* @return 错误码
6*/
7errno_t GetJointTorques(uint8_t flag, float torques[6]);
7.20. 获取当前负载的重量
1/**
2* @brief 获取当前负载的重量
3* @param [in] flag 0-阻塞,1-非阻塞
4* @param [out] weight 负载重量,单位kg
5* @return 错误码
6*/
7errno_t GetTargetPayload(uint8_t flag, float *weight);
7.21. 获取当前负载的质心
1/**
2* @brief 获取当前负载的质心
3* @param [in] flag 0-阻塞,1-非阻塞
4* @param [out] cog 负载质心,单位mm
5* @return 错误码
6*/
7errno_t GetTargetPayloadCog(uint8_t flag, DescTran *cog);
7.22. 获取当前工具坐标系
1/**
2* @brief 获取当前工具坐标系
3* @param [in] flag 0-阻塞,1-非阻塞
4* @param [out] desc_pos 工具坐标系位姿
5* @return 错误码
6*/
7errno_t GetTCPOffset(uint8_t flag, DescPose *desc_pos);
7.23. 获取当前工件坐标系
1/**
2* @brief 获取当前工件坐标系
3* @param [in] flag 0-阻塞,1-非阻塞
4* @param [out] desc_pos 工件坐标系位姿
5* @return 错误码
6*/
7errno_t GetWObjOffset(uint8_t flag, DescPose *desc_pos);
7.24. 获取关节软限位角度
1/**
2* @brief 获取关节软限位角度
3* @param [in] flag 0-阻塞,1-非阻塞
4* @param [out] negative 负限位角度,单位deg
5* @param [out] positive 正限位角度,单位deg
6* @return 错误码
7*/
8errno_t GetJointSoftLimitDeg(uint8_t flag, float negative[6], float positive[6]);
7.25. 获取系统时间
1/**
2* @brief 获取系统时间
3* @param [out] t_ms 单位ms
4* @return 错误码
5*/
6errno_t GetSystemClock(float *t_ms);
7.26. 获取机器人当前关节配置
1/**
2* @brief 获取机器人当前关节位置
3* @param [out] config 关节空间配置,范围[0~7]
4* @return 错误码
5*/
6errno_t GetRobotCurJointsConfig(int *config);
7.27. 获取当前速度
1/**
2* @brief 获取机器人当前速度
3* @param [out] vel 速度,单位mm/s
4* @return 错误码
5*/
6errno_t GetDefaultTransVel(float *vel);
7.28. 查询机器人运动是否完成
1/**
2* @brief 查询机器人运动是否完成
3* @param [out] state 0-未完成,1-完成
4* @return 错误码
5*/
6errno_t GetRobotMotionDone(uint8_t *state);
7.29. 代码示例
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 yangle, zangle;
17 int flag = 0;
18 JointPos j_deg, j_rad;
19 DescPose tcp, flange, tcp_offset, wobj_offset;
20 DescTran cog;
21 int id;
22 float torques[6] = {0.0};
23 float weight;
24 float neg_deg[6]={0.0},pos_deg[6]={0.0};
25 float t_ms;
26 int config;
27 float vel;
28
29 memset(&j_deg, 0, sizeof(JointPos));
30 memset(&j_rad, 0, sizeof(JointPos));
31 memset(&tcp, 0, sizeof(DescPose));
32 memset(&flange, 0, sizeof(DescPose));
33 memset(&tcp_offset, 0, sizeof(DescPose));
34 memset(&wobj_offset, 0, sizeof(DescPose));
35 memset(&cog, 0, sizeof(DescTran));
36
37 robot.GetRobotInstallAngle(&yangle, &zangle);
38 printf("yangle:%f,zangle:%f\n", yangle, zangle);
39
40 robot.GetActualJointPosDegree(flag, &j_deg);
41 printf("joint pos deg:%f,%f,%f,%f,%f,%f\n", j_deg.jPos[0],j_deg.jPos[1],j_deg.jPos[2],j_deg.jPos[3],j_deg.jPos[4],j_deg.jPos[5]);
42
43 robot.GetActualJointPosRadian(flag, &j_rad);
44 printf("joint pos rad:%f,%f,%f,%f,%f,%f\n", j_rad.jPos[0],j_rad.jPos[1],j_rad.jPos[2],j_rad.jPos[3],j_rad.jPos[4],j_rad.jPos[5]);
45
46 robot.GetActualTCPPose(flag, &tcp);
47 printf("tcp pose:%f,%f,%f,%f,%f,%f\n", tcp.tran.x, tcp.tran.y, tcp.tran.z, tcp.rpy.rx, tcp.rpy.ry, tcp.rpy.rz);
48
49 robot.GetActualToolFlangePose(flag, &flange);
50 printf("flange pose:%f,%f,%f,%f,%f,%f\n", flange.tran.x, flange.tran.y, flange.tran.z, flange.rpy.rx, flange.rpy.ry, flange.rpy.rz);
51
52 robot.GetActualTCPNum(flag, &id);
53 printf("tcp num:%d\n", id);
54
55 robot.GetActualWObjNum(flag, &id);
56 printf("wobj num:%d\n", id);
57
58 robot.GetJointTorques(flag, torques);
59 printf("torques:%f,%f,%f,%f,%f,%f\n", torques[0],torques[1],torques[2],torques[3],torques[4],torques[5]);
60
61 robot.GetTargetPayload(flag, &weight);
62 printf("payload weight:%f\n", weight);
63
64 robot.GetTargetPayloadCog(flag, &cog);
65 printf("payload cog:%f,%f,%f\n",cog.x, cog.y, cog.z);
66
67 robot.GetTCPOffset(flag, &tcp_offset);
68 printf("tcp offset:%f,%f,%f,%f,%f,%f\n", tcp_offset.tran.x,tcp_offset.tran.y,tcp_offset.tran.z,tcp_offset.rpy.rx,tcp_offset.rpy.ry,tcp_offset.rpy.rz);
69
70 robot.GetWObjOffset(flag, &wobj_offset);
71 printf("wobj offset:%f,%f,%f,%f,%f,%f\n", wobj_offset.tran.x,wobj_offset.tran.y,wobj_offset.tran.z,wobj_offset.rpy.rx,wobj_offset.rpy.ry,wobj_offset.rpy.rz);
72
73 robot.GetJointSoftLimitDeg(flag, neg_deg, pos_deg);
74 printf("neg limit deg:%f,%f,%f,%f,%f,%f\n",neg_deg[0],neg_deg[1],neg_deg[2],neg_deg[3],neg_deg[4],neg_deg[5]);
75 printf("pos limit deg:%f,%f,%f,%f,%f,%f\n",pos_deg[0],pos_deg[1],pos_deg[2],pos_deg[3],pos_deg[4],pos_deg[5]);
76
77 robot.GetSystemClock(&t_ms);
78 printf("system clock:%f\n", t_ms);
79
80 robot.GetRobotCurJointsConfig(&config);
81 printf("joint config:%d\n", config);
82
83 robot.GetDefaultTransVel(&vel);
84 printf("trans vel:%f\n", vel);
85
86 return 0;
87}
7.30. 查询机器人错误码
1/**
2 * @brief 查询机器人错误码
3 * @param [out] maincode 主错误码
4 * @param [out] subcode 子错误码
5 * @return 错误码
6 */
7errno_t GetRobotErrorCode(int *maincode, int *subcode);
7.31. 查询机器人示教管理点位数据
1/**
2 * @brief 查询机器人示教管理点位数据
3 * @param [in] name 点位名
4 * @param [out] data 点位数据
5 * @return 错误码
6 */
7errno_t GetRobotTeachingPoint(char name[64], float data[20]);
7.32. 查询机器人运动队列缓存长度
1/**
2 * @brief 查询机器人运动队列缓存长度
3 * @param [out] len 缓存长度
4 * @return 错误码
5 */
6errno_t GetMotionQueueLength(int *len);
7.33. 代码示例
在 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
15#include <chrono>
16#include <thread>
17
18using namespace std;
19
20int main(void)
21{
22 FRRobot robot;
23 robot.RPC("192.168.58.2");
24
25 uint8_t result = 0;
26 int retval = 0;
27 float joint_speed_deg[6] = {0};
28
29 retval = robot.GetActualJointSpeedsDegree(1, joint_speed_deg);
30 printf("GetActualJointSpeedsDegree retval is: %d \n", retval);
31 printf("joint degree speed is: %f, %f, %f, %f, %f, %f \n", joint_speed_deg[0], joint_speed_deg[1], joint_speed_deg[2], joint_speed_deg[3], joint_speed_deg[4], joint_speed_deg[5]);
32
33 float joint_acc_deg[6] = {0};
34 retval = robot.GetActualJointAccDegree(1, joint_acc_deg);
35 printf("GetActualJointAccDegree retval is: %d \n", retval);
36 printf("joint degree acc is: %f, %f, %f, %f, %f, %f \n", joint_acc_deg[0], joint_acc_deg[1], joint_acc_deg[2], joint_acc_deg[3], joint_acc_deg[4], joint_acc_deg[5]);
37
38 float tcp_speed = 0;
39 float ori_speed = 0;
40 retval = robot.GetTargetTCPCompositeSpeed(1, &tcp_speed, &ori_speed);
41 printf("GetTargetTCPCompositeSpeed retval is: %d \n", retval);
42 printf("tcp_speed is:%f, ori_speed is: %f \n", tcp_speed, ori_speed);
43
44 retval = robot.GetActualTCPCompositeSpeed(1, &tcp_speed, &ori_speed);
45 printf("GetActualTCPCompositeSpeed retval is: %d \n", retval);
46 printf("tcp_speed is:%f, ori_speed is: %f \n", tcp_speed, ori_speed);
47
48 float targer_tcp_speed[6] = {0};
49 retval = robot.GetTargetTCPSpeed(1, targer_tcp_speed);
50 printf("GetTargetTCPSpeed retval is: %d \n", retval);
51 printf("xyz is: %f, %f, %f; rpy is: %f, %f, %f\n", targer_tcp_speed[0], targer_tcp_speed[1], targer_tcp_speed[2], targer_tcp_speed[3], targer_tcp_speed[4], targer_tcp_speed[5]);
52
53 float actual_tcp_speed[6] = {0};
54 robot.GetActualTCPSpeed(1, actual_tcp_speed);
55 printf("GetActualTCPSpeed retval is: %d \n", retval);
56 printf("xyz is: %f, %f, %f; rpy is: %f, %f, %f\n", actual_tcp_speed[0], actual_tcp_speed[1], actual_tcp_speed[2], actual_tcp_speed[3], actual_tcp_speed[4], actual_tcp_speed[5]);
57
58 JointPos j;
59 DescPose desc_pos, offset_pos1, offset_pos2;
60
61 memset(&j, 0, sizeof(JointPos));
62 memset(&desc_pos, 0, sizeof(DescPose));
63 memset(&offset_pos1, 0, sizeof(DescPose));
64 memset(&offset_pos2, 0, sizeof(DescPose));
65
66 j = {{-39.666, -96.491, -79.531, -94.251, 90.961, -58.714}};
67 offset_pos1.tran.x = 10.0;
68 offset_pos1.rpy.rx = -10.0;
69 offset_pos2.tran.x = 30.0;
70 offset_pos2.rpy.rx = -5.0;
71
72 retval = 0;
73 retval = robot.GetForwardKin(&j, &desc_pos); // 只有关节位置的情况下,可用正运动学接口求解笛卡尔空间坐标
74 printf("GetForwardKin ret is: %d \n", retval);
75 printf("GetForwardKin result:%f,%f,%f,%f,%f,%f\n", desc_pos.tran.x, desc_pos.tran.y, desc_pos.tran.z, desc_pos.rpy.rx, desc_pos.rpy.ry, desc_pos.rpy.rz);
76
77 retval = 0;
78 JointPos start_joint_pose;
79 memset(&start_joint_pose, 0, sizeof(JointPos));
80 retval = robot.GetInverseKinRef(0, &desc_pos, &j, &start_joint_pose);
81 printf("GetInverseKinRef retval is: %d \n", retval);
82 printf("joint is: %f, %f, %f,%f, %f, %f\n", start_joint_pose.jPos[0], start_joint_pose.jPos[1], start_joint_pose.jPos[2], start_joint_pose.jPos[3], start_joint_pose.jPos[4], start_joint_pose.jPos[5]);
83
84 retval = 0;
85 retval = robot.GetInverseKinHasSolution(1, &offset_pos1, &j, &result); // 根据参考关节坐标,判断目标位姿是否有解
86 printf("GetInverseKinHasSolution ret: %d\n", result);
87 if (0 == result)
88 {
89 printf("pose1 can not be solved\n");
90 }
91
92 retval = 0;
93 retval = robot.GetInverseKin(1, &offset_pos1, -1, &start_joint_pose);
94 printf("GetInverseKin retval is: %d \n", retval);
95 printf("GetInverseKin result is: %f, %f, %f, %f, %f, %f\n", start_joint_pose.jPos[0], start_joint_pose.jPos[1], start_joint_pose.jPos[2], start_joint_pose.jPos[3], start_joint_pose.jPos[4], start_joint_pose.jPos[5]);
96
97 int main_code = 0;
98 int sub_code = 0;
99 retval = 0;
100 retval = robot.GetRobotErrorCode(&main_code, &sub_code);
101 printf("GetRobotMotionDone retval is: %d , amin code is:%d, sub code is: %d\n", retval, main_code, sub_code);
102
103 char name[64] = "F1";
104 float data[20] = {0};
105 int ret = robot.GetRobotTeachingPoint(name, data);
106 printf(" %d name is: %s \n", ret, name);
107 for (int i = 0; i < 20; i++)
108 {
109 printf("data is: %f \n", data[i]);
110 }
111
112 int que_len = 0;
113 retval = 0;
114 retval = robot.GetMotionQueueLength(&que_len);
115 printf("GetMotionQueueLength retval is: %d, queue length is: %d \n", retval, que_len);
116}