架构:
上位机(ros驱动节点)与下位机以串口通讯的方式进行通讯
所以,代码women部分首先要导入串口通信
import serial
这是我们自己安装的包pyserial ,方法:输入命令:在hello_driver的文件夹下,pip install pyser
在电机驱动编码中,ros驱动功能包含了两个部分:①与下位机通讯(串口),②订阅主题消息
电机驱动程序:
#!/usr/bin/env python
#coding:utf-8
import serial
import rospy
import struct
if __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-8
import serial
import rospy
import struct
#std_msgs/UInt32
from std_msgs.msg import Int32
def 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 = 0
while count < 10:
count += 1
try:
ser = serial.Serial(port = '/dev/ttyUSB0',baudrate = 115200)
#如果出错了,后面的代码就不执行了
#能达到这个位置说明,链接成功
break
except 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-8
import serial
import rospy
import struct
#std_msgs/UInt32
from std_msgs.msg import Int32
from std_msgs.msg import Float32
def 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 = 0
while count < 10:
count += 1
try:
ser = serial.Serial(port = '/dev/ttyUSB0',baudrate = 115200)
#如果出错了,后面的代码就不执行了
#能达到这个位置说明,链接成功
break
except 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 = rpm
rpm_publisher.publish(msg)
rospy.spin()
最后运行,简单调试一下,用pyqt.
或者利用另一种命令:
将电机和转速这种协议用ros的方式把它封装成了一个驱动。