机械臂的控制原本使用的就是ROS进行的,奈何实验室机械臂上买的机械二指夹爪并不支持ROS平台,及没有对应的模型文件和控制的包,因此控制机械手爪就需要其他办法。

所使用的机械手爪为nGripper90,如下图所示,查看手爪的用户手册发现,其配套包括ModBus/Tcp、UR Ethernet/IP和I/O控制三种方式,那么在ROS中可以选择使用ModBus/Tcp协议对齐进行简单的控制。

咨询过机械手爪厂家的技术人员后,给出了modbus/tcp控制机械手爪需要操作的寄存器,那就是nUC-S_CB4.0中的3006-3008三个寄存器,其中3006控制机械手爪的位置,内容为0-4095,其中0代表机械手抓闭合,4095代表手爪张开到最大程度;3007为机械手爪的速度,范围是0-1000,默认值是885;力的大小范围是0-1000,默认值为1000。简单的抓取只要向3006地址写位置就行。

首先需要在ROS中安装基本的modbus支持:

sudo apt-get install python-pymodbus

sudo apt-get install python-pyasn1 python-twisted-conch

接着在ROS上可以找到一个将modbus协议与ros标准通信方式进行转换的包,可以在ROS wiki上找到这个网页(点击这里),打开自己的工作空间进行下载编译:

cd catkin_ws/src

git clone https://github.com/HumaRobotics/modbus.git

cd ..

catkin_make

首先将机械手爪设置为modbus/tcp的服务端,打开下载文件夹modbus/modbus_client.py文件,此为modbus的客户端:

import rospy
from modbus.modbus_wrapper_client import ModbusWrapperClient
from std_msgs.msg import Int32MultiArray as HoldingRegisterNUM_REGISTERS = 20
ADDRESS_READ_START = 40000
ADDRESS_WRITE_START = 40020if __name__=="__main__":rospy.init_node("modbus_client")rospy.loginfo("""This file shows the usage of the Modbus Wrapper Client.To see the read registers of the modbus server use: rostopic echo /modbus_wrapper/inputTo see sent something to the modbus use a publisher on the topic /modbus_wrapper/outputThis file contains a sample publisher.""")host = "192.168.0.123"port = 502if rospy.has_param("~ip"):host =  rospy.get_param("~ip")else:rospy.loginfo("For not using the default IP %s, add an arg e.g.: '_ip:=\"192.168.0.199\"'",host)if rospy.has_param("~port"):port =  rospy.get_param("~port")else:rospy.loginfo("For not using the default port %d, add an arg e.g.: '_port:=1234'",port)# setup modbus client    modclient = ModbusWrapperClient(host,port=port,rate=50,reset_registers=False,sub_topic="modbus_wrapper/output",pub_topic="modbus_wrapper/input")modclient.setReadingRegisters(ADDRESS_READ_START,NUM_REGISTERS)modclient.setWritingRegisters(ADDRESS_WRITE_START,NUM_REGISTERS)rospy.loginfo("Setup complete")# start listening to modbus and publish changes to the rostopicmodclient.startListening()rospy.loginfo("Listener started")################## Example 1# Sets an individual register using the python interface, which can automatically be reset, if a timeout is given.register = 40020value = 1timeout = 0.5modclient.setOutput(register,value,timeout)rospy.loginfo("Set and individual output")################################### Example 2# Create a listener that show us a message if anything on the readable modbus registers changerospy.loginfo("All done. Listening to inputs... Terminate by Ctrl+c")def showUpdatedRegisters(msg):rospy.loginfo("Modbus server registers have been updated: %s",str(msg.data))sub = rospy.Subscriber("modbus_wrapper/input",HoldingRegister,showUpdatedRegisters,queue_size=500)################################### Example 3# writing to modbus registers using a standard ros publisherpub = rospy.Publisher("modbus_wrapper/output",HoldingRegister,queue_size=500)output = HoldingRegister()output.data = xrange(20,40)output2 = HoldingRegister()output2.data = xrange(40,20,-1)rospy.loginfo("Sending arrays to the modbus server")while not rospy.is_shutdown():rospy.sleep(1)pub.publish(output)rospy.sleep(1)pub.publish(output2)################## Stops the listener on the modbusmodclient.stopListening()

因为控制机械手爪这里只需要对3006单个寄存器进行写寄存器操作,因此将上面程序进行删减:

import rospy
from modbus.modbus_wrapper_client import ModbusWrapperClient
from std_msgs.msg import Int32MultiArray as HoldingRegisterNUM_REGISTERS = 1
ADDRESS_WRITE_START = 3006if __name__=="__main__":rospy.init_node("modbus_client")host = "192.168.1.110"port = 502# setup modbus client    modclient = ModbusWrapperClient(host,port=port,rate=50,reset_registers=False,sub_topic="modbus_wrapper/output",pub_topic="modbus_wrapper/input")modclient.setWritingRegisters(ADDRESS_WRITE_START,NUM_REGISTERS)rospy.loginfo("Setup complete")register = 3006value = 0timeout = 0modclient.setOutput(register,value,timeout)rospy.loginfo("Set and individual output")

使用modbus poll和modbus slave可以进行modbus模拟通信,发现该程序可以更改modbus slave中的数据,但是实际测试机械臂的手爪并不可以。使用modbus poll可以控制机械手爪,查看报文内容如下:

01 1A 00 00 00 06 01 06 0B BE 0F FF

而使用ROS发送给 modbus slave的报文内容无法直接查看,可以通过Wireshark进行抓包,查看报文内容,以下为抓取到的报文内容:

可以看出该段程序所产生的报文所使用的功能码为16:写多个寄存器,而我是写单个寄存器,通过分析 modbus_wrapper_client以及prmodbus,发现需要将程序这样简单修改即可:

import rospy
from modbus.modbus_wrapper_client import ModbusWrapperClient
from pymodbus.client.sync import ModbusTcpClientif __name__=="__main__":rospy.init_node("modbus_client")host = "192.168.1.110"port = 502# setup modbus client    modclient = ModbusWrapperClient(host,port=port,rate=50,reset_registers=False,sub_topic="modbus_wrapper/output",pub_topic="modbus_wrapper/input")#3006为地址,0为写入的内容modclient.client.write_register(3006,0)rospy.loginfo("Setup complete")

运行方法:

roscore

rosrun modbus modbus_client.py

在ROS上使用ModBus/Tcp协议控制机械手爪相关推荐

  1. C#上位机与台达PLC通信,modbus TCP协议

    C#上位机与台达PLC通信,modbus TCP协议. 1.真实使用项目,该程序框架完整,适合在此基础上开发项目. 2.使用VS2019开发. 3.项目还涉及到halcon视觉检测功能. YID:76 ...

  2. 如何使用python读取modbus/TCP协议数据

    文章目录 前言 一.modbus_tk是什么? 二.modbus_tk的使用步骤 三.使用modscan测试 四.32位无符号短整型数据转为64位float数据 五.总结 前言 在做项目的时候,需要使 ...

  3. 力控 串口服务器 虚拟串口,M4系列串口服务器与力控组态软件MODBUS TCP 协议通信--有人物联网.pdf...

    M4系列串口服务器与力控组态软件MODBUS TCP 协议通信--有人物联网.pdf M4 系列串口服务器与力控组态软件MODBUS TCP 协议通信 M4系列串口服务器与力控组态软件MODBUS T ...

  4. Modbus和Modbus/TCP协议

    Modbus和Modbus/TCP协议 文章目录 Modbus和Modbus/TCP协议 一. 概述 二. 协议规范 (1) Modbus应用协议 (2)通用Modbus帧结构--协议数据单元(PDU ...

  5. DI计数器Modbus TCP协议2路PWM输出WiFi模块

    产品特点: ● 3路开关量输入,2路开关量输出 ● DI每一路都可用作计数器或者频率测量 ● DO每一路都可独立输出PWM信号 ● 支持Modbus TCP 通讯协议 ● 内置网页功能,可以通过网页查 ...

  6. 3路DI计数器,2路PWM输出,Modbus TCP协议,WiFi模块WJ165

    产品特点: ●  3路开关量输入,2路开关量输出 ●  DI每一路都可用作计数器或者频率测量 ●  DO每一路都可独立输出PWM信号 ● 支持Modbus TCP 通讯协议 ● 内置网页功能,可以通过 ...

  7. 4路DI开关检测计数器, Modbus TCP协议,WiFi模块 WJ160

    产品特点: ●  4路开关量输入,支持NPN和PNP输入 ●  DI每一路都可用作计数器或者频率测量 ● 支持Modbus TCP 通讯协议 ● 可以设置每转脉冲数用于转速测量 ● 内置网页功能,可以 ...

  8. ModBus/TCP协议分析

    ModBus/TCP协议分析 一.术语 1 word = 2 byte; 1 byte = 8 bit. 校验码:校验码是由前面的数据通过某种算法得出的,用以检验该组数据的正确性.代码作为数据在向计算 ...

  9. 1路编码器或2路DI脉冲计数器,Modbus TCP协议,WiFi模块

    ● 编码器解码转换成标准Modbus TCP协议 ● 可用作编码器计数器或者转速测量 ● 支持编码器计数,可识别正反转,支持4倍频计数 ● 也可以设置作为2路独立DI高速计数器 ● 计数值断电自动保存 ...

最新文章

  1. 一种不会导致资源泄露的“终止”线程的方法
  2. 算法解读--递归(二)
  3. SQL内存优化-最大化使用内存
  4. stringbuffer mysql_javascript制作sql转换为stringBuffer的小工具
  5. 超级全面的权限系统设计方案
  6. CF1100F Ivan and Burgers(线性基)
  7. 个性化显示服务器,Linux系统个性化登录提示信息的方法
  8. python 车牌识别简单_简单30行Python代码让你玩转YOLO目标识别检测!
  9. Oracle DECODE函数的语法介绍
  10. WSS3 Elevation of Privilege 替代 用户身份模拟Impersonate 进行权限提升
  11. BPM那些事儿——BPM与SOA的演进与展望
  12. yum安装freeswitch
  13. graphpad两组t检验_GraphPad prism -- t检验操作步骤解析~
  14. mysql 插入微信名有特殊字符的问题
  15. 画一只动态皮卡丘(一)
  16. 计算机用户凭据删除,win8系统如何删除保存的共享凭据(用户名和密码)
  17. 如何绕开对通用VMware虚拟机检测
  18. 计算机操作系统复习资料
  19. 【掌控板-arduino】3.1 SH1106显示图片
  20. 跟着团子学SAP PS—项目中的物料需求逻辑及导入程序设计要点(采购标识符/BAPI_NETWORK_COMP_ADD)

热门文章

  1. SolidWorks PDM如何在WORD文档中进行电子签名
  2. 前端体系xmind思维导图集合
  3. Vue中,一个组件调用其他组件的方法(非父子组件)
  4. auto.js开发_赚钱( $ _ $ )app脚本_ZHOU125disorder_
  5. 潼湖科技小镇正式开园,碧桂园首推产城服务“5678”方法论
  6. 数据分类分级的概念、方法、标准及行业实践
  7. Vue版本echarts 全国地图geo、geo3D
  8. 华为设备linux ssh登录失败,在华为设备上配置一个SSH登录案例
  9. ubuntu离线安装lightgbm,报错OSError: /home/feng/anaconda3/envs/py36/bin/../lib/libgomp.so.1: version `GOMP_
  10. BIOS ACPI基础(总览)