Demo演示(C、C++):
多机械臂控制操作示例 1. 项目介绍
本项目使用睿尔曼C++开发包完成多机械臂连接、机械臂版本获取、API版本获取、movej运动、moveL运动、关闭连接。
2. 代码结构
RMDemo_DoubleControl
├── build/ <- CMake构建生成的输出目录(如Makefile、构建文件等)
├── data/
│ └── robot_log.txt <- 日志、轨迹文件等数据文件目录(在执行过程中生成)
├── Robotic_Arm/ <- 睿尔曼机械臂二次开发包
│ ├── include/
│ │ ├── rm_define.h <- 机械臂的定义
│ │ └── rm_interface.h <- 机械臂API的接口头文件
│ └── lib/
│ ├── api_cpp.dll <- Windows的API库
│ ├── api_cpp.lib <- Windows的API库
│ └── libapi_cpp.so <- Linux x86的API库
├── src/ <- 源文件存放目录
│ ├── main.c <- 主要功能的源文件
├── run.bat <- 快速运行脚本,Windows为bat脚本
├── run.sh <- 快速运行脚本,Linux为shell脚本
├── CMakeLists.txt <- 项目的顶层CMake配置文件
├── README.md <- 为示例工程提供详细的文档
3.项目下载
通过链接下载 RM_API2
到本地:开发包下载,进入RM_API2\Demo\RMDemo_Cpp
目录,可找到RMDemo_DoubleControl
。
4. 环境配置
操作系统:Ubuntu 24.04或更高版本。
编译器:GCC 13.3.0或更高版本 (或任何其他兼容的C编译器)。
依赖库:
- CMake 3.28.3或更高版本。
- RMAPI库(包含在
Robotic_Arm/lib
目录中)。
头文件依赖:
#include <stdio.h>
#include <iostream>
#include <thread>
#include <string.h>
#include "rm_service.h"
#ifdef _WIN32
#include <windows.h>
#define SLEEP_MS(ms) Sleep(ms)
#define SLEEP_S(s) Sleep((s) * 1000)
#else
#include <unistd.h>
#define SLEEP_MS(ms) usleep((ms) * 1000)
#define SLEEP_S(s) sleep(s)
#endif
5. 注意事项
- 该Demo以RM65-B型号机械臂为例,请根据实际情况修改代码中的数据。
- 在设置
start_pose
时注意限位,设置合理的数值
start_pose = { {0.3f, 0.1f, 0.4f}, {0.0f, 0.0f, 0.0f, 0.0f}, {3.141f, 0.0f, 0.0f} };
6. 使用指南
6.1 设置IP地址和端口号
const char* ip1 = "192.168.1.18";
int port1 = 8080;
const char* ip2 = "192.168.1.21";
int port2 = 8080;
6.2 启动线程(分别传入task_id=1和task_id=2)
std::thread arm1_thread(arm_task, ip1, port1, 1); // 机械臂1执行第一套动作
std::thread arm2_thread(arm_task, ip2, port2, 2); // 机械臂2执行第二套动作
6.3 定义两套动作的参数
第一套动作参数
float temp_joint1[ARM_DOF] = { 0.0f, 0.5f, 0.3f, 0.0f, 0.2f, 0.0f, 0.1f };
memcpy(joint_angles, temp_joint1, sizeof(temp_joint1));
start_pose = { {0.3f, 0.1f, 0.4f}, {0.0f, 0.0f, 0.0f, 0.0f}, {3.141f, 0.0f, 0.0f} };
target_pose = { {0.2f, 0.1f, 0.3f}, {0.0f, 0.0f, 0.0f}, {3.141f, 0.0f, 0.0f} };
loop_count = 2;
move_speed = 20;
第二套动作参数
float temp_joint2[ARM_DOF] = { 0.2f, -0.3f, 0.1f, 0.5f, -0.2f, 0.3f, 0.0f };
memcpy(joint_angles, temp_joint2, sizeof(temp_joint2));
start_pose = { {0.3f, 0.1f, 0.4f}, {0.0f, 0.0f, 0.0f, 0.0f}, {3.141f, 0.0f, 0.0f} };
target_pose = { {0.25f, -0.1f, 0.35f}, {0.0f, 0.0f, 0.0f}, {3.141f, 0.0f, 0.0f} };
loop_count = 3;
move_speed = 15;
6.4 根据任务选择不同的运动函数
if (task_id == 1) {
// 第一套动作:
result = arm_service.rm_movel(robot_handle, target_pose, move_speed + 10, 0, 0, 1);
}
else {
// 第二套动作:
result = arm_service.rm_movel(robot_handle, target_pose, move_speed + 10, 0, 0, 1);
}
6.5 断开与两个机械臂的连接
result = arm_service.rm_delete_robot_arm(robot_handle);
check_result(result, "Failed to disconnect the robot arm");
printf("Task %d completed for %s:%d\n", task_id, ip, port);
7. 许可证信息
- 本项目遵循MIT许可证。