ros系统下通过pyserial模块实现串口通讯(Python)

经过几天的摸索终于实现了:
在ros系统下,订阅Twist/cmd_vel 消息,经过USB转串口通信,实现了通过灯带实时反映小车(差速)运行状态的功能。
通信部分主要依赖pyserial模块的功能实现。

#!/usr/bin/env python
#coding=utf-8
import rospy
import serial
from geometry_msgs.msg import Twist
import roslib;roslib.load_manifest('ros_bringup')
import time

ser = serial.Serial(port='/dev/tty*', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=2,rtscts=True,dsrdtr=True)
ser.isOpen()   
res=ser.readall() 

def cmdcallback(msg):
    #rospy.Publisher('/cmd_vel',Twist)
    rospy.loginfo("Received a /cmd_vel message!")
    rospy.loginfo("Linear Components: [%f, %f, %f]"%(msg.linear.x, msg.linear.y, msg.linear.z))
    rospy.loginfo("Angular Components: [%f, %f, %f]"%(msg.angular.x, msg.angular.y, msg.angular.z))
    #####
    数据处理过程省略
    #####
    ser.write(data)
    
    s = ser.read(1)
    print(s)

def LED():
    rospy.init_node('cmd_vel_listener')
    rospy.Subscriber("/cmd_vel",Twist,cmdcallback)
    rospy.spin()
if __name__=="__main__":
    LED()

总体架构就是这样,其中也参考了(https://blog.csdn.net/as472780551/article/details/79126927);

ROS 2 中,要使用 Python 发布串口数据,需要使用 `serial` 包读取串口数据,并将其转换为 ROS 2 消息类型,然后使用 `rclpy` 包将消息发布到 ROS 2 系统中。以下为实现方式: 1. 安装 `serial` 包 ``` pip install pyserial ``` 2. 编写 Python 脚本 以下是发布串口数据的示例代码,其中使用 `Serial` 类从串口读取数据,并将其转换为 ROS 2 消息类型(此处使用 `std_msgs.msg.String`): ```python import serial import rclpy from std_msgs.msg import String def main(): # 初始化 ROS 2 节点 rclpy.init() node = rclpy.create_node('serial_publisher') # 打开串口 ser = serial.Serial('/dev/ttyUSB0', 9600) # 创建 ROS 2 发布者 pub = node.create_publisher(String, 'serial_data', 10) # 循环读取串口数据并发布 while rclpy.ok(): # 从串口读取数据 data = ser.readline().decode().rstrip() # 创建 ROS 2 消息并发布 msg = String() msg.data = data pub.publish(msg) # 关闭串口 ser.close() # 停止 ROS 2 节点 node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 在上述代码中,首先使用 `rclpy.init()` 和 `rclpy.create_node()` 初始化 ROS 2 节点,并创建了一个名为 `serial_publisher` 的节点。然后使用 `serial.Serial()` 打开串口,使用 `node.create_publisher()` 创建一个名为 `serial_data` 的主题,并指定消息类型为 `std_msgs.msg.String`。之后使用 `while` 循环从串口读取数据,并将其转换为 ROS 2 消息类型,最后使用 `pub.publish()` 发布消息到 ROS 2 系统中。在 `rclpy.ok()` 返回 `False` 时,循环结束,关闭串口并停止 ROS 2 节点。 3. 运行 Python 脚本 在终端中运行以下命令启动 ROS 2 节点: ``` ros2 run <package_name> <script_name> ``` 其中,`<package_name>` 为包名,`<script_name>` 为 Python 脚本名。在运行 Python 脚本前,需要先启动 ROS 2 系统。 4. 查看串口数据 在终端中运行以下命令查看串口数据: ``` ros2 topic echo /serial_data ``` 其中,`/serial_data` 为主题名。运行以上命令后,可以在终端中实时查看串口数据。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值