ros学习心得(十二)ros驱动-架构及电机驱动和编码器功能的实现

架构:

 上位机(ros驱动节点)与下位机以串口通讯的方式进行通讯

所以,代码women部分首先要导入串口通信

import serial

这是我们自己安装的包pyserial ,方法:输入命令:在hello_driver的文件夹下,pip install pyser

在电机驱动编码中,ros驱动功能包含了两个部分:①与下位机通讯(串口),②订阅主题消息

电机驱动程序:

#!/usr/bin/env python
#coding:utf-8import serial
import rospy
import structif __name__ == '__main__':#创建节点rospy.init_node('my_driver_node')ser = serial.Serial(port = '/dev/ttyUSB0',baudrate = 115200)#电机的驱动pack = struct.pack('h',5000)data = bytearray([0x03,pack[0],pack[1]])ser.write(data)rospy.spin()

与主机相连,命令行运行即可,电机就转起来了。

订阅主题程序:

#!/usr/bin/env python
#coding:utf-8import serial
import rospy
import struct#std_msgs/UInt32
from std_msgs.msg import Int32def motor_call_back(msg):#为了有语法提示if not isinstance(msg,Int32):return #接收到其他节点发送的数据pwm = msg.data#给下位机发送指令pack = struct.pack('h',pwm)data = bytearray([0x03,pack[0],pack[1]])ser.write(data)if __name__ == '__main__':#创建节点rospy.init_node('my_driver_node')#串口创建#重试机制count = 0while count < 10:count += 1try:ser = serial.Serial(port = '/dev/ttyUSB0',baudrate = 115200)#如果出错了,后面的代码就不执行了#能达到这个位置说明,链接成功breakexcept Exception as e:print 'e'#创建一个电机指令的订阅者motor_topic_name = ''rospy.Subscriber(motor_topic_name,Int32,motor_call_back)rospy.spin()

运行之后,在命令行可以利用pyqt的方式进行调试。

 以下两种命令是直接操控电机data的值。

 ros编码器功能实现:

#!/usr/bin/env python
#coding:utf-8import serial
import rospy
import struct#std_msgs/UInt32
from std_msgs.msg import Int32
from std_msgs.msg import Float32def motor_call_back(msg):#为了有语法提示if not isinstance(msg,Int32):return #接收到其他节点发送的数据pwm = msg.data#给下位机发送指令pack = struct.pack('h',pwm)data = bytearray([0x03,pack[0],pack[1]])ser.write(data)if __name__ == '__main__':#创建节点rospy.init_node('my_driver_node')#串口创建#重试机制count = 0while count < 10:count += 1try:ser = serial.Serial(port = '/dev/ttyUSB0',baudrate = 115200)#如果出错了,后面的代码就不执行了#能达到这个位置说明,链接成功breakexcept Exception as e:print 'e'#创建一个电机指令的订阅者motor_topic_name = ''rospy.Subscriber(motor_topic_name,Int32,motor_call_back)#编码器encoder_topic_name = '/rpm'rpm_publisher= rospy.Publisher(encoder_topic_name,Float32,queue_size=100)#和下位机进行通讯while not rospy.is_shutdown():#阻塞式函数read = ser.read(2)data = bytearray([])data.extend(read)#bytearray 数据 到 数字类型data = struct.unpack('h',data)[0]rpm = data /100.0#将数据发布出去msg = Float32()msg.data = rpmrpm_publisher.publish(msg)rospy.spin()

最后运行,简单调试一下,用pyqt.

或者利用另一种命令: 

 将电机和转速这种协议用ros的方式把它封装成了一个驱动。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部