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

上一篇 (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

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

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import time
import serial



import rclpy                      # ROS2 Python接口库
from rclpy.node   import Node     # ROS2 节点类
from std_msgs.msg import String   # ROS2标准定义的String消息
serial_port = serial.Serial(
    port="/dev/ttyUSB0",
    baudrate=115200,
    bytesize=serial.EIGHTBITS,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    )
"""
创建一个订阅者节点
"""
class SubscriberNode(Node):
    
    def __init__(self, name):
        super().__init__(name)                             # ROS2节点父类初始化
        self.sub = self.create_subscription(\
            String, "subscribe_and_publish", self.listener_callback, 10) # 创建订阅者对象(消息类型、话题名、订阅者回调函数、队列长度)
        self.get_logger().info('I am subscriber')
        

    def listener_callback(self, msg):                      # 创建回调函数,执行收到话题消息后对数据的处理
        self.get_logger().info('I heard: "%s"' % msg.data) # 输出日志信息,提示订阅收到的话题消息
        if msg.data=="1000":
            myinput=[0xff, 0x31, 0x01, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0xFC]
        elif msg.data=="0100":
            myinput=[0xff, 0x31, 0x00, 0x00, 0x00, 0x31, 0x01, 0x00, 0x00, 0xFC]
        elif msg.data=="0010":
            myinput=[0xff, 0x32, 0x01, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0xFC]
        elif msg.data=="0001":
            myinput=[0xff, 0x31, 0x01, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0xFC]    
        else:
            myinput=[0xff, 0x32, 0x01, 0x01, 0x00, 0x32, 0x00, 0x01, 0x00, 0xFC]

        serial_port.write(myinput)
        serial_port.write('\r\n'.encode())


def main(args=None):                               # ROS2节点主入口main函数


    rclpy.init(args=args)                          # ROS2 Python接口初始化
    node = SubscriberNode("header_python_subscriber_node")  # 创建ROS2节点对象并进行初始化
    rclpy.spin(node)                               # 循环等待ROS2退出
    node.destroy_node()                            # 销毁节点对象
    rclpy.shutdown()                               # 关闭ROS2 Python接口
    serial_port.close()

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

from setuptools import setup

package_name = 'header_python'

setup(
    name=package_name,
    version='0.0.0',
    packages=[package_name],
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='sean',
    maintainer_email='@todo.todo',
    description='TODO: Package description',
    license='TODO: License declaration',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
        'header_python_subscriber_node  = header_python.header_python_subscriber:main',
        ],
    },
)

四、编译

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进制方式接收

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值