ros2串口通信

2023-05-16

目录

    • 前期准备
    • 新建工程
    • 添加头文件
    • 添加源文件
    • 添加节点源文件
    • 修改package.xml和CMakeLists.txt
    • 安装依赖
    • 编译执行
    • 打开虚拟串口
    • 打开发布者
    • 打开订阅者
    • 打开监听,查看是否有数据接收

前期准备

登录github下载代码https://github.com/chouer19/eqProj

新建工程

cd ~/dev_ws/src/cpp_header/include/cpp_header

添加头文件

touch minimal_publisher.hpp

打开github上下载的文件夹,找到eq-hmi20191219/header/drive中的dri_serialport.hpp,将其中的内容复制到打开的文件中

添加源文件

cd ~/dev_ws/src/cpp_header/src
touch minimal_publisher.cpp

将eq-hmi20191219/sources/drive中的dri_serialport.cpp中的内容复制到打开的文件中

添加节点源文件

cd ~/dev_ws/src/cpp_header/src
touch minimal_publisher_node.cpp

将以下内容复制到打开的文件中

#include "cpp_header/minimal_publisher.hpp"
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"


int fp;
unsigned char Msg[128] = { 0 };
const char* constc = nullptr;
Serial sp;
class TopicSuscribe01 : public rclcpp::Node
{
public:
    TopicSuscribe01(std::string name) : Node(name)
    {
        RCLCPP_INFO(this->get_logger(),"我是%s,订阅话题为:/order.",name.c_str());
        command_subscribe_ = this->create_subscription<std_msgs::msg::String>("order",10,std::bind(&TopicSuscribe01::command_callback,this,std::placeholders::_1));
    }
private:
    rclcpp::Subscription<std_msgs::msg::String>::SharedPtr command_subscribe_;
    void command_callback(const std_msgs::msg::String::SharedPtr msg)
    {
        double speed = 0.0f;
        if(msg->data == "6666")
        {
            speed = 0.2f;

        }
        RCLCPP_INFO(this->get_logger(),"收到的[%s]指令,发送速度%f",msg->data.c_str(),speed);
        
        constc = msg->data.c_str();
        
        sp.WriteData(fp,constc,10);
    }

};


int main(int argc, char **argv)
{
    /* code */
    rclcpp::init(argc, argv);
    /*产生一个Wang2的节点*/
    // auto node = std::make_shared<rclcpp::Node>("pub_serial");
    auto node = std::make_shared<TopicSuscribe01>("topic_subscribe_01");
    // 打印一句自我介绍
    // int fp;
    // Serial sp;
    sp.BaudRate(115200);
    fp = sp.OpenPort(COM3);
    if(fp>0){
      RCLCPP_INFO(node->get_logger(), "serial success!.");
    }
    sp.WriteData(fp,"1024",10);
    // cout<<fp<<endl;

    RCLCPP_INFO(node->get_logger(), "大家好,我是topic_subscribe_01.");
    /* 运行节点,并检测退出信号*/
    rclcpp::spin(node);
    rclcpp::shutdown();
    sp.ClosePort(fp);
    return 0;
    
    return 0;
}

修改package.xml和CMakeLists.txt

先打开package.xml

cd dev_ws/src/cpp_header/src
gedit package.xml

将以下两行代码

<depend>rclcpp</depend>
<depend>std_msgs</depend>

添加到如图位置,添加后效果如下图

  <buildtool_depend>ament_cmake</buildtool_depend>

  <depend>rclcpp</depend>
  <depend>std_msgs</depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

再修改CMakeLists.txt

gedit CMakeLists.txt

将下面两行代码添加进CMakeists.txt

find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)

添加效果如下

find_package(ament_cmake REQUIRED)

find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)

在刚刚添加的两行代码下方,添加以下两行可执行文件代码

include_directories(include)
add_executable(talker src/minimal_publisher_node.cpp src/minimal_publisher.cpp) 
ament_target_dependencies(talker rclcpp std_msgs)

效果如下

find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)

include_directories(include)
add_executable(talker src/minimal_publisher_node.cpp src/minimal_publisher.cpp) 
ament_target_dependencies(talker rclcpp std_msgs)

安装依赖

新建终端

cd ~/dev_ws/
rosdep install -i --from-path src --rosdistro galactic -y

编译执行

colcon build
source install/setup.bash
ros2 run cpp_header talker

(talker可以在CMakeists.txt修改可执行文件名)

打开虚拟串口

这里使用的是socat虚拟串口工具,没有安装的可以点击传送门 socat安装

socat -d -d pty,raw,echo=0 pty,raw,echo=0

在这里插入图片描述

根据提供的串口去minimal_publisher.cpp中设置对应串口号

 char *device;
    struct termios termios_old;
    int fd;
    switch(index)
    {
    case COM0:  device="/dev/ttyS0";  break;
    case COM1:  device="/dev/ttyS1";  break;
    case COM2:  device="/dev/ttyS2";  break;
    case COM3:  device="/dev/pts/3";  break;
    case ttyUSB0:  device="/dev/ttyUSB0";  break;
    case ttyUSB1:  device="/dev/ttyUSB1";  break;
    case ttyUSB2:  device="/dev/ttyUSB2";  break;
    default: device="/dev/ttyAMA2"; break;
    }

打开发布者

关于如何建立发布者,可以看我之前的文章ros2发布订阅
打开文件topic_publisher_01,修改话题名,和minimal_publisher_node.cpp一致

以下为topic_publisher_01.cpp内的修改,设置话题为order

public:
    // 构造函数,有一个参数为节点名称
    TopicPublisher01(std::string name) : Node(name)
    {
        RCLCPP_INFO(this->get_logger(), "大家好,我是%s.", name.c_str());
        // 创建发布者
        command_publisher_ = this->create_publisher<std_msgs::msg::String>("order", 17);
        // 创建定时器,500ms为周期,定时发布
        timer_ = this->create_wall_timer(std::chrono::milliseconds(500), std::bind(&TopicPublisher01::timer_callback, this));
    }

匹配minimal_publisher_node.cpp中的order

public:
    TopicSuscribe01(std::string name) : Node(name)
    {
        RCLCPP_INFO(this->get_logger(),"我是%s,订阅话题为:/order.",name.c_str());
        command_subscribe_ = this->create_subscription<std_msgs::msg::String>("order",10,std::bind(&TopicSuscribe01::command_callback,this,std::placeholders::_1));
    }

新建终端,启动发布者

cd ros2_ws
colcon build
source install/setup.bash
ros2 run example_topic_rclcpp topic_publisher_01

在这里插入图片描述

打开订阅者

新建终端

cd dev_ws
colcon build
source install/setup.bash
ros2 run cpp_header talker 

在这里插入图片描述

打开监听,查看是否有数据接收

新建终端
监听上文使用socat建立的另一个虚拟串口

cat < /dev/pts/4

在这里插入图片描述
可以看到,有数据传输。

ros2串口通信结束。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ros2串口通信 的相关文章

  • git-lfs filter-process: git-lfs: command not found

    最初是认为网络不稳定 xff0c 或者git版本过低 开始自己的git版本是1 20 xff0c 后续升级为1 32仍旧存在这个问题 之后安装了git lfs xff0c 问题解决 不知道为什么其他同事没有出现该问题 brew instal

随机推荐

  • gazebo和rviz有具体的区别吗?哪个更好用?

    文章来源 xff1a 企鹅号 古月居 https www zhihu com question 268658280 answer 340190866 简单来讲 xff0c 两者的主要功能不同 xff0c 没办法比较哪个更好用 xff0c 如
  • Ubuntu下好用的录屏和视频格式转换工具

    xff08 1 xff09 Ubuntu录屏工具 kazam 安装 sudo apt get install kazam 安装完之后 xff0c 命令行中输入 xff1a kazam 就可以启动工具了 xff0c 可以看到工具界面如下 xf
  • linux的fork和vfork

    fork和vfork 区别 fork函数和vfork函数都可以用来创建一个子进程 他们有什么区别呢 xff1f 首先是fork xff1a 内核会给子进程分配虚拟内存空间和id xff0c 但不会分配物理内存子进程一开始是共享父进程的物理空
  • 经典卷积神经网络(一):LeNet-5和AlexNet

    本节介绍几种广泛使用的典型深层卷积神经网络 LeNet 5 LeNet 5 LeCun et al 1998 虽然提出的时间比较早 xff0c 但是是一个非常成功 的神经网络模型 基于LeNet 5的手写数字识别系统在90年代被美国很多银行
  • FreeRTOS中打开关闭任务切换

    本文介绍FreeRTOS中解决多任务之间互相影响的两种方法 1 基本临界区 基本临界区是指宏 taskENTER CRITICAL 与taskEXIT CRITICAL 之间的代码区间 xff0c 下面是一段范例代码 Critical Se
  • 嵌入式八股文汇总

    1 C C 43 43 1 1 关键字 xff08 参考 嵌入式及Linux那些事 以及众多帖子汇总而成 xff09 volatile 当声明指向设备寄存器的指针时一定要用volatile xff0c 它会告诉编译器不要对存储在这个地 址的
  • 嵌入式面试常考问题

    面试经验 c c 43 43 1 malloc与new的区别 1 new是操作符 xff0c malloc是函数 2 new使用时先分配内存 xff0c 再调用构造函数 xff0c 释放时调用析构函数 3 new只能分配实例所占类型的整数倍
  • 神经网络应用较多的算法,图卷积神经网络应用

    神经网络原理及应用 神经网络原理及应用1 什么是神经网络 xff1f 神经网络是一种模拟动物神经网络行为特征 xff0c 进行分布式并行信息处理的算法 这种网络依靠系统的复杂程度 xff0c 通过调整内部大量节点之间相互连接的关系 xff0
  • K8S api接口详解

    一 创建管理员用户 xff0c 授权 xff0c 获取token值 1 创建用户 编写CreateServiceAccount yaml文件 span class token key atrule apiVersion span span
  • OpenStack floating IP

    1 弹性公网IP 私有IP 浮动IP 虚拟IP之间区别 弹性公网IP是可以直接访问Internet的IP地址 一个弹性公网IP只能给一个ECS使用 私有IP是公有云内网所使用的IP地址 xff0c 用于内网通信 xff0c 私有IP不能访问
  • 修改apt-get源为国内镜像源

    span class token comment 备份 span span class token function cp span etc apt sources list etc apt sources list bak span cl
  • Ubuntu安装aptitude

    安装aptitude xff0c 利用aptitude对依赖关系进行智能处理 span class token function sudo span span class token function apt get span span c
  • ubuntu桌面出现问题,重启x桌面方法

    ubuntu默认有7个console xff0c ctr 43 alt 43 xff08 F1 F7 xff09 可以切换控制台 xff0c 其中F7是图形界面 xff0c 其余都是字符界面 X window出现问题 xff0c 需要进入字
  • Linux-KVM虚拟机的创建和快照命令

    KVM xff1a Kernel based Virtual Machine的简称 xff0c 是一个开源的系统虚拟化模块 xff0c 自Linux 2 6 20之后集成在Linux的各个主要发行版本中 安装虚拟机脚本 xff1a 虚拟机的
  • 浅谈stm32的低功耗模式

    stm32标准库实现低功耗 一 概述 stm32不同系列芯片支持的低功耗模式各有差异 xff0c 本文以F103系列芯片为例 xff0c 简单讲解不同低功耗模式的特点和使用方法 二 低功耗 简述 默认情况下 xff0c 系统或电源复位后 x
  • Vncservice多用户登陆

    1 修改 etc sysconfig vncserver 添加一个 longgangtest 的用户 2 在系统中新建一个 longgangtest的用户 adduser longgangtest 然后执行 好像需要执行 xff0c 测试的
  • 使用正点原子资料点亮野火linux开发板LED

    64 TOC
  • 斜杠、反斜杠的区别

    我们在写程序时候经常会混淆 和 xff0c 经常听到别人讲 斜杠 xff0c 反斜杠 xff0c 那么怎么区分它们呢 xff1f 还有它们各在什么样的场景下使用呢 xff1f 本篇文章是来区别这两个符号和总结使用它们的情形 1 区分 是斜杠
  • 七月在线机器学习

    异方差性ID3算法中文分词HMM非参数统计和参数统计切比雪夫不等式条件熵K L变换和主成分分解生成模型和判别模型非抽样误差径向基函数线性回归的基本假设最大熵SVM中的C和gamma参数距离度量牛顿法和拟牛顿法拉灯问题铺瓷砖问题哈夫曼编码树最
  • ros2串口通信

    目录 前期准备新建工程添加头文件添加源文件添加节点源文件修改package xml和CMakeLists txt安装依赖编译执行打开虚拟串口打开发布者打开订阅者打开监听 xff0c 查看是否有数据接收 前期准备 登录github下载代码ht