当前位置:   article > 正文

ROS2humble使用python3-serial库实现接收话题数据并采用16进制发送到串口_ros2 串口通信python

ros2 串口通信python

上一篇 (139条消息) ROS2将键盘方向键控制指令通过串口发送_识龟成鳖的博客-CSDN博客,实现了电脑键盘4个方向键读取,并通过话题发送出来,另一个节点接收话题并通过串口发送。当时用虚拟串口工具socat测试都没问题,但接到usb串口实物后发现发送出来的数据有问题,安装cutecom测试硬件驱动都没有问题,定位问题在发送程序,但很久都没解决。限于目前的能力,只能另外再找库。初步想法:电脑读取4个方向键节点不变,另建一个python功能包,接收方向键话题,再用python3-serial库将控制数据发送到串口。

参考博客:

(139条消息) ROS2实现虚拟串口通信_ros与主机通过虚拟串口通信_ff925的博客-CSDN博客

(139条消息) 使用python serial 库发送16进制数据_python serial以16进制发送_New农民工的博客-CSDN博客

以及古月居的python话题例程

《ROS2入门21讲图文教程 | 10、话题》 - 古月居 (guyuehome.com)

一、安装python3-serial库

sudo apt-get install python3-serial

二、新建python功能包

~/dev_A1/src$ ros2 pkg create --build-type ament_python header_python

进入~/dev_A1/src/header_python/header_python$文件夹

gedit header_python_subscriber.py

将以下代码复制到新建文件

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import time
  4. import serial
  5. import rclpy # ROS2 Python接口库
  6. from rclpy.node import Node # ROS2 节点类
  7. from std_msgs.msg import String # ROS2标准定义的String消息
  8. serial_port = serial.Serial(
  9. port="/dev/ttyUSB0",
  10. baudrate=115200,
  11. bytesize=serial.EIGHTBITS,
  12. parity=serial.PARITY_NONE,
  13. stopbits=serial.STOPBITS_ONE,
  14. )
  15. """
  16. 创建一个订阅者节点
  17. """
  18. class SubscriberNode(Node):
  19. def __init__(self, name):
  20. super().__init__(name) # ROS2节点父类初始化
  21. self.sub = self.create_subscription(\
  22. String, "subscribe_and_publish", self.listener_callback, 10) # 创建订阅者对象(消息类型、话题名、订阅者回调函数、队列长度)
  23. self.get_logger().info('I am subscriber')
  24. def listener_callback(self, msg): # 创建回调函数,执行收到话题消息后对数据的处理
  25. self.get_logger().info('I heard: "%s"' % msg.data) # 输出日志信息,提示订阅收到的话题消息
  26. if msg.data=="1000":
  27. myinput=[0xff, 0x31, 0x01, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0xFC]
  28. elif msg.data=="0100":
  29. myinput=[0xff, 0x31, 0x00, 0x00, 0x00, 0x31, 0x01, 0x00, 0x00, 0xFC]
  30. elif msg.data=="0010":
  31. myinput=[0xff, 0x32, 0x01, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0xFC]
  32. elif msg.data=="0001":
  33. myinput=[0xff, 0x31, 0x01, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0xFC]
  34. else:
  35. myinput=[0xff, 0x32, 0x01, 0x01, 0x00, 0x32, 0x00, 0x01, 0x00, 0xFC]
  36. serial_port.write(myinput)
  37. serial_port.write('\r\n'.encode())
  38. def main(args=None): # ROS2节点主入口main函数
  39. rclpy.init(args=args) # ROS2 Python接口初始化
  40. node = SubscriberNode("header_python_subscriber_node") # 创建ROS2节点对象并进行初始化
  41. rclpy.spin(node) # 循环等待ROS2退出
  42. node.destroy_node() # 销毁节点对象
  43. rclpy.shutdown() # 关闭ROS2 Python接口
  44. serial_port.close()

三、修改setup.py文件如下:

  1. from setuptools import setup
  2. package_name = 'header_python'
  3. setup(
  4. name=package_name,
  5. version='0.0.0',
  6. packages=[package_name],
  7. data_files=[
  8. ('share/ament_index/resource_index/packages',
  9. ['resource/' + package_name]),
  10. ('share/' + package_name, ['package.xml']),
  11. ],
  12. install_requires=['setuptools'],
  13. zip_safe=True,
  14. maintainer='sean',
  15. maintainer_email='@todo.todo',
  16. description='TODO: Package description',
  17. license='TODO: License declaration',
  18. tests_require=['pytest'],
  19. entry_points={
  20. 'console_scripts': [
  21. 'header_python_subscriber_node = header_python.header_python_subscriber:main',
  22. ],
  23. },
  24. )

四、编译

cd ~/dev_A1/

colcon build

五、测试

5.1先进入上篇的发布节点功能包,打开发布节点

source install/setup.bash

ros2 run cpp_header serial_publisher1_node

5.2插好串口线,一个接虚拟机,一个接windows

打开一个终端,修改ttyusb0权限

sudo chmod 666 ttyUSB0

5.3进入接收节点功能包,启动接收节点

source install/setup.bash

ros2 run header_python header_python_subscriber_node

5.4在windows 打开串口助手软件,接收串口数据,选择16进制方式接收

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/766138
推荐阅读
相关标签
  

闽ICP备14008679号