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的方式把它封装成了一个驱动。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
