4.司机<一个类="headerlink" href="#drivers" title="¶">¶
机器人司机可以控制连接到计算机上的真正的机器人。机器人驾驶员使用特定的软件接口来控制和监视特定的机器人控制器,使计算机能够直接控制机器人手臂。
机器人驱动程序提供了:ref: '离线编程
下面的文章展示了一个使用机器人驱动程序的在线编程项目的例子:<一个href="//m.sinclairbody.com/blog/online-programming/" class="reference external">//m.sinclairbody.com/blog/online-programming/
在RoboDK中编程的任何机器人模拟都可以使用机器人驱动程序在机器人上执行。然后,机器人在模拟器中的运动与真实机器人同步,从而可以实时调试机器人程序。
更多信息见我们的文档:<一个类="reference external" href="//m.sinclairbody.com/doc/en/Robot-Drivers.html">//m.sinclairbody.com/doc/en/Robot-Drivers.html#RobotDrivers
4.1.驱动命令和响应<一个类="headerlink" href="#driver-commands-and-responses" title="¶">¶
RoboDK使用控制台或标准输入/输出与驱动程序通信。命令和响应是字符串格式的由空格分隔的参数组成的列表。关节值以度为单位,并跟随机器人的轴数。姿势使用XYZRPW格式(毫米/度)。
从RoboDK到驱动程序的可用命令列表:
CONNECT连接请求。RoboDK提供IP,端口和DOF。即CONNECT 192.168.0.100 10000 6 DISCONNECT断开请求。即:DISCONNECT STOP / QUIT停止驱动程序(进程终止)。即STOP 192.168.0.100 PAUSE执行暂停操作。RoboDK提供以ms为单位的时间,即PAUSE 500 MOVJ执行一个联合动作。RoboDK提供关节和姿势。例如:执行线性移动。RoboDK提供关节和姿势。例如:MOVLSEARCH执行一个线性搜索移动。 RoboDK provides joints and pose. i.e. MOVLSEARCH 18.6 16.8 3.8 0.0 69.3 18.6 156.0 52.7 187.5 -180.0 0.0 180.0 MOVC Execute a circular move. RoboDK provides joints 1, joints 2, pose 1 and pose 2. i.e. MOVC -4.3 43.0 -36.4 0.0 83.3 -4.3 -36.3 30.2 -15.3 0.0 75.1 -36.3 215.1 -16.3 187.5 -180 0.0 180 156.0 -114.8 187.5 -180 0.0 180 CJNT Request to retrieve the current joint position of the robot. i.e. CJNT SPEED Set the speeds. RoboDK provides mm/s, deg/s, m/s2 and deg/s2. i.e. SPEED 1000.0 200.0 1500.000 150.000 SETROUNDING Set the rounding/smoothing/blending value. Sub-zero values means accurate. i.e. SETROUNDING -1 or SETROUNDING 10 SETDO Set a digital output on the controller. RoboDK provides the IO name and value. i.e. SETDO 5 1 5 1, or SETDO 0 0 VARNAME VALUE WAITDI Wait for a digital input on the controller. RoboDK provides the IO name and value. i.e. WAITDI 5 1 5 1, or WAITDI 0 0 VAR VALUE SETTOOL Set the Tool Center Point. RoboDK provides the pose. i.e. SETTOOL 0.0 0.0 0.0 0.0 0.0 0.0 RUNPROG Run a program call on the controller. RoboDK provides the program ID (if any) and the program name. i.e. RUNPROG 10 Program_10 or RUNPROG -1 ProgramCall POPUP Display a pop-up message on the teach-pendant (if applicable). RoboDK provides the message. i.e. POPUP This is a message
从驱动程序到RoboDK的可用响应列表:
短信在连接日志窗口和RoboDK的连接状态栏显示一条短信。状态栏有颜色,如“就绪”显示为绿色,“等待”显示为蓝色,“工作中”显示为黄色,其他信息显示为红色。建议使用简短的单句。例如SMS:Ready SMS2在RoboDK主界面的状态栏中显示一条消息。例如SMS2:Waiting for the controller to warm up RE报告驱动状态/ API driver命令的响应。即。"resp = robot. "setParam(‘司机’,some_command)”。例如RE:OK CMDLIST在RoboDK的连接日志窗口中显示可用的自定义命令列表。如。 "CMDLIST:c Command1|This is a command|c Command2|This is a second command|" JNTS Report the robot joints to RoboDK with high accuracy (around 6 decimals). e.g. JNTS:0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000 JNTS_MOVING Report the robot joints to RobDK while the robot is moving (less accurately). e.g. JNTS_MOVING:0.0, 0.0, 0.0, 0.0, 0.0, 0.0
4.2.司机的例子<一个类="headerlink" href="#driver-example" title="¶">¶
本节展示KUKA IIWA机器人的样例Python驱动程序。这个驱动程序使用TCP/IP与远程Java服务器通信。该示例也可以在/RoboDK/api/Robot/文件夹中找到。
# -*-编码:UTF-8 -*-RoboDK Inc.版权所有- //m.sinclairbody.com/#根据Apache许可证2.0版(“许可证”)进行许可;除非遵守许可,否则您不得使用此文件。您可以从以下网址获得许可证的副本# http://www.apache.org/licenses/license - 2.0除非适用法律要求或书面同意,软件在许可证下分发的是按“现状”分发的,无任何明示或暗示的保证或条件。#请参阅许可证,以了解具体的语言管理权限和许可证下的限制。####这是一个Python模块,可以驱动KUKA IIWA机器人。这个Python模块可以直接在控制台模式下运行来测试它的功能。该模块允许通过命令行与机器人通信。#我们可以手动输入的相同命令被RoboDK用来从PC驱动机器人。# RoboDK Drivers默认位于/RoboDK/api/Robot/。驱动程序可以是PY文件或EXE文件。##驱动是模块化的。它们不是RoboDK可执行文件的一部分,但它们必须放在C:/RoboDK/api/robot/中,然后在连接参数菜单中链接:# 1。右键单击RoboDK中的机器人,然后选择“连接到机器人”。# 2。在“更多选项”菜单中,可以更新驱动程序的位置和名称。#驱动程序链接是当前可用的驱动程序的自动链接。更多关于机器人司机的信息请点击这里:# //m.sinclairbody.com/doc/en/Robot-Drivers.html RobotDrivers#与标准编程方法(生成程序,然后传输到机器人并执行)不同,可以直接在机器人上运行程序模拟机器人在模拟器中的运动与真实的机器人同步。从RoboDK生成的程序可以在机器人上运行,右键单击程序,然后选择“在机器人上运行”。#的例子:# https://www.youtube.com/watch?v=pCD--kokh4s#一个在线编程项目的例子:# //m.sinclairbody.com/blog/online-programming/#可以通过RoboDK API控制机器人的运动(例如,使用RoboDK API的Python或c#程序)。#相同的代码用于模拟和选择性移动真实的机器人。#的例子:# //m.sinclairbody.com/offline-programming##从RoboDK API建立连接:# //m.sinclairbody.com/doc/en/PythonAPI/robolink.html robolink.Item.ConnectSafe#在控制台模式下快速手动测试的示例:#用户条目:CONNECT 192.168.123.1 7000# Response: SMS:机器人的响应或连接失败#回应:短信:准备好了#用户入口:MOVJ 10 20 30 40 50 60 70#回应:短信:工作中…#回应:短信:准备好了#用户条目:CJNT#回应:短信:工作中…#响应:JNTS: 10 20 30 40 50 60 70## ---------------------------------------------------------------------------------进口套接字进口结构体进口sys进口再保险从io进口BytesIO# ---------------------------------------------------------------------------------设置期望的最小自由度nDOFs_MIN=7#设置驱动版本DRIVER_VERSION=KUKA IIWA v1.0.1的RoboDK驱动程序# ---------------------------------------------------------------------------------# KUKA IIWA命令MSG_CJNT=1MSG_SETTOOL=2MSG_SPEED=3.MSG_ROUNDING=4MSG_MOVEJ=10MSG_MOVEL=11MSG_MOVEC=12MSG_MOVEL_SEARCH=13MSG_POPUP=20.MSG_PAUSE=21MSG_RUNPROG=22MSG_SETDO=23MSG_WAITDI=24MSG_GETDI=25MSG_SETAO=26MSG_GETAI=27MSG_MONITOR=127MSG_ACKNOWLEDGE=128MSG_DISCONNECT=999# ----------- 通信类库卡IIWA机器人 -------------类ComRobot:”“”库卡IIWA机器人的通讯课。这个类处理驱动程序(PC)和机器人之间的通信。”“”连接=假连接状态在任何时候都是已知的#创建对象时执行def__init__(自我):自我.BUFFER_SIZE=512#字节自我.超时=5*60#秒:必须有足够的时间完成一个动作自我.袜子=没有一个def__del__(自我):自我.断开连接()def断开连接(自我):"""断开与机器人的连接。"""自我.连接=假如果自我.袜子:试一试:自我.袜子.关闭()除了OSError:返回假返回真正的def连接(自我,知识产权,港口=30000):"""连接到机器人提供的连接参数。"""全球ROBOT_MOVING自我.断开连接()print_message(连接到机器人% s:%我'%(知识产权,港口))创建新的套接字连接自我.袜子=套接字.套接字(套接字.AF_INET,套接字.SOCK_STREAM)自我.袜子.settimeout(36000)UpdateStatus(ROBOTCOM_WORKING)试一试:自我.袜子.连接((知识产权,港口))除了ConnectionRefusedError作为e:print_message(str(e))返回假自我.连接=真正的ROBOT_MOVING=假自我.send_line(DRIVER_VERSION)print_message(“等待欢迎信息……”)robot_response=自我.recv_line()打印(robot_response)sys.stdout.冲洗()返回真正的defsend_b(自我,味精):""" "通过通信端口(TCP/IP)向机器人发送一条线。"""试一试:发送=自我.袜子.发送(味精)如果发送==0:返回假返回真正的除了ConnectionAbortedError作为e:自我.连接=假打印(str(e))返回假defrecv_b(自我,buffer_size):"""通过通信端口(TCP/IP)接收来自机器人的一条线。"""bytes_io=BytesIO()试一试:为我在范围(buffer_size):bytes_io.写(自我.袜子.recv(1))b_data=bytes_io.getvalue()除了ConnectionAbortedError作为e:自我.连接=假打印(str(e))返回没有一个如果b_data==b'':返回没有一个返回b_datadefsend_line(自我,字符串=没有一个):"""向机器人发送带有\\n的字符串。"""字符串=字符串.取代('\ n',“< br >”)如果sys.version_info[0]<3.:返回自我.send_b(字节(字符串+'\ 0'))# Python 2x只其他的:返回自我.send_b(字节(字符串+'\ 0',“utf - 8”))# Python 3x只defrecv_line(自我):"""接收来自机器人的字符串。它一直读到一个以空结尾的字符串"""字符串=b''沙里河=自我.recv_b(1)而沙里河! =b'\ 0':# read直到null终止字符串=字符串+沙里河沙里河=自我.recv_b(1)返回str(字符串.解码(“utf - 8”))# python 2和python 3兼容defsend_int(自我,全国矿工工会):"""向机器人发送一个int(32位)。"""如果isinstance(全国矿工工会,浮动):全国矿工工会=轮(全国矿工工会)elif不isinstance(全国矿工工会,int):全国矿工工会=全国矿工工会[0]返回自我.send_b(结构体.包(>我的,全国矿工工会))defrecv_int(自我):"""从机器人接收一个int(32位)。"""缓冲=自我.recv_b(4)全国矿工工会=结构体.解压缩(>我的,缓冲)返回全国矿工工会[0]defrecv_double(自我):"""从机器人接收双(64位)。"""缓冲=自我.recv_b(8)全国矿工工会=结构体.解压缩(“> d ',缓冲)返回全国矿工工会[0]defrecv_acknowledge(自我):"""等待收到机器人的命令确认。"""而真正的:stat_ack=自我.recv_int()如果stat_ack==MSG_MONITOR:jnts_moving=自我.recv_array()print_joints(jnts_moving,真正的)elifstat_ack==MSG_ACKNOWLEDGE:返回真正的其他的:print_message(“机器人的意外反应”)UpdateStatus(ROBOTCOM_CONNECTION_PROBLEMS)自我.断开连接()返回假defsend_array(自我,值):"""向机器人发送一个双精度数组。"""如果不isinstance(值,列表):如果它是一个有关节的Mat()值=(值.tr()).行[0]n_values=len(值)如果不自我.send_int(n_values):返回假如果n_values>0:缓冲=b''为我在范围(n_values):缓冲=缓冲+结构体.包(“> d ',值[我])返回自我.send_b(缓冲)返回真正的defrecv_array(自我):"""从机器人接收一个双精度数组。"""n_values=自我.recv_int()# print_message('n_values: %i' % n_values)值=[]如果n_values>0:缓冲=自我.recv_b(8*n_values)值=列表(结构体.解压缩(“>”+str(n_values)+' d ',缓冲))# print('values: ' + str(values))返回值defSendCmd(自我,cmd,值=没有一个):"""给机器人发个命令。如果成功返回True,否则返回False。”""# print('SendCmd(cmd=' + str(cmd) + ', values=' + str(values) if values else ' + ')')如果机器人未连接,则跳过该命令如果不自我.连接:UpdateStatus(ROBOTCOM_NOT_CONNECTED)返回假如果不自我.send_int(cmd):print_message(“机器人连接断开”)UpdateStatus(ROBOTCOM_NOT_CONNECTED)返回假如果值是没有一个:返回真正的elif不isinstance(值,列表):值=[值]如果不自我.send_array(值):print_message(“机器人连接断开”)UpdateStatus(ROBOTCOM_NOT_CONNECTED)返回假返回真正的# -----------------------------------------------------------------------------# -----------------------------------------------------------------------------#通用RoboDK驱动程序为特定的机器人类机器人=ComRobot()ROBOT_IP=“172.31.1.147”#机器人IPROBOT_PORT=30000#机器人通信端口ROBOT_MOVING=假# ------------机器人连接-----------------#与机器人建立连接defRobotConnect():全球机器人全球ROBOT_IP全球ROBOT_PORT返回机器人.连接(ROBOT_IP,ROBOT_PORT)#断开与机器人的连接defRobotDisconnect():全球机器人机器人.断开连接()返回真正的# -----------------------------------------------------------------------------#通用RoboDK驱动工具注意,一个简单的print()会将信息刷新到RoboDK中机器人连接的日志窗口#发送print()可能不会刷新标准输出,除非缓冲区达到一定的大小defprint_message(消息):”“”在连接日志窗口和RoboDK的连接状态栏显示一条消息(短信:)。状态栏有颜色,绿色显示“准备就绪”,蓝色显示“等待中”,黄色显示“工作中”,红色显示其他信息。建议使用简短的单句。”“”打印(短信:“+消息)sys.stdout.冲洗()#非常有用的更新RoboDK尽可能快defshow_message(消息):""在RoboDK主界面状态栏显示消息(SMS2:)。"""打印(短信:“+消息)sys.stdout.冲洗()#非常有用的更新RoboDK尽可能快defprint_response(消息):”“”报告驱动状态/ API driver命令(RE:)的响应。即:\"resp = robot。setParam(‘司机’,some_command) \”。”“”打印(“RE:”+消息)sys.stdout.冲洗()#非常有用的更新RoboDK尽可能快defprint_commands(消息):”“”在RoboDK的连接日志窗口显示可用的自定义命令列表(c) (CMDLIST:)。例如:\"c Command1|这是一个命令|c Command2|这是第二个命令|\"”“”打印(”CMDLIST:“+消息)sys.stdout.冲洗()#非常有用的更新RoboDK尽可能快defprint_joints(关节,is_moving=假):”“”将机器人关节报告给RoboDK (JNTS:或JNTS_MOVING:)。当机器人处于静态时提供精确的关节值(JNTS:),如果机器人当前正在移动,则提供更低的精度(JNTS_MOVING:)。”“”如果is_moving:#显示机器人运动时关节的反馈如果ROBOT_MOVING:打印(”JNTS_MOVING:“+”“.加入(格式(x,“.3f”)为x在关节))其他的:打印(”JNTS:“+”“.加入(格式(x,“.6f”)为x在关节))sys.stdout.冲洗()#非常有用的更新RoboDK尽可能快# ---------------------------------------------------------------------------------#使用UpdateStatus()显示状态的常量值ROBOTCOM_UNKNOWN=-1000#:未知状态(红色)ROBOTCOM_CONNECTION_PROBLEMS=-3.#:机器人连接问题状态(红色)ROBOTCOM_DISCONNECTED=-2#:机器人断开连接状态(红色)ROBOTCOM_NOT_CONNECTED=-1#:机器人未连接状态(红色)ROBOTCOM_READY=0#:机器人就绪状态(绿色),即短信:就绪ROBOTCOM_WORKING=1#:机器人工作状态(黄色),即短信:工作中ROBOTCOM_WAITING=2#:等待机器人状态(蓝色),即短信:等待保存最后一个机器人状态状态=ROBOTCOM_DISCONNECTEDdefUpdateStatus(set_status=没有一个):”“”UpdateStatus将发送一个适当的消息给RoboDK,这将导致一个特定的颜色。例如,“Ready”显示为绿色,“Waiting”显示为蓝色,“Working”显示为黄色其他消息将以红色显示。如短信:准备好了”“”全球状态如果set_status是不没有一个:状态=set_status如果状态==ROBOTCOM_CONNECTION_PROBLEMS:print_message(“连接问题”)elif状态==ROBOTCOM_DISCONNECTED:print_message(“断开”)elif状态==ROBOTCOM_NOT_CONNECTED:print_message(“未连接”)elif状态==ROBOTCOM_READY:print_message(“准备好了”)elif状态==ROBOTCOM_WORKING:print_message(“工作……”)elif状态==ROBOTCOM_WAITING:print_message(“等……”)其他的:print_message(“未知状态”)# RoboDK可以通过命令行提供的命令示例集defTestDriver():RunCommand(“连接”)RunCommand(“速度250”)RunCommand(" settool -0.025 -41.046 50.920 60000 -0.000 90000 ")RunCommand(“CJNT”)RunCommand(" movj -5.362010 46.323420 20.746290 74.878840 -50.101680 61.958500")RunCommand(" movel 00 00 00 0 -5.362010 50.323420 20.746290 74.878840 -50.101680 61.958500")RunCommand(“暂停1000”)RunCommand(“断开”)# -------------------------- 主驱动循环 -----------------------------#读取STDIN并处理每个命令(无限循环)#重要:这必须从RoboDK运行,以便RoboDK可以通过STDIN正确馈送命令这个驱动程序也可以在控制台模式下运行,通过控制台输入提供命令defRunDriver():”“”主驱动环。读取STDIN并处理每个命令(无限循环)。”“”为行在sys.stdin:RunCommand(行)defRunCommand(cmd_line):”“”解析RoboDK命令字符串(STDIN或命令行)并将适当的操作转发给机器人通信类。命令字符串以命令为前缀,后跟其参数(以空格分隔)。关节值以度为单位,并跟随机器人的轴数。姿势使用XYZRPW格式(毫米/度)。:param str cmd_line:命令字符串可用命令:..代码块:文本CONNECT连接请求。RoboDK提供IP,端口和DOF。即CONNECT 192.168.0.100 10000断开请求。即断开STOP / QUIT停止驱动程序(进程终止)。即停止192.168.0.100PAUSE执行暂停命令。RoboDK以毫秒为单位提供时间。即PAUSE 500执行一个联合招式。RoboDK提供关节和姿势。即MOVJ -36.3 30.2 -15.3 0.0 75.1 -36.3 156.0 -114.8 187.5 -180.0 0.0 180.0执行线性移动。RoboDK提供关节和姿势。即MOVL 18.6 16.8 3.8 0.0 69.3 18.6 156.0 52.7 187.5 -180.0 0.0 180.0执行一个线性搜索移动。RoboDK提供关节和姿势。即MOVLSEARCH 18.6 16.8 3.8 0.0 69.3 18.6 156.0 52.7 187.5 -180.0 0.0 180.0执行一个循环移动。RoboDK提供关节1,关节2,姿势1和姿势2。即MOVC -4.3 43.0 -36.4 0.0 83.3 -4.3 -36.3 30.2 -15.3 0.0 75.1 -36.3 215.1 -16.3 187.5 -180 0.0 180 156.0 -114.8 187.5 -180 0.0 180请求检索机器人的当前关节位置。例如CJNTSPEED设置速度。RoboDK提供mm/s、deg/s、m/s2和deg/s2。即速度1000.0 200.0 1500.000 150.000设置舍入/平滑/混合值。低于零的值意味着准确。即setroning -1或setroning 10SETDO设置控制器上的数字输出。RoboDK提供IO名称和值。即SETDO 5 1 5 1,或SETDO 0 0 VARNAME VALUEWAITDI等待控制器上的数字输入。RoboDK提供IO名称和值。即WAITDI 5 1 5 1,或WAITDI 0 0 VAR VALUESETTOOL设置工具中心点。RoboDK提供姿势。即SETTOOL 0.0 0.0 0.0 0.0 0.0 0.0在控制器上运行一个程序调用。RoboDK提供了程序ID(如果有的话)和程序名称。即RUNPROG 10 Program_10或RUNPROG -1 ProgramCall在教师挂件上显示弹出消息(如果适用)。RoboDK提供消息。这是一个消息”“”如果cmd_line.带()=="":如果没有提供命令,则跳过返回全球ROBOT_IP全球ROBOT_PORT全球机器人全球ROBOT_MOVING将一行单词剥离为一组数字defline_2_values(行):值=[]为词在行:试一试:数量=浮动(词)值.附加(数量)除了ValueError:通过返回值cmd_words=cmd_line.分裂(' ')#["]如果len == 0cmd=cmd_words[0]cmd_values=line_2_values(cmd_words[1:])#[]如果len <= 1n_cmd_values=len(cmd_values)n_cmd_words=len(cmd_words)收到了=没有一个如果cmd_line.startswith(“连接”):#连接到机器人,提供IP和端口如果n_cmd_words>=2:ROBOT_IP=cmd_words[1]如果n_cmd_words>=3.:ROBOT_PORT=int(cmd_words[2])收到了=RobotConnect()elifn_cmd_values>=nDOFs_MIN和cmd_line.startswith(“MOVJ”):UpdateStatus(ROBOTCOM_WORKING)#激活监视器反馈ROBOT_MOVING=真正的#执行一个联合动作。RoboDK提供j1,j2,…,j6,j7,x,y,z,w,p,r如果机器人.SendCmd(MSG_MOVEJ,cmd_values):#等待命令执行如果机器人.recv_acknowledge():#通知我们已经完成了这个命令UpdateStatus(ROBOTCOM_READY)elifn_cmd_values>=nDOFs_MIN和cmd_line.startswith(“MOVLSEARCH”):UpdateStatus(ROBOTCOM_WORKING)#激活监视器反馈ROBOT_MOVING=真正的#执行线性移动。RoboDK提供j1,j2,…,j6,x,y,z,w,p,r如果机器人.SendCmd(MSG_MOVEL_SEARCH,cmd_values[0:n_cmd_values):#等待命令执行如果机器人.recv_acknowledge():#取回接触接头jnts_contact=机器人.recv_array()print_joints(jnts_contact)elifn_cmd_values>=nDOFs_MIN和cmd_line.startswith(“MOVL”):UpdateStatus(ROBOTCOM_WORKING)#激活监视器反馈ROBOT_MOVING=真正的#执行线性移动。RoboDK提供j1,j2,…,j6,j7,x,y,z,w,p,r如果机器人.SendCmd(MSG_MOVEL,cmd_values):#等待命令执行如果机器人.recv_acknowledge():#通知我们已经完成了这个命令UpdateStatus(ROBOTCOM_READY)elifn_cmd_values>=2*(nDOFs_MIN+6)和cmd_line.startswith(“MOVC”):UpdateStatus(ROBOTCOM_WORKING)#激活监视器反馈ROBOT_MOVING=真正的#执行循环移动。RoboDK提供j1,j2,…,j6,x,y,z,w,p,r为two targetsxyzwpr12=cmd_values[-12:]如果机器人.SendCmd(MSG_MOVEC,xyzwpr12):#等待命令执行如果机器人.recv_acknowledge():#通知我们已经完成了这个命令UpdateStatus(ROBOTCOM_READY)elifcmd_line.startswith(“CJNT”):UpdateStatus(ROBOTCOM_WORKING)#获取机器人的当前位置如果机器人.SendCmd(MSG_CJNT):收到了=机器人.recv_array()print_joints(收到了)elifn_cmd_values>=1和cmd_line.startswith(“速度”):UpdateStatus(ROBOTCOM_WORKING)第一个值是线速度,单位是mm/s#重要!每条指令只能发送一个“Ready”speed_values=[-1,-1,-1,-1]为我在范围(马克斯(4,len(cmd_values))):speed_values[我]=cmd_values[我]# speed_values[0] = speed_values[0] #线速度(mm/s# speed_values[1] = speed_values[1] #关节速度(mm/s# speed_values[2] = speed_values[2] #线性加速度单位为mm/s2# speed_values[3] = speed_values[3] #关节加速度,单位为度/s2如果机器人.SendCmd(MSG_SPEED,speed_values):#等待命令执行如果机器人.recv_acknowledge():#通知我们已经完成了这个命令UpdateStatus(ROBOTCOM_READY)elifn_cmd_values>=6和cmd_line.startswith(“SETTOOL”):UpdateStatus(ROBOTCOM_WORKING)设置由RoboDK提供的6 XYZWPR cmd_values的工具参考框架如果机器人.SendCmd(MSG_SETTOOL,cmd_values):#等待命令执行如果机器人.recv_acknowledge():#通知我们已经完成了这个命令UpdateStatus(ROBOTCOM_READY)elifn_cmd_values>=1和cmd_line.startswith(“暂停”):UpdateStatus(ROBOTCOM_WAITING)#运行暂停如果机器人.SendCmd(MSG_PAUSE,cmd_values[0):#等待命令执行如果机器人.recv_acknowledge():#通知我们已经完成了这个命令UpdateStatus(ROBOTCOM_READY)elifn_cmd_values>=1和cmd_line.startswith(“SETROUNDING”):#设置舍入/平滑值。也被称为ABB的ZoneData或发那科的CNT如果机器人.SendCmd(MSG_ROUNDING,cmd_values[0):#等待命令执行如果机器人.recv_acknowledge():#通知我们已经完成了这个命令UpdateStatus(ROBOTCOM_READY)elifn_cmd_values>=2和cmd_line.startswith(“SETDO”):UpdateStatus(ROBOTCOM_WORKING)# dIO_id = cmd_values[0]# dIO_value = cmd_values[1]如果机器人.SendCmd(MSG_SETDO,cmd_values[0:2):#等待命令执行如果机器人.recv_acknowledge():#通知我们已经完成了这个命令UpdateStatus(ROBOTCOM_READY)elifn_cmd_values>=2和cmd_line.startswith(“WAITDI”):UpdateStatus(ROBOTCOM_WORKING)# dIO_id = cmd_values[0]# dIO_value = cmd_values[1]如果机器人.SendCmd(MSG_WAITDI,cmd_values[0:2):#等待命令执行如果机器人.recv_acknowledge():#通知我们已经完成了这个命令UpdateStatus(ROBOTCOM_READY)elifn_cmd_values>=1和n_cmd_words>=3.和cmd_line.startswith(“RUNPROG”):UpdateStatus(ROBOTCOM_WORKING)program_id=cmd_values[0]如果程序名称为程序ID,则自动提取#程序ID代码=cmd_words[2]# "Program%i" % program_id米=再保险.搜索(r“^ (? P < program_name >。*)\ ((? P <参数>。*)\)”,代码)code_dict=米.groupdict()program_name=code_dict[“program_name”]arg游戏=code_dict[“参数”].取代(' ','').分裂(”、“)打印(“program_name:”+program_name)打印(的参数:+str(arg游戏))机器人.SendCmd(MSG_RUNPROG)机器人.send_int(program_id)机器人.send_line(program_name)为一个在arg游戏:机器人.send_line(一个)#等待程序调用完成如果机器人.recv_acknowledge():#通知我们已经完成了这个命令UpdateStatus(ROBOTCOM_READY)elifn_cmd_words>=2和cmd_line.startswith(“弹出”):UpdateStatus(ROBOTCOM_WORKING)消息=cmd_line[6:]机器人.send_line(消息)#等待命令执行如果机器人.recv_acknowledge():#通知我们已经完成了这个命令UpdateStatus(ROBOTCOM_READY)elifcmd_line.startswith(“断开”):#断开与机器人的连接机器人.SendCmd(MSG_DISCONNECT)机器人.recv_acknowledge()机器人.断开连接()UpdateStatus(ROBOTCOM_DISCONNECTED)elifcmd_line.startswith(“停止”)或cmd_line.startswith(“退出”):#停止driverç机器人.SendCmd(MSG_DISCONNECT)机器人.断开连接()UpdateStatus(ROBOTCOM_DISCONNECTED)辞职(0)#停止司机elifcmd_line.startswith(“c”):#自定义按原样转发的命令通过elifcmd_line==“t”:#调用自定义程序进行快速测试TestDriver()其他的:打印(“未知命令:”+str(cmd_line))如果收到了是不没有一个:UpdateStatus(ROBOTCOM_READY)#停止监控反馈ROBOT_MOVING=假defRunMain():"""调用主程序"""#齐平版print_message(KUKA IIWA机器人控制器的RoboDK Driver v2.0)#如果我们强制停止进程,断开机器人的连接是很重要的进口atexitatexit.注册(RobotDisconnect)# Flush Disconnected消息print_message(DRIVER_VERSION)UpdateStatus()#从STDIN运行驱动程序RunDriver()#用一组示例命令测试驱动程序TestDriver()如果__name__==“__main__”:"""调用主程序"""重要的是,将Main过程保留为RunMainRunMain()