【ROS2实体机械臂驱动】rokae xCoreSDK Python测试使用
文章目录
前言
本文用来记录 xCoreSDK-Python的调用使用[1](#1)。
正文
配置环境
配置开发环境,这里使用conda做python环境管理,安装可以参考
anaconda、miniconda、conda的关系及miniconda安装-CSDN博客[2](#2)
初始化python环境,根据sdk的说明,依赖于python3.8环境
bash
# 创建环境
$ 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
保存的。
bash
$ mkdir -p ~/workspace/rokae_projects
$ cd ~/workspace/rokae_projects
$ git lfs clone https://github.com/RokaeRobot/xCoreSDK-Python.git
$ cd xCoreSDK-Python
配置环境变量
bash
$ export PYTHONPATH=/home/dev/workspace/rokae_projects/xCoreSDK-Python/rokae_SDK_linux_v0.1.6_py38/lib:$PYTHONPATH
测试运行
注意: 应将库文件所在路径添加至运行脚本可识别的路径中。将脚本中的ip修改为连接机器人所设置的ip。
提醒 : 到这一步发现robot.connectToRobot(ec)
没有权限,需要找厂家要license,可以找买机械臂的代理,拿到后自行插入优盘导入即可。
bash
# 运行 firstexample.py
$ cd ~/workspace/rokae_projects/xCoreSDK-Python/rokae_SDK_linux_v0.1.6_py38/example
$ python firstexample.py
修改点说明
python
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()
运行输出结果:
bash
$ 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指令。
实际运行情况

参考
中间还涉及官方的其它库,也一并附上[3](#3)[4](#4)[5](#5)。
-
RokaeRobot/xCoreSDK-Python: Software development Python interfaces for Rokae robots all series ↩︎
-
RokaeRobot/xCoreSDK-CPP: Software development C++ interfaces for Rokae robots all series, compatible with Linux and Windows. ↩︎
-
RokaeRobot/xCoreSDK-CSharp: Software development C# interfaces for Rokae robots all series ↩︎
-
RokaeRobot/xCoreSDK-Android: Software development interfaces for Rokae robots all series, supports Android platform ↩︎