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

架构:

 上位机(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的方式把它封装成了一个驱动。

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值