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

article/2025/8/7 7:59:47

【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 timefrom math import pi   # 增加导入pi定义def waitRobot(robot):running = Truewhile running:time.sleep(0.1)ec = {}st = robot.operationState(ec)if st == rokae.OperationState.idle.value or st == rokae.OperationState.unknown.value:running = Falsedef main():ip = "192.168.8.160"	# 修改本地机械臂对应的IP. BingLee 2025.5.28ec = {}# 下述类根据实际机械臂情况自行修改. 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,返回一个当前位姿的listpoint = [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的值设为falserobot.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.28p1 = 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")breakrobot.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.hkcw.cn/article/KIGwYHClEW.shtml

相关文章

深入浅出网络分析与故障检测工具

目录 网络故障检测工具:别只靠“Ping 不通” 实战组合拳:分析 检测 问题闭环 四、选择工具的几个建议 五、总结:工具是手段,思维才是核心 在如今这个“数据就是生命线”的时代,网络的稳定性和性能直接决定着企业…

使用Haproxy搭建Web群集

目录 1,Haproxy简介 1,核心功能与特点 二,搭建haproxy群集 1,准备工作 2,修改haproxy的配置文件 3,准备网站 4,配置日志 5,验证 1,Haproxy简介 HAProxy 是一款高…

Elasticsearch的写入流程介绍

Elasticsearch 的写入流程是一个涉及 分布式协调、分片路由、数据同步和副本更新 的复杂过程,其设计目标是确保数据一致性、可靠性和高性能。以下是写入流程的详细解析: 一、写入流程总览 二、详细步骤解析 1. 客户端请求路由 请求入口:客户端(如 Java 客户端、REST API)…

记录一次apisix上cros配置跨域失败的问题

安全要求不允许跨域请求,但是业务侧由于涉及多个域名,并且需要共享cookie,所以需要配置跨域。 在apisix上配置了cors如下。 结果安全漏扫还是识别到了跨域请求的漏洞。 调试了cors.lua的插件脚本,发现apisix上是如果不在allowOri…

VSCode无法转到定义python源码(ctrl加单击不跳转)

已经尝试的方案: 1.确保对应python环境正确激活 在 VSCode 中,打开命令面板(CtrlShiftP),输入并选择 Python: Select Interpreter,然后从列表中选择正确的 Python 解释器。 2.重新卸载Python插件再重新安装…

会议室钥匙总丢失?换预约功能的智能门锁更安全

在企业日常运营中,会议室作为重要的沟通与协作场所,其管理效率与安全性直接影响着企业的运作顺畅度。然而,传统会议室管理方式中钥匙丢失、管理不便等问题频发,给企业带来了不少困扰。近期,某企业引入了启辰智慧预约系…

漫画Android:事件分发的过程是怎样的?

当用户触摸屏幕时,硬件层会捕获触摸信号,并将其转化为内核事件。 Android系统会通过InputManagerService和WindowManagerService等服务将这些事件包装成MotionEvent对象,并将其传递给Activity的dispatchTouchEvent()方法中,Activi…

【算法提升】分组 day_tow

1.分组 1.1 解析 个人认为这题最难的点在于如何想到使用二分的算法来解题。 正向求解:就是去看每一组中需要分多少个人,但是这样求解代码我根本写不出来。 所以根据正难则反的思想,我们可以从最终结果去倒推。 枚举最终的分配结果中&#xff…

【笔记】Suna 部署之 Supabase 数据库 schema 暴露操作

#工作记录 一、前置信息 在 Suna 部署过程中,Supabase 数据库设置已完成(✅ Supabase database setup completed ),但需要手动在 Supabase 平台暴露basejump模式(schema)。 Suna 部署过程中,S…

【Linux 学习计划】-- 进程状态 | 进程运行、阻塞和挂起的本质 | 并行、并发与进程切换 | 进程优先级

目录 进程状态 五状态进程模型 运行、就绪状态的本质 阻塞状态的本质 挂起状态 并行与并发 进程切换 进程优先级 结语 进程状态 进程状态的本质是什么? 首先我们知道,在操作系统中,进程是需要被管理起来的,具体则是用一…

自证式推理训练:大模型告别第三方打分的新纪元

1. 传统验证体系的困境与技术跃迁的必然性 1.1 传统验证器的局限性 现有强化学习框架依赖显式验证器对答案进行二值化判定,这种模式在数学、代码等可验证领域表现优异。某厂内部数据显示,传统R1-Zero方法在代码生成任务中准确率达92%,但切换…

《操作系统真相还原》——加载器

显存 将上一章的中断输出,变为显存输出 加载器 使用mbr引导程序从磁盘中加载loader程序。 MBR %include "boot.inc" SECTION MBR vstart0x7c00 mov ax,cs mov ds,axmov es,axmov ss,axmov fs,axmov sp,0x7c00mov ax,0xb800mov gs,ax;cl…

Spring Boot 应用中实现配置文件敏感信息加密解密方案

Spring Boot 应用中实现配置文件敏感信息加密解密方案 背景与挑战 🚩一、设计目标 🎯二、整体启动流程 🔄三、方案实现详解 ⚙️3.1 配置解密入口:EnvironmentPostProcessor3.2 通用解密工具类:EncryptionTool 四、快速…

前端实现图片压缩:基于 HTML5 File API 与 Canvas 的完整方案

在 Web 开发中,处理用户上传的图片时,前端压缩可以有效减少服务器压力并提升上传效率。本文将详细讲解如何通过<input type="file">实现图片上传,结合 Canvas 实现图片压缩,并实时展示压缩前后的图片预览和文件大小对比。 一、核心功能架构 我们将实现以…

用wireshark抓了个TCP通讯的包

昨儿个整理了下怎么用wireshark抓包&#xff0c;链接在这里&#xff1a;捋捋wireshark 今天打算抓个TCP通讯的包试试&#xff0c;整体来说比较有收获&#xff0c;给大家汇报一下。 首先就是如何搞到可以用来演示TCP通讯的客户端、服务端&#xff0c;问了下deepseek&#xff0c;…

AWS WAF设置IP白名单

目标 设置一个组白名单IP地址&#xff0c;当发现是这些IP地址发过来的请求后&#xff0c;WAF自动放行。 创建IP集 打开WAF页面&#xff0c;开始IP集创建如下图&#xff1a; 设置ip集&#xff0c;如下图&#xff1a; aws waf acl配置白名单 找到Web ACL&#xff0c;开始在…

随笔20250530 C# 整合 IC卡读写技术解析与实现

以下是一个完整、最简化的 FeliCa 读取整合示例&#xff08;无需 SDK&#xff0c;基于 PCSC NuGet 包&#xff09;&#xff0c;你可以直接运行这个控制台程序&#xff0c;验证能否识别 RC-S300 并读取卡片 UID&#xff1a; &#x1f9ea; 示例说明 &#x1f4e6; 使用 NuGet 包…

day024-网络基础-TCP与UDP、DNS

文章目录 1. 李导推荐书籍2. OSI七层模型2.1 传输层2.2 网络层2.2.1 问&#xff1a;两端处于不同局域网的设备怎么网络通信&#xff1f; 2.3 数据链路层2.4 物理层2.5 图解OSI七层模型 3. 数据传输模式3.1 全双工3.2 半双工3.3 单工 4. TCP 3次握手4.1 抓包 5. TCP 4次挥手5.1 …

AI赋能开源:如何借助MCP快速解锁开源项目并提交你的首个PR

引子 很多同学都梦想为开源项目贡献力量&#xff0c;然而现实往往是——面对庞大复杂的项目&#xff0c;从入门到提交第一个有实质性代码的PR&#xff0c;时间跨度可能长达数年。传统路径通常是先从文档贡献开始&#xff0c;逐步深入理解项目架构&#xff0c;最终才能进行代码…

智能问数技术路径对比:NL2SQL vs NL2Semantic2SQL

在人工智能浪潮席卷数据分析领域的当下&#xff0c;“智能问数”凭借其自然语言交互的便捷性&#xff0c;迅速成为企业提升数据民主化与决策效率的焦点。大语言模型&#xff08;LLM&#xff09;展现出的强大语言理解和生成能力&#xff0c;无疑为这一愿景启动了引擎。 然而&am…