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

架构:

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

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

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

import serial

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

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

在电机驱动编码中,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()

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

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

订阅主题程序:

#!/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学习心得(十二)ros驱动-架构及电机驱动和编码器功能的实现_第4张图片

 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学习心得(十二)ros驱动-架构及电机驱动和编码器功能的实现_第5张图片

或者利用另一种命令: 

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

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

你可能感兴趣的:(ros基础,qt)