睿尔曼超轻量仿人机械臂--透传简介与使用

目录

一. 透传简介

二. 提供哪些透传接口

1. 角度透传

功能描述

功能备注

JSON协议示例及说明

API接口说明及应用实例

C语言调用接口实例

2. 位姿透传

功能描述

功能备注

JSON协议示例及说明

API接口说明及应用实例


一. 透传简介

透传是指用户自己使用上位机进行轨迹规划,然后将各关节的角度直接下发给控制器,不经过控制器的处理,各关节直接运行。机械臂运行的效果直接依赖于用户轨迹规划的水平。

透传的主要应用场景有验证用户算法或者结合视觉,在非结构环境下做动态轨迹规划实现抓取或者避障。

本账号涉及的示例项目网盘链接如下:

链接:https://pan.baidu.com/s/1B_NBbbry_N-xUK83_ij5OA?pwd=exbr

提取码:exbr

二. 提供哪些透传接口

1. 角度透传

功能描述

movej_canfd:角度通过CANFD透传给机械臂,不需控制器规划。

功能备注

        透传周期越快,控制效果越好、越平顺。基础系列WIFI和网口模式透传周期最快20ms,USB和RS485模式透传周期最快10ms。高速网口的透传周期最快也可到10ms,不过在使用该高速网口前,需要使用指令打开配置。另外I系列有线网口周期最快可达5ms。

JSON协议示例及说明

发送内容:{"command":"movej_canfd","joint":[1000,0,20000,30000,0,20000]}

说明:角度透传到CANFD,目标关节角度:[1°,0°,20°,30°,0,20°]

返回值格式:{s:s,s: [i,i,i,i,i,i],s:i}

返回值示例:{"state":"joint_state ","joint":[10,20,30,40,50,60], "arm_err":0}

arm_err:若为0,则代表系统正常,指令正常运行;若为其他错误,则反馈相应错误代码,指令不执行。

API接口说明及应用实例

/// \brief Movej_CANFD 角度不经规划,直接通过CANFD透传给机械臂
/// \param ArmSocket socket句柄
/// \param joint 关节1~7目标角度数组
/// \return 0-成功,失败返回:错误码, rm_define.h查询.
/// 只要控制器运行正常并且目标角度在可达范围内,机械臂立即返回成功指令,此时机械臂可能仍在运行;
/// 若有错误,立即返回失败指令。
RM_BASESHARED_EXPORT int Movej_CANFD(SOCKHANDLE ArmSocket, const float *joint);

C语言调用接口实例

此处为QT软件编写的示例(项目文件请参考网盘链接)

1.#include "mainwindow.h"
2.#include "ui_mainwindow.h"
3.#include <QDebug>
4.
5.MainWindow::MainWindow(QWidget *parent) :
6.    QMainWindow(parent),
7.    ui(new Ui::MainWindow)
8.{
9.    ui->setupUi(this);
10.}
11.
12.MainWindow::~MainWindow()
13.{
14.    delete ui;
15.}
16.
17.
18.void MainWindow::on_Disconnect_clicked()
19.{
20.
21.    Arm_Socket_Close(m_sockhand);
22.
23.}
24.
25.void MCallback(CallbackData data)
26.{
27.    qDebug() << "MCallback MCallback MCallback";
28.    // 判断接口类型
29.    switch(data.codeKey)
30.    {
31.        case MOVEJ_CANFD_CB: // 角度透传
32.            qDebug() << "透传结果:" << data.errCode;
33.            qDebug() << "当前角度:" << data.joint[0] << data.joint[1] << data.joint[2] << data.joint[3] << data.joint[4] << data.joint[5];
34.        break;
35.        case MOVEP_CANFD_CB: // 位姿透传
36.            qDebug() << "透传结果:" << data.errCode;
37.            qDebug() << "当前角度:" << data.joint[0] << data.joint[1] << data.joint[2] << data.joint[3] << data.joint[4] << data.joint[5];
38.            qDebug() << "当前位姿:" << data.pose.px << data.pose.py << data.pose.pz << data.pose.rx << data.pose.ry << data.pose.rz;
39.        break;
40.        case FORCE_POSITION_MOVE_CB: // 力位混合透传
41.            qDebug() << "透传结果:" << data.errCode;
42.        break;
43.    }
44.
45.}
46.void MainWindow::on_Test_MoveJ_clicked()
47.{
48.    int ret = -1;
49.
50.    float mJoint[7];
51.    POSE mPose;
52.    uint16_t mArmErr[7];
53.    uint16_t mSysErr[7];
54.    Get_Current_Arm_State(m_sockhand,mJoint, &mPose, mArmErr, mSysErr);
55.    ui->textEdit->append(QString("POSE: px:[%1] py:[%2] pz:[%3] rx[%4] ry:[%5] rz:[%6]")
56.                          .arg(mPose.px).arg(mPose.py).arg(mPose.pz)
57.                          .arg(mPose.rx).arg(mPose.ry).arg(mPose.rz));
58.
59.    for(int i = 1;i<=50;i++)
60.    {
61.        mJoint[5]+=1;
62.        ret = Movej_CANFD(m_sockhand,mJoint);
63.        Sleep(20);
64.    }
65.    ui->textEdit->append(QString(" Movej_CANFD: [%1]").arg(ret));
66.}
67.
68.
69.
70.void MainWindow::on_connect_Socket_clicked()
71.{
72.    // 连接服务器 返回全局句柄
73.    RM_API_Init(65,MCallback);
74.    m_sockhand = Arm_Socket_Start((char *)"192.168.1.18", 8080, 5000);
75.
76.}

2. 位姿透传

功能描述

目标位姿透传给机械臂,不需控制器规划

功能备注

        目标位姿透传到机械臂,控制器进行逆解后,若逆解存在并且逆解出的各角度与当前角度未有较大差值,则直接下发给关节执行,不再进行轨迹规划。适用于用户需要对位姿进行周期性调整的场景,如视觉伺服等。

        透传周期越快,控制效果越好、越平顺。基础系列WIFI和网口模式透传周期最快20ms,USB和RS485模式透传周期最快10ms。高速网口的透传周期最快也可到10ms,不过在使用该高速网口前,需要使用指令打开配置。另外I系列有线网口周期最快可达5ms。

JSON协议示例及说明

发送内容:{"command":"movep_canfd","pose":[100000,200000,30000,400,500,600]}

说明:pose:目标位姿,位置精度:0.001mm,姿态精度:0.001rad

目标位置:x:0.1m,y:0.2m,z:0.03m

目标姿态:rx:0.4rad,ry:0.5rad,rz:0.6rad

目标位姿为当前工具在当前工作坐标系下的数值。

返回值格式:{s:s,s: [i,i,i,i,i,i],s: [i,i,i,i,i,i],s:i}

返回值示例:{"state":"pose_state","pose":[10,20,30,40,50,60],"joint":[10,20,30,40,50,60], "arm_err":0}

pose:当前位姿,位置精度:0.001mm,姿态精度:0.001rad;joint:当前关节角度,关节精度:0.001°;arm_err:若为 0,则代表系统正常,指令正常运行;若为其他错误,则反馈相应错误代码,指令不执行。

API接口说明及应用实例

1.///
2./// \brief Movep_CANFD 位姿不经规划,直接通过CANFD透传给机械臂
3./// \param ArmSocket socket句柄
4./// \param pose 位姿
5./// \return 0-成功,失败返回:错误码, rm_define.h查询
6.///
7.RM_BASESHARED_EXPORT int Movep_CANFD(SOCKHANDLE ArmSocket, POSE pose);

C语言调用接口实例

此处为QT软件编写的示例(项目文件请参考网盘链接)

1.#include "mainwindow.h"
2.#include "ui_mainwindow.h"
3.#include <QDebug>
4.
5.MainWindow::MainWindow(QWidget *parent) :
6.    QMainWindow(parent),
7.    ui(new Ui::MainWindow)
8.{
9.    ui->setupUi(this);
10.}
11.
12.MainWindow::~MainWindow()
13.{
14.    delete ui;
15.}
16.void MainWindow::on_Disconnect_clicked()
17.{
18.    Arm_Socket_Close(m_sockhand);
19.}
20.void MCallback(CallbackData data)
21.{
22.    qDebug() << "MCallback MCallback MCallback";
23.    // 判断接口类型
24.    switch(data.codeKey)
25.    {
26.        case MOVEJ_CANFD_CB: // 角度透传
27.            qDebug() << "透传结果:" << data.errCode;
28.            qDebug() << "当前角度:" << data.joint[0] << data.joint[1] << data.joint[2] << data.joint[3] << data.joint[4] << data.joint[5];
29.        break;
30.        case MOVEP_CANFD_CB: // 位姿透传
31.            qDebug() << "透传结果:" << data.errCode;
32.            qDebug() << "当前角度:" << data.joint[0] << data.joint[1] << data.joint[2] << data.joint[3] << data.joint[4] << data.joint[5];
33.            qDebug() << "当前位姿:" << data.pose.px << data.pose.py << data.pose.pz << data.pose.rx << data.pose.ry << data.pose.rz;
34.        break;
35.        case FORCE_POSITION_MOVE_CB: // 力位混合透传
36.            qDebug() << "透传结果:" << data.errCode;
37.        break;
38.    }
39.
40.}
41.void MainWindow::on_Test_MoveJ_clicked()
42.{
43.    int ret = -1;
44.    float mJoint[7];
45.    POSE mPose;
46.    uint16_t mArmErr[7];
47.    uint16_t mSysErr[7];
48.    Get_Current_Arm_State(m_sockhand,mJoint, &mPose, mArmErr, mSysErr);
49.    ui->textEdit->append(QString("POSE: px:[%1] py:[%2] pz:[%3] rx[%4] ry:[%5] rz:[%6]")
50.                          .arg(mPose.px).arg(mPose.py).arg(mPose.pz)
51.                          .arg(mPose.rx).arg(mPose.ry).arg(mPose.rz));
52.
53.    for(int i = 1;i<=50;i++)
54.    {
55.        mJoint[5]+=1;
56.        ret = Movej_CANFD(m_sockhand,mJoint);
57.        Sleep(20);
58.    }
59.    ui->textEdit->append(QString(" Movej_CANFD: [%1]").arg(ret));
60.}
61.void MainWindow::on_connect_Socket_clicked()
62.{
63.    // 连接服务器 返回全局句柄
64.    RM_API_Init(65,MCallback);
65.    m_sockhand = Arm_Socket_Start((char *)"192.168.1.19", 8080, 5000);
66.    ui->textEdit->append(QString(" 已连接"));
67.}
68.void MainWindow::on_pushButton_clicked()
69.{
70.    int ret = -1;
71.
72.    float mJoint[7];
73.    POSE mPose;
74.    uint16_t mArmErr[7];
75.    uint16_t mSysErr[7];
76.    Get_Current_Arm_State(m_sockhand,mJoint, &mPose, mArmErr, mSysErr);
77.    ui->textEdit->append(QString("POSE: px:[%1] py:[%2] pz:[%3] rx[%4] ry:[%5] rz:[%6]")
78.                          .arg(mPose.px).arg(mPose.py).arg(mPose.pz)
79.                          .arg(mPose.rx).arg(mPose.ry).arg(mPose.rz));
80.    for(int i = 1;i<=100;i++)
81.         {
82.             mPose.pz-=0.001;
83.             ret = Movep_CANFD(m_sockhand,mPose);
84.             Sleep(20);
85.         }
86.         ui->textEdit->append(QString("POSE: px:[%1] py:[%2] pz:[%3] rx[%4] ry:[%5] rz:[%6]")
87.                               .arg(mPose.px).arg(mPose.py).arg(mPose.pz)
88.                               .arg(mPose.rx).arg(mPose.ry).arg(mPose.rz));
89.}

由于机械臂相关软件版本不定期更新,如果你使用的机械臂软件接口或协议与本文有出入,请联系官方技术人员及时更新。

### 关于机械的视觉系统开发 超轻量仿机械支持多种高级功能,其中包括基于计算机视觉的应用场景。其视觉系统的实现通常依赖外部摄像头设备以及图像处理算法的支持[^1]。 #### 视觉系统的主要应用场景 - **物体识别定位**:通过集成深度学习框架(如TensorFlow或PyTorch),可以训练模型来检测特定目标并计算其位置坐标。 - **路径规划辅助**:利用视觉数据优化机械的动作轨迹,确保操作更加精准高效。 - **手势控制交互**:借助OpenCV库或其他专用SDK捕捉体动作信号作为输入指令驱动机械运动。 #### 开发文档获取途径 对于具体详细的API说明和技术指导材料,则需访问制造商官网下载专区查找最新版《开发者手册》;另外也可以加入官方技术支持群组获得更多帮助资源链接地址等实用信息。 #### 示例代码展示 下面给出一段简单的Python脚本用于演示如何读取来自USB连接相机的画面帧,并将其递给预先定义好的神经网络模型进行分类预测: ```python import cv2 from tensorflow.keras.models import load_model def init_camera(): cap = cv2.VideoCapture(0) if not cap.isOpened(): raise IOError("Cannot open webcam") return cap def preprocess_frame(frame): resized_img = cv2.resize(frame, (224, 224)) normalized_img = resized_img / 255.0 reshaped_img = normalized_img.reshape((1,) + normalized_img.shape) return reshaped_img if __name__ == "__main__": model_path = 'path_to_your_trained_model.h5' loaded_model = load_model(model_path) video_capture = init_camera() while True: ret, frame = video_capture.read() processed_image = preprocess_frame(frame) prediction_result = loaded_model.predict(processed_image)[0] label_index = int(prediction_result.argmax()) confidence_score = float(max(prediction_result)) font = cv2.FONT_HERSHEY_SIMPLEX bottomLeftCornerOfText = (10,500) fontScale = 1 fontColor = (255,255,255) lineType = 2 text_display = f'Label:{label_index}, Confidence:{confidence_score:.2f}' cv2.putText(frame,text_display, bottomLeftCornerOfText, font, fontScale, fontColor, lineType) cv2.imshow('Frame',frame) key_press_event = cv2.waitKey(1) & 0xFF if key_press_event == ord('q'): break video_capture.release() cv2.destroyAllWindows() ``` 上述程序片段仅作为一个基础示例供参考,在实际项目部署过程中可能还需要考虑更多因素比如实时性能调优等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值