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

【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.pswp.cn/news/907967.shtml

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

相关文章

黑马Java面试笔记之MySQL篇(优化)

一. 慢查询 在MySQL中,如何定位慢查询? 出现慢查询的情况有以下几种: 聚合查询多表查询表数据量过大查询深度分页查询 表象:页面加载过慢,接口压测响应时间过长(超过1s) 1.2 如何定位慢查询&…

历史数据分析——广州港

个股简介 公司简介: 华南地区最大的综合性主枢纽港。 本公司是由广州港集团、国投交通、广州发展作为发起人,共同出资以发起方式设立的股份有限公司。 经营分析: 一般经营项目:企业管理服务(涉及许可经营项目的除外);港务船舶调度服务;船舶通信服务;企业自有资金…

图解gpt之Transformer架构与设计原理

Transformer架构。它不仅仅是一个模型,更是一种范式,彻底改变了我们理解和处理自然语言的方式。 2017年,谷歌大脑团队发表了一篇划时代的论文,题目就叫《Attention is All You Need》。这标题本身就充满了力量,宣告了…

HCIP:MPLS静态LSP的配置及抓包

目录 一、MPLS的简单的一些知识点 1.MPLS的概述: 2.MPLS工作原理: 3.MPLS的核心组件: 4. MPLS标签 5.MPLS标签的处理 6.MPLS转发的概述: 7.MPLS的静态LSP建立方式 二、MPLS的静态LSP的实验配置 1.配置接口的地址和配置OS…

Azure DevOps 管道部署系列之一本地服务器

Azure DevOps 是一个帮助改进 SDLC(软件开发生命周期)的平台。 在本文中,我们将使用 Azure Pipelines 创建自动化部署。 Azure DevOps 团队将 Azure Pipelines 定义为“使用 CI/CD 构建、测试和部署,适用于任何语言、平台和云平台”。 在这里,我将解释如何在 Azure Dev…

深入剖析网络协议:七层协议与四层协议详解

在计算机网络的世界中,数据的传输与交互离不开协议的规范。其中,七层协议和四层协议是网络通信架构的核心概念,它们如同网络世界的 “交通规则”,保障着数据准确、高效地在不同设备间流转。本文将深入解读七层协议与四层协议&…

回头看,FPGA+RK3576方案的功耗性能优势

作者:Hello,Panda 各位朋友,大家好,熊猫君这次开个倒车,在这个广泛使用Xilinx(Altera)高端SoC的时代,分享一个“FPGAARM”实现的低功耗高性能传统方案。 图1 瑞芯微RK3576电路 当前&#xff0c…

打造极致计算器:HTML+Tailwind+DaisyUI实战

一、计算器总体描述 创建一个在线计算器来实现基础数学运算功能,通过单一页面集成数字按钮、运算符按钮和显示结果区域,界面采用简洁直观的布局设计,按钮排列合理且提供即时运算反馈,确保计算逻辑准确和良好的按键响应体验&#x…

基于mediapipe深度学习的虚拟画板系统python源码

目录 1.前言 2.算法运行效果图预览 3.算法运行软件版本 4.部分核心程序 5.算法仿真参数 6.算法理论概述 7.参考文献 8.算法完整程序工程 1.前言 虚拟画板系统基于计算机视觉与深度学习技术,通过摄像头捕获用户手部动作,利用 MediaPipe框架实现手…

开源的JT1078转GB28181服务器

JT1078转GB28181流程 项目地址: JT1078转GB28181的流媒体服务器: https://github.com/lkmio/lkm JT1078转GB28181的信令服务器: https://github.com/lkmio/gb-cms 1. 创建GB28181 UA 调用接口: http://localhost:9000/api/v1/jt/device/add 请求体如下&#xf…

元器件基础学习笔记——双极结型晶体管 (BJT)

一、概述 1.1 基本结构 双极结型晶体管(Bipolar Junction Transistor)由发射极(Emitter)、基极(Base)和集电极(Collector)三个掺杂程度不同的半导体区域组成,分别对应有…

Python 在金融中的应用- Part 1

早在2018年,我开始对资本市场产生兴趣。理解资本市场的基本理论对财富积累至关重要。我开始阅读所有经典著作,如《聪明的投资者》和《证券分析》。在这一系列文章中,我想与读者分享在Python编程语言背景下理解金融理论的旅程。在文章的第一大部分,我们将专注于金融模型的线…

css使用scoped之后样式失效问题

项目中的vue代码原本用的style标签来写css&#xff0c;现在想改成<style langscss scoped>&#xff0c;但是改完之后发现样式不对&#xff1a; 原来是&#xff1a; 将style改成scoped之后变成了&#xff1a;检查发现是之前定义的一些变量无法被识别&#xff0c;导致这些样…

基于 GitLab CI + Inno Setup 实现 Windows 程序自动化打包发布方案

在 Windows 桌面应用开发中&#xff0c;实现自动化构建与打包发布是一项非常实用的工程实践。本文以我在开发PackTes项目时的为例&#xff0c;介绍如何通过 GitLab CI 配合 Inno Setup、批处理脚本、Qt 构建工具&#xff0c;实现版本化打包并发布到共享目录的完整流程。 项目地…

能源领域新兴技术论坛:EMQ 实时数据引擎构建工业智能中枢

5 月 26 日&#xff0c;由沙特阿美亚洲公司主办的能源领域新兴技术论坛在上海顺利举行。本次论坛聚焦智能工厂、无人机与机器人、可靠性与完整性、先进材料四大技术赛道&#xff0c;吸引了来自全球的能源企业、技术供应商及行业专家。 作为业内知名的 MQ AI 实时数据与智能产…

【计算机网络】第2章:应用层—DNS

目录 一、PPT 二、总结 DNS&#xff08;域名系统&#xff09;详解 &#xff08;一&#xff09;DNS核心概念 &#xff08;二&#xff09;DNS查询过程&#xff08;重点❗&#xff09; &#xff08;三&#xff09;DNS资源记录&#xff08;RR&#xff09;类型…

PHP HTTP 完全指南

PHP HTTP 完全指南 引言 PHP 作为一种流行的服务器端脚本语言,广泛应用于各种Web开发项目中。HTTP(超文本传输协议)是互联网上应用最为广泛的网络协议之一,用于在Web服务器和客户端之间传输数据。本文将详细介绍 PHP 在 HTTP 通信中的应用,帮助开发者更好地理解和利用 P…

C++测开,自动化测试,业务(第一段实习)

目录 &#x1f33c;前言 一&#xff0c;实习经历怎么写简历 &#x1f339;业务理解 &#x1f382;结构化表达 二&#xff0c;实习 &#x1f982;技术和流程卡点 &#x1f511;实习收获 / 代码风格 三&#xff0c;测试理论&#xff0c;用例设计&#xff0c;工具链 &…

NodeJS全栈开发面试题讲解——P5前端能力(React/Vue + API调用)

✅ 5.1 如何使用 React/Vue 发起后端请求&#xff1f;用什么库&#xff1f; 面试官您好&#xff0c;在实际项目中我们通常使用 axios、fetch 或框架提供的封装库发起后端请求。 &#x1f527; 常用库对比&#xff1a; 库框架适配优点axios通用默认支持拦截器、取消请求、请求体…

【C/C++】cmake实现Release版本禁用调试接口技巧

在 C 中通过 CMake 实现部分接口在 Release 版本不生效&#xff0c;可以通过条件编译结合 CMake 的构建类型判断来实现。以下是详细步骤&#xff1a; 1. 在 CMakeLists.txt 中定义配置相关宏 # 设置构建类型&#xff08;可选&#xff0c;但推荐显式设置&#xff09; if(NOT C…