Skip to content

多机械臂控制操作示例

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. 注意事项

  1. 该Demo以RM65-B型号机械臂为例,请根据实际情况修改代码中的数据。
  2. 在设置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许可证。