【ROS2实体机械臂驱动】rokae xCoreSDK Python测试使用

news2025/6/2 17:41:23

【ROS2实体机械臂驱动】rokae xCoreSDK Python测试使用

文章目录

  • 前言
  • 正文
    • 配置环境
    • 下载源码
    • 配置环境变量
    • 测试运行
    • 修改点说明
    • 实际运行情况
  • 参考

前言

本文用来记录 xCoreSDK-Python的调用使用1

正文

配置环境

配置开发环境,这里使用conda做python环境管理,安装可以参考

anaconda、miniconda、conda的关系及miniconda安装-CSDN博客2

初始化python环境,根据sdk的说明,依赖于python3.8环境

# 创建环境
$ conda create --name xCorePy python=3.8

# 激活虚拟环境
$ conda activate xCorePy

# 配置镜像源加速
$ pip config set global.index-url https://mirrors.aliyun.com/pypi/simple

下载源码

这里一定要使用git lfs下载源码,内部有几个so文件是使用lfs保存的。

$ mkdir -p ~/workspace/rokae_projects
$ cd ~/workspace/rokae_projects
$ git lfs clone https://github.com/RokaeRobot/xCoreSDK-Python.git
$ cd xCoreSDK-Python

配置环境变量

$ export PYTHONPATH=/home/dev/workspace/rokae_projects/xCoreSDK-Python/rokae_SDK_linux_v0.1.6_py38/lib:$PYTHONPATH

测试运行

注意: 应将库文件所在路径添加至运行脚本可识别的路径中。将脚本中的ip修改为连接机器人所设置的ip。

提醒: 到这一步发现robot.connectToRobot(ec)没有权限,需要找厂家要license,可以找买机械臂的代理,拿到后自行插入优盘导入即可。

# 运行 firstexample.py
$ cd ~/workspace/rokae_projects/xCoreSDK-Python/rokae_SDK_linux_v0.1.6_py38/example
$ python firstexample.py

修改点说明

from robot import *
from convert_tools import *
import time

from math import pi   # 增加导入pi定义


def waitRobot(robot):
    running = True
    while running:
        time.sleep(0.1)
        ec = {}
        st = robot.operationState(ec)
        if st == rokae.OperationState.idle.value or st == rokae.OperationState.unknown.value:
            running = False


def main():
    ip = "192.168.8.160"	# 修改本地机械臂对应的IP. BingLee 2025.5.28
    ec = {}

    # 下述类根据实际机械臂情况自行修改. BingLee 2025.5.28
    #
    # XMateRobot(ip) # 协作机械臂
    # xMateErProRobot(ip) # 协作7轴机型
    # StandardRobot(ip) # 连接工业6轴机型
    # PCB4Robot(ip) # 连接PCB4轴机型
    # PCB3Robot(ip) # 连接PCB3轴机型

    with StandardRobot(ip) as robot: # 这里修改为博主使用的工业臂. BingLee 2025.5.28
        # 连接机器人

        robot.connectToRobot(ec)
        # 设置机器人上下电状态-上电
        robot.setPowerState(True, ec)
        # 查询机器人状态
        power = robot.powerState(ec)
        print("当前上下电状态为:", power)
        time.sleep(2)
        # 设置机器人上下电状态-下电
        robot.setPowerState(False, ec)
        power = robot.powerState(ec)
        print("当前上下电状态为:", power)

        ################################################ 2. 查询信息 #########################################################
        # 获取机器人的基本信息
        info = robot.robotInfo(ec)
        print("机器人轴数:", info["joint_num"], "机型:", info["type"], "控制器版本:", info["version"])
        # 获取SDK版本
        print("SDK版本:", robot.sdkVersion(ec))
        # 获取机器人的上下电状态
        power = robot.powerState(ec)
        print("当前上下电状态为:", power)
        # 获取机器人的操作模式
        mode = robot.operateMode(ec)
        print("当前机器人的操作模式为:", mode)
        # 获取机器人运行状态
        state = robot.operationState(ec)
        print("当前机器人的运行状态为:", state)

        ######################################## 3. 获取机器人当前位姿,轴角度,基坐标系等信息 #####################################
        # 获取关节位置
        joint_pos = robot.jointPos(ec)
        print("当前关节位置:", joint_pos)
        # 获取关节速度
        joint_vel = robot.jointVel(ec)
        print("当前关节速度:", joint_vel)
        # 获取关节力矩
        joint_torque = robot.jointTorque(ec)
        print("当前关节力矩:", joint_torque)
        # 获取法兰位姿
        posture = robot.flangePos(ec)
        print("当前法兰位姿:", posture)
        # 获取基坐标系-----原model()类
        base = robot.baseFrame(ec)
        print("当前基坐标系:", base)
        # 获取当前的工具坐标系
        toolset = robot.toolset(ec)
        print("当前的工具坐标系为:", toolset)
        # 设置新的坐标系
        # coor_new = {'end': {'rot': [0, 0, 0], 'trans': [0.0, 0.0, -0.01]}, 'load': {'cog': [0.0, 0.0, 0.0],
        #                                                                            'inertia': [0.0, 0.0, 0.0], 'mass': 0.0},
        #             'ref': {'rot': [0.0, -0.0, 0.0], 'trans': [0.0, 0.0, 0.0]}}
        # robot.setToolset(coor_new, ec)
        # 获取当前的工具坐标系
        # toolset = robot.toolset(ec)
        # print("修改后的工具坐标系为:", toolset)

        # 获取法兰位姿
        posture_ = robot.flangePos(ec)
        print("修改坐标系后的法兰位姿:", posture_)

        # zero = zeroToolset()
        # robot.setToolset(zero, ec)

        ############################################## 4. 计算正解和逆解 #####################################################
        # 计算正解->输入一个与当前机型轴数相同的List,返回一个当前位姿的list
        point = [10, 20, 30, 40, 50, 10]
        point = degree2rad(point)
        print(point)
        fk = robot.calcFK(point, ec)
        print("计算正解为:", fk)

        # 计算逆解->输入一个位姿,返回一个轴角的list
        # pos = [0.5930779237738772, -0.060094684364914094, 0.4260427869095114, 3.110893947990362, 0.04429035357891989, -2.9729572573550245]
        # ik = robot.calcIK(pos, ec)
        # # ik = rad2degree(ik)
        # print("计算逆解为:", ik)

        ############################################## 5. 查询DO和DI ########################################################
        # 查询端口1_0的DO值
        do = robot.getDO(1, 0, ec)
        print(message(ec))
        print("DO1_0当前的信号值为:", do)
        # 查询端口1_0的DI值
        di = robot.getDI(0, 0, ec)
        print("DI1_0当前的信号值为:", di)
        # 将DO1_0的值设为false
        robot.setDO(0, 0, False, ec)
        # 查询端口1_0的DO值
        do = robot.getDO(0, 0, ec)
        print("DO0_0修改后信号值为:", do)
        robot.setDO(0, 0, True, ec)

        ############################################## 6. 断开连接再重连 #####################################################
        # 机器人断开连接
        robot.disconnectFromRobot(ec)
        time.sleep(2)
        # 机器人再次连接
        robot.connectToRobot(ec)

        ############################################## 7. 打开和关闭拖动 ######################################################
        # # 机器人下电,因机器人拖动模式自动上电
        # robot.setPowerState(False, ec)
        # # 将机器人操作模式设为手动
        # robot.setOperateMode(rokae.OperateMode.manual, ec)
        # # 开启拖动
        # robot.enableDrag(rokae.DragParameter.Space.cartesianSpace.value, rokae.DragParameter.Type.freely.value, ec)
        # print("机器人状态:", robot.operationState(ec))
        # time.sleep(2)
        # # 关闭拖动
        # robot.disableDrag(ec)
        # print("机器人状态:", robot.operationState(ec))
        # print("非Drag模式下的上下电模式为:", robot.powerState(ec))
        # time.sleep(2)

        ############################################## 8. 查询工件/工具信息 ###################################################
        # 查询所有工具的信息
        # tool = robot.toolsInfo(ec)
        # print(tool)
        # for name in tool.keys():
        #     print(name, "质量:", tool[str(name)]["load"]["mass"])
        # # 查询所有工件的信息
        # wobj = robot.wobjsInfo(ec)
        # print("查询工件名信息为:")
        # for name in wobj.keys():
        #     print(name)

        ############################################### 9. 运动指令 ########################################################
        robot.setOperateMode(rokae.OperateMode.automatic, ec)
        robot.setPowerState(True, ec)
        robot.moveReset(ec)
        # robot.setDefaultZone(100, ec)
        # robot.setDefaultSpeed(100, ec)
        # p0 = robot.flangePos(ec)
        # print(p0)

        # ############################################### 10. Move L 点位测试/ NB4 运动指令 ########################################################
        # 这里博主均改为使用 MoveAbsJCommand命令,数值使用弧度描述. BingLee 2025.5.28
        p1 = MoveAbsJCommand(
            [0, -pi/4, 0, 0, pi/2, pi],
            1000, 0)
        # p1.offset = [0.1, 0, 0, 0, 0, 0]

        p2 = MoveAbsJCommand(
            [pi/2, 0, pi/4, 0, 0, 0],
            1000, 0)
        # p2.offset = [0, 0, 0.01, 0, 0, 0]

        p3 = MoveAbsJCommand(
            [-pi/2, -pi/4, 0, 0, pi/2, pi],
            1000, 0)

        p4 = MoveAbsJCommand(
            [0, -pi/4, pi/4, 0, 0, 0],
            1000, 0)
        # p1.offset = [0.1, 0, 0, 0, 0, 0]

        p5 = MoveAbsJCommand(
            [0, 0, 0, 0, pi/2, 0],
            500, 0)

        while True:
            cmd = input("please input"
                        " 'm(start move)', 'p(pause)', 'c(continue)', 'q(break)', 'i(check)', 's(stop)','a(adjust)',"
                        "'r(reset)', d(drag), k(stop_drag) ")
            if cmd == 'm':
                print("start move")
                robot.executeCommand([p1, p2, p3, p4, p5], ec)
                robot.moveStart(ec)
                print(ec)
            elif cmd == 'p':
                print("suspend")
                robot.pause(ec)
            elif cmd == 'd':
                print("drag")
                robot.setOperateMode(rokae.OperateMode.manual, ec)
                robot.enableDrag(rokae.DragParameter.Space.jointSpace.value, rokae.DragParameter.Type.freely.value, ec)
            elif cmd == 'k':
                print("kill drag")
                robot.disableDrag(ec)
            elif cmd == 'c':
                print("continue move")
                robot.moveStart(ec)
            elif cmd == 'a':
                print("adjust speed percentage 0.5")
                robot.adjustSpeedOnline(0.1, ec)
            elif cmd == 'i':
                print("current pos id:", robot.getPointPos(ec))
            elif cmd == 'r':
                robot.moveReset(ec)
            elif cmd == 's':
                robot.stop(ec)
            else:
                print("stop")
                break
        robot.stop(ec)
        time.sleep(1)
        robot.setPowerState(False, ec)
        robot.disconnectFromRobot(ec)


#
if __name__ == '__main__':
    main()

运行输出结果:

$ python3 firstexample.py 
当前上下电状态为: 0
当前上下电状态为: 1
机器人轴数: 6 机型: XB10s-R1206-3B 控制器版本: 2.3.2
SDK版本: 0.1.7(Beta)
当前上下电状态为: 1
当前机器人的操作模式为: 0
当前机器人的运行状态为: 0
当前关节位置: [-1.1489009000176548e-05, 1.4887235907275245e-06, 1.6342124870940784e-05, 3.834951969714103e-06, 1.5708015998538547, -5.086011055912068e-05]
当前关节速度: [0.00010657046279474108, -0.0, 0.000355366933557185, 0.0, -0.0, -0.0]
当前关节力矩: [0.0, -0.0, 0.0, 0.0, -0.0, -0.0]
当前法兰位姿: [0.6140099673622327, -6.736065028031115e-06, 0.9639800086642404, 3.1415888174476487, -2.3400841886472892e-05, -3.141553282467999]
当前基坐标系: [0.0, 0.0, 0.0, 0.0, -0.0, 0.0]
当前的工具坐标系为: {'end': {'name': '', 'rot': [0.0, -0.0, 0.0], 'trans': [0.0, 0.0, 0.0]}, 'load': {'cog': [0.0, 0.0, 0.0], 'inertia': [0.0, 0.0, 0.0], 'mass': 0.0}, 'ref': {'name': '', 'rot': [0.0, -0.0, 0.0], 'trans': [0.0, 0.0, 0.0]}}
修改坐标系后的法兰位姿: [0.6140099530347417, -6.7360648634224415e-06, 0.9639798350653594, 3.141588817432537, -2.369797142919661e-05, -3.1415532824679984]
[0.17453292222222222, 0.34906584444444444, 0.5235987666666666, 0.6981316888888889, 0.8726646111111112, 0.17453292222222222]
计算正解为: [0.6142222356255438, 0.14980394927718851, 0.47920904205188103, 2.749132677334611, -0.3447416415079533, 2.705140663241381]
操作成功完成
DO1_0当前的信号值为: False
DI1_0当前的信号值为: None
DO0_0修改后信号值为: None
please input 'm(start move)', 'p(pause)', 'c(continue)', 'q(break)', 'i(check)', 's(stop)','a(adjust)','r(reset)', d(drag), k(stop_drag) -  m

输入下述指令控制:

  • m:启动运动轨迹
  • p:暂停
  • c:继续
  • q:中断程序
  • i:输出当前位置信息
  • r:清理robot运动点寄存
  • s:停止

这里博主常用的是m、p、c、q、i指令。

实际运行情况

请添加图片描述

参考

中间还涉及官方的其它库,也一并附上345


  1. RokaeRobot/xCoreSDK-Python: Software development Python interfaces for Rokae robots all series ↩︎

  2. anaconda、miniconda、conda的关系及miniconda安装-CSDN博客 ↩︎

  3. RokaeRobot/xCoreSDK-CPP: Software development C++ interfaces for Rokae robots all series, compatible with Linux and Windows. ↩︎

  4. RokaeRobot/xCoreSDK-CSharp: Software development C# interfaces for Rokae robots all series ↩︎

  5. RokaeRobot/xCoreSDK-Android: Software development interfaces for Rokae robots all series, supports Android platform ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2392903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VLC-QT 网页播放RTSP

先看效果图,代码在文章末尾,包含源码,vlc-qt完整的库 环境说明:VS 2017 QTQt5.13.0 MSVC2017 32位 将vlc_install 目录下的bin,include,lib里所有的东西分别放在qt目录下 bin -> C:\Qt\Qt5.13.0\5.13.0\msvc2017\bin include->C:\Qt\Qt5.13.0\5.13.0\msvc201…

【航天远景 MapMatrix 精品教程】08 Pix4d空三成果导入MapMatrix

【航天远景 MapMatrix 精品教程】08 Pix4d空三成果导入MapMatrix 文章目录 【航天远景 MapMatrix 精品教程】08 Pix4d空三成果导入MapMatrix一、资料准备1.去畸变影像2.相机文件3.外方位元素二、创建工程1.新建工程2.导入照片3.编辑相机文件4.编辑外方位元素文件,导入外方位元…

创建型设计模式之Prototype(原型)

创建型设计模式之Prototype(原型) 摘要: Prototype(原型)设计模式通过复制现有对象来创建新对象,避免重复初始化操作。该模式包含Prototype接口声明克隆方法、ConcretePrototype实现具体克隆逻辑&#xff…

JNI开发流程

一. 引言 最近在做一个自己的项目,就是基于FastDDS封装一套JAVA库,让android和java应用可以使用dds的功能。 由于FastDDS是使用C编写的开源库,因此java的类库想要调用FastDDS的接口,需要额外编写一个JNI层的动态库对FastDDS的接口…

STM32G4 电机外设篇(二) VOFA + ADC + OPAMP

目录 一、STM32G4 电机外设篇(二) VOFA ADC OPAMP1 VOFA1.1 VOFA上位机显示波形 2 ADC2.1 用ADC规则组对板载电压和电位器进行采样 3 OPAMP(运放)3.1 结合STM32内部运放和ADC来完成对三相电流的采样3.2 运放电路分析 附学习参考…

微服务难题?Nacos服务发现来救场

文章目录 前言1.什么是服务发现2.Nacos 闪亮登场2.1 服务注册2.2 服务发现 3.Nacos 的优势3.1 简单易用3.2 高可用3.3 动态配置 4.实战演练4.1安装 Nacos4.2 服务注册与发现示例代码(以 Spring Boot 为例) 总结 前言 大家好,我是沛哥儿。今天…

C# 结合PaddleOCRSharp搭建Http网络服务

Windows打开端口: 控制面板 > 系统和安全 > 防火墙> 高级设置 → 入站规则 → 右侧选择 → 新建规则 → 端口 → 协议类型 TCP→ 端口 using System; using System.Drawing; using System.IO; using System.Net; using System.Text; using System.Threadi…

【连接器专题】SD卡座规格书审查需要审哪些方面?

在审查SD卡座规格书时,我们需要考虑哪些方面? 首先在拿到一份SD卡座的详细规格书时,一般供应商给到的规格书中包括了一些基础信息、产品图纸信息、技术参数信息,同时有些供应商会给出产品可靠性测试报告。因此我们会从这几个要素去看规格书。 基础信息 基础信息一般会给变更…

eBest智能价格引擎系统 助力屈臣氏饮料落地「价格大脑」+「智慧通路」数字基建​

从价格策略到终端执行,数字化正在重构饮料行业竞争壁垒! 近日,eBest为屈臣氏饮料提供的智能价格引擎系统已正式上线并投入运营。同时,基于eBest SFA方案且与屈臣氏饮料业务场景深度耦合的Smart Field Operation智慧通路项目正式启…

Kettle 远程mysql 表导入到 hadoop hive

kettle 远程mysql 表导入到 hadoop hive (教学用 ) 文章目录 kettle 远程mysql 表导入到 hadoop hive创建 对象 执行 SQL 语句 -mysql 导出 CSV格式CSV 文件远程上传到 HDFS运行 SSH 命令远程登录 run SSH 并执行 hadoop fs -put 建表和加载数据总结 创…

完整解析 Linux Kdump Crash Kernel 工作原理和实操步骤

完整解析 Linux Kdump Crash Kernel 工作原理和实操步骤 一、前言 在使用 Linux 操作系统进行内核开发或者系统维护时,内核 panic 是最常见的系统崩溃环节。如果想要在内核崩溃后立即分析环境和输出内核内存 dump,Kdump crashkernel 是最接近完美的解…

菜鸟之路Day36一一Web开发综合案例(部门管理)

菜鸟之路Day36一一Web开发综合案例(部门管理) 作者:blue 时间:2025.5.28 文章目录 菜鸟之路Day36一一Web开发综合案例(部门管理)一.环境搭建二.开发规范三.部门管理3.1查询3.2删除3.3新增3.3修改根据id来…

第 1 章:学习起步

1. React Native前置知识要求 在开始学习React Native之前,有一些前置知识你需要了解。不过别担心,我会带你逐步掌握这些内容,让你顺利入门。 1.1. JavaScript是必须掌握的 学习React Native,JavaScript是基础。你需要了解Java…

SQL查询——大厂面试真题

前言 本文总结了SQLite数据库的核心操作要点:1. 基础语法:SQL语句不区分大小写,多语句需用分号分隔,支持多种注释方式2. 表操作:包括创建表(定义主键、非空约束等)、插入/更新/删除数据、添加/…

Linux-pcie ranges介绍

参考链接&#xff1a;https://elinux.org/Device_Tree_Usage#PCI_Host_Bridge pcie bar高低端BAR起始地址介绍 pcie设备树节点 / {compatible "rockchip,rk3588";interrupt-parent <&gic>;#address-cells <2>;#size-cells <2>;pcie3x4: p…

⭐ Unity AVProVideo插件自带播放器 脚本重构 实现视频激活重置功能

一、功能概述 本笔记记录直接修改插件自带的场景播放其中 原始的 MediaPlayerUI 脚本,实现激活时自动重置播放器的功能。 我用的插件版本是 AVPro Video - Ultra Edition 2.7.3 修改后的脚本将具备以下特性: 激活 GameObject 时自动重置播放位置到开头 可配置是否在重置后自…

详解K8s API Server 如何处理请求的?

详解K8s API Server 如何处理请求的? Kubernetes(K8s)是一个强大的容器编排系统,而API Server(kube-apiserver) 是它的核心组件之一。 如果把 K8s 比作一个国家,API Server 就是政府机构,所有资源的创建、修改、删除都要经过它审批! 🎯 API Server 的作用 📌 A…

微调数据处理

1. 数据爬取 我们将爬取的1G文件都保存到all_m_files目录下 查看原始数据文件数量&#xff1a; find /root/all_m_files -type f | wc -l 2. 数据预处理 仅保留UTF-8 格式文件&#xff0c;且所有保留的代码文件长度必须大于20行 import os import pandas as pddef try_read…

解决开发者技能差距:AI 在提升效率与技能培养中的作用

企业在开发者人才方面正面临双重挑战。一方面&#xff0c;IDC 预测&#xff0c;到2025年&#xff0c;全球全职开发者将短缺400万人&#xff1b;另一方面&#xff0c;一些行业巨头已暂停开发者招聘&#xff0c;转而倚重人工智能&#xff08;AI&#xff09;来满足开发需求。这不禁…

XCTF-web-easyphp

解析 第一个条件&#xff08; k e y 1 &#xff09;&#xff1a; i s s e t ( key1&#xff09;&#xff1a;isset( key1&#xff09;&#xff1a;isset(a) && intval(KaTeX parse error: Expected EOF, got & at position 14: a) > 6000000 &̲& strl…