290 lines
8.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file FairinoRobotWrapper_Example.cpp
* @brief FairinoRobotWrapper 使用示例
* @details 演示如何使用封装后的Fairino机器人接口
*
* 注意:此文件仅作为示例参考,不参与编译
*/
#include "FairinoRobotWrapper.h"
#include <iostream>
/**
* @brief 示例1基本连接和断开
*/
void Example_Connection()
{
FairinoRobotWrapper robot;
// 获取SDK版本
std::cout << "SDK版本: " << robot.GetSDKVersion() << std::endl;
// 连接机器人使用默认IP: 192.168.58.2
errno_t ret = robot.Connect();
if (ret != ERR_SUCCESS) {
std::cout << "连接失败: " << robot.GetLastErrorString() << std::endl;
return;
}
std::cout << "连接成功控制器IP: " << robot.GetControllerIP() << std::endl;
// ... 执行操作 ...
// 断开连接
robot.Disconnect();
std::cout << "已断开连接" << std::endl;
}
/**
* @brief 示例2直线运动 MoveL
*/
void Example_MoveL()
{
FairinoRobotWrapper robot;
if (robot.Connect("192.168.58.2") != ERR_SUCCESS) {
std::cout << "连接失败" << std::endl;
return;
}
// 使能机器人
robot.RobotEnable(1);
// 设置全局速度为30%
robot.SetSpeed(30);
// 直线运动到目标位置
// 参数x, y, z (mm), rx, ry, rz (deg)
errno_t ret = robot.MoveL(
400.0, 0.0, 300.0, // 目标位置 (mm)
180.0, 0.0, 0.0, // 目标姿态 (deg)
50.0, // 速度百分比
50.0, // 加速度百分比
-1.0 // blendR = -1.0 表示运动到位(阻塞)
);
if (ret != ERR_SUCCESS) {
std::cout << "MoveL失败: " << robot.GetLastErrorString() << std::endl;
} else {
std::cout << "MoveL完成" << std::endl;
}
// 连续直线运动(非阻塞模式,使用平滑过渡)
robot.MoveL(450.0, 50.0, 300.0, 180.0, 0.0, 0.0, 50.0, 50.0, 50.0); // blendR=50mm
robot.MoveL(450.0, -50.0, 300.0, 180.0, 0.0, 0.0, 50.0, 50.0, 50.0);
robot.MoveL(400.0, 0.0, 300.0, 180.0, 0.0, 0.0, 50.0, 50.0, -1.0); // 最后一个点阻塞
robot.Disconnect();
}
/**
* @brief 示例3关节运动 MoveJ通过末端位姿
*/
void Example_MoveJByPose()
{
FairinoRobotWrapper robot;
if (robot.Connect() != ERR_SUCCESS) {
return;
}
robot.RobotEnable(1);
// 通过目标末端位姿进行关节运动
// 内部会自动进行逆运动学计算
errno_t ret = robot.MoveJByPose(
400.0, 0.0, 300.0, // 目标位置 (mm)
180.0, 0.0, 0.0, // 目标姿态 (deg)
50.0, // 速度百分比
50.0, // 加速度百分比
-1.0 // blendT = -1.0 表示运动到位(阻塞)
);
if (ret != ERR_SUCCESS) {
std::cout << "MoveJByPose失败: " << robot.GetLastErrorString() << std::endl;
}
robot.Disconnect();
}
/**
* @brief 示例4关节运动 MoveJ通过关节角度
*/
void Example_MoveJByJoint()
{
FairinoRobotWrapper robot;
if (robot.Connect() != ERR_SUCCESS) {
return;
}
robot.RobotEnable(1);
// 直接指定各关节角度进行运动
errno_t ret = robot.MoveJByJoint(
0.0, -45.0, 90.0, // J1, J2, J3 (deg)
0.0, 45.0, 0.0, // J4, J5, J6 (deg)
50.0, // 速度百分比
50.0, // 加速度百分比
-1.0 // blendT = -1.0 表示运动到位(阻塞)
);
if (ret != ERR_SUCCESS) {
std::cout << "MoveJByJoint失败: " << robot.GetLastErrorString() << std::endl;
}
robot.Disconnect();
}
/**
* @brief 示例5获取机器人状态
*/
void Example_GetRobotStatus()
{
FairinoRobotWrapper robot;
if (robot.Connect() != ERR_SUCCESS) {
return;
}
// 获取当前关节位置
double j1, j2, j3, j4, j5, j6;
if (robot.GetCurrentJointPos(j1, j2, j3, j4, j5, j6) == ERR_SUCCESS) {
std::cout << "当前关节位置(deg):" << std::endl;
std::cout << " J1=" << j1 << ", J2=" << j2 << ", J3=" << j3 << std::endl;
std::cout << " J4=" << j4 << ", J5=" << j5 << ", J6=" << j6 << std::endl;
}
// 获取当前TCP位姿
double x, y, z, rx, ry, rz;
if (robot.GetCurrentTCPPose(x, y, z, rx, ry, rz) == ERR_SUCCESS) {
std::cout << "当前TCP位姿:" << std::endl;
std::cout << " 位置(mm): x=" << x << ", y=" << y << ", z=" << z << std::endl;
std::cout << " 姿态(deg): rx=" << rx << ", ry=" << ry << ", rz=" << rz << std::endl;
}
// 获取完整的机器人实时状态
ROBOT_STATE_PKG state;
if (robot.GetRobotState(state) == ERR_SUCCESS) {
std::cout << "机器人状态:" << std::endl;
std::cout << " 程序状态: " << (int)state.program_state << std::endl;
std::cout << " 运动状态: " << (int)state.robot_state << std::endl;
std::cout << " 使能状态: " << state.rbtEnableState << std::endl;
std::cout << " 运动到位: " << state.motion_done << std::endl;
}
// 检查错误码
int maincode, subcode;
if (robot.GetErrorCode(maincode, subcode) == ERR_SUCCESS) {
if (maincode != 0 || subcode != 0) {
std::cout << "机器人错误码: 主=" << maincode << ", 子=" << subcode << std::endl;
}
}
robot.Disconnect();
}
/**
* @brief 示例6运动学计算
*/
void Example_Kinematics()
{
FairinoRobotWrapper robot;
if (robot.Connect() != ERR_SUCCESS) {
return;
}
// 正运动学:根据关节角度计算末端位姿
double x, y, z, rx, ry, rz;
if (robot.ForwardKinematics(0.0, -45.0, 90.0, 0.0, 45.0, 0.0,
x, y, z, rx, ry, rz) == ERR_SUCCESS) {
std::cout << "正运动学结果:" << std::endl;
std::cout << " 位置(mm): x=" << x << ", y=" << y << ", z=" << z << std::endl;
std::cout << " 姿态(deg): rx=" << rx << ", ry=" << ry << ", rz=" << rz << std::endl;
}
// 逆运动学:根据末端位姿计算关节角度
double j1, j2, j3, j4, j5, j6;
if (robot.InverseKinematics(400.0, 0.0, 300.0, 180.0, 0.0, 0.0,
j1, j2, j3, j4, j5, j6) == ERR_SUCCESS) {
std::cout << "逆运动学结果:" << std::endl;
std::cout << " 关节角度(deg): J1=" << j1 << ", J2=" << j2 << ", J3=" << j3 << std::endl;
std::cout << " J4=" << j4 << ", J5=" << j5 << ", J6=" << j6 << std::endl;
} else {
std::cout << "逆运动学计算失败: " << robot.GetLastErrorString() << std::endl;
}
robot.Disconnect();
}
/**
* @brief 示例7设置坐标系
*/
void Example_SetCoordinates()
{
FairinoRobotWrapper robot;
if (robot.Connect() != ERR_SUCCESS) {
return;
}
// 设置工具坐标系 (工具中心点相对于末端法兰的位姿)
robot.SetToolCoord(1, 0.0, 0.0, 100.0, 0.0, 0.0, 0.0);
// 设置工件坐标系 (工件坐标系相对于基坐标系的位姿)
robot.SetWObjCoord(1, 500.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0);
// 使用指定的工具和工件坐标系进行运动
robot.MoveL(100.0, 0.0, 50.0, 180.0, 0.0, 0.0, 50.0, 50.0, -1.0, 1, 1);
robot.Disconnect();
}
/**
* @brief 示例8错误处理和恢复
*/
void Example_ErrorHandling()
{
FairinoRobotWrapper robot;
if (robot.Connect() != ERR_SUCCESS) {
std::cout << "连接失败: " << robot.GetLastErrorString() << std::endl;
return;
}
// 检查并清除错误
int maincode, subcode;
robot.GetErrorCode(maincode, subcode);
if (maincode != 0) {
std::cout << "检测到错误,正在清除..." << std::endl;
robot.ResetAllError();
}
// 使能机器人
robot.RobotEnable(1);
// 执行运动
errno_t ret = robot.MoveL(400.0, 0.0, 300.0, 180.0, 0.0, 0.0);
if (ret != ERR_SUCCESS) {
std::cout << "运动失败: " << robot.GetLastErrorString() << std::endl;
robot.StopMotion();
robot.ResetAllError();
}
// 等待运动完成
uint8_t motionDone = 0;
while (motionDone == 0) {
robot.GetMotionDone(motionDone);
robot.Wait(100);
}
std::cout << "运动完成" << std::endl;
robot.Disconnect();
}
int main(int argc, char* argv[])
{
std::cout << "=== FairinoRobotWrapper 使用示例 ===" << std::endl;
return 0;
}