ros实现串口通信(记录一次脱发的经历)

2023-05-16

组长发布任务,我负责使用ros实现串口通讯。怎么说呢,头发可以在地上、桌子上甚至任何地方,除了头上~~


经过询问,任务大概分为三个点:
1、接收话题名为“config_detector”的信息,判断串口是否打开,读入串口名称
2、如果串口不打开,读入“SerialData.yml”文件中的数据,并发布话题名为“serial_recieve”的信息。然后再接收话题为“serial_sendmsg”的数据,直接打印其中的数据
3、如果串口打开,从串口中读入数据然后并发布话题名为“serial_recieve”的信息,同时,接收话题为“serial_sendmsg”的信息,然后传递给串口。

具体代码如下:

#include "../include/serial/serial.h"
#include "../include/serial/SerialPort.h"
#include "../include/serial/Protocol.h"
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "opencv2/opencv.hpp"
#include <iostream>
#include <sstream>
#include <thread>
#include <mutex>
#include <time.h>
using namespace std;
using namespace cv;



static fyt_msg::DetectorParam detectorParam;
static fyt_msg::SerialRecieveMsg serialRecieveMsg;
static fyt_msg::SerialSendMsg serialSendMsg;

static int serialopen_flag; //串口标识
static string port_name = "/dev/ttyUSB0";   //初始化串口名称
SerialPort serial_port("/dev/ttyUSB0"); //定义SerialPort




//接受节点传来的装甲板参数后回调函数
void doSerialSendMsg(const fyt_msg::SerialSendMsg::ConstPtr& msg)
{
    setlocale(LC_ALL,""); 
    //ros_info可以输出中文
    //串口开启
    if(serialopen_flag == 1)
    {
        ROS_INFO("Starting passing data to serialport!");
        Protocol protocol(serial_port);
        cv::Point3f target;
        target.x = msg->distance;
        target.y = msg->pitch;
        target.z = msg->yaw;
        protocol.sendTarget(target);    //传参,打印参数

    }
    //串口不开启
    else if(serialopen_flag == 0)
    {
        ROS_INFO("msg->yaw:%lf",msg->yaw);
        ROS_INFO("msg->distance:%lf",msg->distance);
        ROS_INFO("msg->pitch:%lf",msg->pitch);
    }     
}





//接收节点config_node的信息后回调函数
void IsSerialOpen(const fyt_msg::DetectorParam::ConstPtr& msg)
{
        //串口通信打开,输出提示
        //读取串口中的数据,作为话题发布出去

    setlocale(LC_ALL,"");       //ros_info可以输出中文
    if(msg->use_serial==1)      //串口开启
    {
        serialopen_flag = 1;    //串口标识
        ROS_INFO("The use_serial is opened!");
        if(port_name.c_str() != msg->port_name.c_str())         //判断串口名称是否改变,并随之改变
        {
            serial_port.SetPortName(msg->port_name.c_str());    //改变串口名称
            serial_port.Init();                                 //初始化串口
            port_name = msg->port_name.c_str();
        }

        //将串口中接收到的信息传递给serialReceiveMsg
        serialRecieveMsg.id = (u_int8_t)mcu_data.id;//小车id
        serialRecieveMsg.enemy_color = (u_int8_t)mcu_data.color;//小车颜色
        serialRecieveMsg.state = (u_int8_t)mcu_data.state;
        serialRecieveMsg.short_speed = (u_int8_t)mcu_data.shoot_speed;
        serialRecieveMsg.gimbal_pitch = (u_int16_t)mcu_data.gimbal_pitch;
        serialRecieveMsg.gimbal_yaw = (u_int16_t)mcu_data.gimbal_yaw;

    }
    //串口不打开
    else if(msg->use_serial!=1)
    {
        serialopen_flag = 0;
        ROS_INFO("The use_serial is closed!");
        FileStorage fs_read;        //将SerialData.yml中的数据读取出来
        fs_read.open("./config_file/SerialData.yml",FileStorage::READ);
        if(!fs_read.isOpened())
        {
            ROS_INFO("The config_file/SerialData.yml can not be opened!");
            return;
        }
        else
        {
            //将信息赋值给serialReceiveMsg
            fs_read["id"] >> serialRecieveMsg.id;
            fs_read["enemy_color"] >> serialRecieveMsg.enemy_color;
            fs_read["state"] >> serialRecieveMsg.state;
            fs_read["short_speed"] >> serialRecieveMsg.short_speed;
            fs_read["gimbal_yaw"] >> serialRecieveMsg.gimbal_yaw;;
            fs_read["gimbal_pitch"] >> serialRecieveMsg.gimbal_pitch;

        }
            fs_read.release();   
        }

    }





int main(int argc,char **argv){

    setlocale(LC_ALL,"");   //可以打印中文
    ros::init(argc,argv,"serial_node");
    ros::NodeHandle n; 
    ros::Publisher pub_serialRecieveMsg;
    ros::Subscriber sub_detectorParam;
    ros::Subscriber sub_serialSendMsg;

   
    sub_detectorParam=n.subscribe<fyt_msg::DetectorParam>("config_detector",10,IsSerialOpen);
    sub_serialSendMsg=n.subscribe<fyt_msg::SerialSendMsg>("serial_sendmsg",1,doSerialSendMsg);  
    pub_serialRecieveMsg=n.advertise<fyt_msg::SerialRecieveMsg>("serial_recieve",100);
    Protocol protocol(serial_port);
    std::thread recieve(&Protocol::receiveData,&protocol);  //多线程接收串口中的数据,防止串口被堵住

    while(ros::ok())
    {
        pub_serialRecieveMsg.publish(serialRecieveMsg); //发布话题
        ros::spinOnce();    //循环之前看看还有没有需要回调的函数
    }
   
    return 0;
}

由于代码中存在许多函数是自定义的,所以这里也不过多解释,只解释学到的知识。

学习ros中的发布信息和接收信息

接收者模板

#include "ros/ros.h"
#include <sensor_msgs/LaserScan.h>

void cb(const sensor_msgs::LaserScan::ConstPtr &scan)
{
}

int main(int argc, char **argv)
{
  ros::init(argc, argv, "listener");
  ros::NodeHandle n;
  ros::Subscriber sub = n.subscribe("scan", 100, cb);
  ros::spin();
  return 0;
}

发布者模板

#include <ros/ros.h>
int main(int argc, char** argv)
{
	ros::init(argc, argv, "publish_velocity");
	ros::NodeHandle nh;
 
	ros::Publisher pub = nh.advertise <>("", 1000);
	while (ros::ok())
	{
		pub.publish();
		ros::spinOnce();
	}
	return 0;
}

接收并发布

#include <ros/ros.h>
#include <sensor_msgs/LaserScan.h>
#include <sensor_msgs/PointCloud2.h>

class SubsPub {
 public:
  void cb(const sensor_msgs::LaserScan::ConstPtr& scan);
  SubsPub(ros::NodeHandle n) {
    sub_ = n.subscribe("scan", 1, &SubsPub::cb, this);
    pub_ = n.advertise<sensor_msgs::PointCloud2>("cloud", 10);
  }

  ros::Subscriber sub_;
  ros::Publisher pub_;
};

void SubsPub::cb(const sensor_msgs::LaserScan::ConstPtr& scan) {
  sensor_msgs::PointCloud2 msg;
  pub_.publish(msg);
}

int main(int argc, char** argv) {
  ros::init(argc, argv, "sp");
  ros::NodeHandle n;
  SubsPub sp(n);
  ros::spin();
  return 0;
}
//这是采用类的写法,其实也可以直接写

使用Opencv 写入、读取Yaml文件

C++11多线程 std::thread详解

ros::spin()、ros::spinOnce():使用细节、区别

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

ros实现串口通信(记录一次脱发的经历) 的相关文章

  • Windows 10 下安装Linux

    使用Hype V 快速安装 选择的Ubuntu 22 04 LTS 安装一切正常 xff0c 登录提示 登录以后提示connecting to sesman ip 127 0 0 1 port 3350 关闭查看菜单的 增强模式 xff0c
  • mvvm是什么?

    1 总结 一句话总结 xff1a vm层 xff08 视图模型层 xff09 通过接口从后台m层 xff08 model层 xff09 请求数据 xff0c vm层继而和v view层 实现数据的双向绑定 2 mvc和mvvm的关系 xff
  • 汉诺塔问题(C语言实现)

    前言 一 汉诺塔圆盘的移动步数 二 汉诺塔圆盘移动步骤 总结 前言 汉诺塔 xff08 Tower of Hanoi xff09 xff0c 又称河内塔 xff0c 是一个源于印度古老传说的益智玩具 大梵天创造世界的时候做了三根金刚石柱子
  • ubuntu 16.04版本安装docker以及创建docker容器

    一 简介 Docker 是一个开源的应用容器引擎 xff0c 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中 xff0c 然后发布到任何流行的 Linux 机器上 xff0c 也可以实现虚拟化 容器是完全使用沙箱机制 xff0c
  • 字符串操作函数strstr

    目录 一 strstr函数介绍 二 strstr函数的模拟 三 代码实现 一 strstr函数介绍 在编写程序的过程中 xff0c 我们不可避免地会调用字符串操作函数 xff0c 今天要介绍的字符串操作函数是strstr函数 strstr函
  • 【无标题】前端工程师面试题手册-有点长但是很有用

    不是原作者 想想要获取更多前端开发相关学习资料 xff0c 请加微信1124692领取 前端工程师面试题手册 目录 1 前端基础 11 1 1 HTTP HTML 浏览器
  • 超详细的VMware虚拟机安装Linux图文教程保姆级

    目录 一 下载VMware 二 安装VMware 三 下载Linux 四 安装Linux 五 设置本地机与虚拟机之间的数据传输 xff08 复制 粘贴等操作 xff09 一 下载VMware VMware官网有两个版本 xff0c 分别是
  • 仿牛客技术博客项目常见问题及解答(三)

    书接上回 xff1a 仿牛客技术博客项目常见问题及解答 xff08 二 xff09 李孛欢的博客 CSDN博客 13 项目中的kafka是怎么用的 xff1f kafka入门 Apache Kafka是一个分布式流平台 一个分布式的流平台应
  • [Java] 继承 和 多态(学习总结)

    目录 继承 一 继承主要表示概念层上的 is a 的关系 二 什么是继承 三 语法 四 继承方式 xff1a 五 访问权限 六 构造方法 七 父类的属性和方法的访问 八 重载和重写 xff08 前提是子类是有权限的 xff09 九 执行顺序
  • 第七章-X86汇编语言从实模式到保护模式

    第七章 比高斯更快的计算 7 3 显示字符串 39 1 43 2 43 3 43 43 100 61 39 字符串编译阶段 xff0c 编译器将把它们拆开 xff0c 形成一个个单独的字节jump near start跳过没有指令的数据区1
  • 【java】杂七杂八的基础知识

    1 当用javac命令编译Java源程序 xff08 java文件 xff09 时 xff0c 必须写出该源文件的完整文件名 xff0c 包括扩展名 java 2 当用java exe命令运行一个字节码 class 文件时 xff0c 不必
  • 论文笔记 Pruning neural networks without any databy iteratively conserving synaptic flow

    摘要 修剪神经网络的参数可以在训练和测试期间节省时间 内存和能量 最近的研究发现 xff0c 通过一系列昂贵的训练和修剪周期 xff0c 初始化时存在中奖彩票或稀疏可训练的子网络 这就提出一个基本问题 xff1a 我们能否在初始化时识别出高
  • 常见通信协议-原理篇

    目录 前言通信协议分类1 串行与并行通信2 同步与异步通信3 串行通信数据传送方向常见通信方式分类不同分类协议需要额外处理的问题 各通信协议详解一 UART 通用异步收发器 1 接口连接方式2 帧格式波特率 二 IIC 集成电路总线 1 接
  • 树莓派安装ubuntu20.04、图形桌面、ROS笔记

    目录标题 1 安装ubuntu方式1 xff1a 树莓派镜像烧录器方式2 xff1a win32 Disk Imager 烧录软件 2 添加wifi方式一 network config文件方式二 50 cloud init yaml文件 x
  • Git 常用命令

    git 注 xff1a 在使用的任何的 git 命令前 xff0c 都要切换到 git 项目目录下 git init 初始化一个 git 仓库 git status 查看当前 git 仓库的状态 git add file 修改 file 文
  • 字符串查找函数strstr,strtok的详细介绍

    strstr 返回str2在str1中第一次出现的指针 xff0c 如果str2不是str1的一部分 xff0c 则返回空指针str1 xff08 简单来说就是在字符串里找子字符串 xff09 可以看到上图strstr函数找到子串后会把剩余
  • 实现Windows远程连接

    此方法不止局限于局域网内 xff0c 只要被控制端的电脑连接上了互联网 xff0c 那么在任意一个电脑上都可以连接 话不多说直接上干货 xff01 xff01 xff01 配置被控制端电脑 一 开启远程桌面访问功能 不是windwos专业版
  • Jetpack Compose 不止是一个UI框架~

    Jetpack Compose是用于构建原生Android UI的现代工具包 Jetpack Compose使用更少的代码 xff0c 强大的工具和直观的Kotlin API xff0c 简化并加速了Android上的UI开发 这是Andr
  • 父类和子类方法的调用

    由于没有找到想要的解释 xff0c 于是自己就在idea上自测来寻找答案 关于父类 xff0c 子类 xff0c 多态之间方法的调用 package 思考 public class 子类调用 public static void main
  • vector介绍与使用(C++)

    目录 一 vector的介绍 二 vector的使用 2 1构造函数 2 2vector iterator 的使用 2 3vector 空间增长问题 2 4 vector 增删查改 2 5 vector 迭代器失效问题 一 vector的介

随机推荐

  • 网络层——IP协议详细解读

    文章目录 IP协议1 IP协议的报文格式2 IP协议的地址管理3 IP地址的组成4 IP协议的路由选择 IP协议 之前介绍了传输层的重点协议 xff0c TCP和UDP协议 xff0c 以下将介绍网络层的重点协议IP协议 1 IP协议的报文
  • 基于opencv实现追踪物体的功能

    nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp From sztu 自动化专业的小菜鸡 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 本篇将介绍计算机视觉的物体追踪 基于py
  • PX4源码中CMakeLists.txt文件的相关含义

    在px4每个模块中 xff0c 都会引用到CMakeLists txt文件 比如 代码 px4 add module MODULE modules attitude estimator q MAIN attitude estimator q
  • 位置式Pid和增量式Pid的定义及应用

    PID算法是一个典型的闭环控制系统 P I D xff0c 比例 积分 微分 开环 xff1a 输入量对输出量没有反馈作用 xff1b 闭环 xff1a 输入量对输出量有反馈作用 位置式Pid 位置式Pid就是位置闭环控制 xff0c 位置
  • Mysql中的in和find_in_set的区别?

    1 是否使用索引 find in set xff1a 不使用索引 xff0c 是全表扫描in xff1a 使用索引 2 使用方法 在mysql中in的使用情况如下 xff08 in里面放的是常量 xff09 xff1a select fro
  • Docker 常用命令---持续更新中

    Docker xff1a Docker的三大核心概念 xff1a 镜像 容器 仓库 镜像 xff1a 类似虚拟机的镜像 用俗话说就是安装文件 容器 xff1a 类似一个轻量级的沙箱 xff0c 容器是从镜像创建应用运行实例 xff0c 可以
  • ubutu的Realsense摄像头的环境配置的报错解决(个人认为官方文档存在问题)以及官方视频流样例测试(无需摄像头)

    Realsense支持多种语言进行开发 xff0c 因为之前学过python xff0c 所以计划使用Pycharm进行相关的项目开发 xff0c 由于没带摄像头回家 xff0c 所以使用了官方的视频流进行测试 xff0c 以下是 xff3
  • launch文件

    1 launch文件 可以一次性启动多个ROS节点 实现 选定功能包右击 gt 添加 launch 文件夹 选定 launch 文件夹右击 gt 添加 launch 文件 编辑 launch 文件内容 lt launch gt lt nod
  • ROS文件系统相关命令

    1 增 catkin create pkg 自定义包名 依赖包 61 61 61 创建新的ROS功能包 sudo apt install xxx 61 61 61 安装 ROS功能包 2 删 sudo apt purge xxx 61 61
  • ros服务通信

    1 srv 61 请求 43 响应 2 不要重复添加路径 xff0c 会导致头文件寻找不到 客户端 include 34 ros ros h 34 include 34 plumbing server client AddInts h 34
  • ros常用组件

    一 TF坐标变换 transform frame frame id是被参考的坐标系 xff0c child frame id是另一个坐标系 translation代表child frame id相对于frame id的偏移量 rotatio
  • FreeRTOS学习(1)-- FreeRTOS任务创建、调度、任务间通信

    FreeRTOS学习 xff08 1 xff09 FreeRTOS任务创建 调度 任务间通信 文章目录 FreeRTOS学习 xff08 1 xff09 FreeRTOS任务创建 调度 任务间通信前言一 FreeRTOS任务状态二 Free
  • 让你秒读懂阿里云数据库架构与选型

    01 阿里云RDS的架构与规格大图 下图从高可用类型 数据可靠性 资源复用率 规格大小 规格代码等角度 xff0c 较为完整的概况了当前RDS主要的架构与规格 xff1a 从高可用区架构上 xff0c 分为单节点 xff08 基础版 xff
  • ROS teb_local_planner使用

    teb local planner则是2D导航堆栈的base local planner的插件 实现了一个在线优化的本地轨迹规划器 xff0c 用于导航和控制移动机器人 xff0c 作为ROS 导航包的插件 全局规划器生成的初始轨迹在运行时
  • rosdep update 出现time out 连接超时的问题(非常有效)

    问题 xff1a 在安装ros过程中 xff0c 按照官网执行rosdep update的指令大概率会出现如下报错 xff1a ERROR error loading sources list 39 The read operation t
  • 手把手教你写第一个Windows窗口

    第一个Windows窗口 效果展示详细过程设计窗口类注册窗口类创建窗口显示窗口更新窗口消息循环 源代码实用工具图标制作软件图标库 效果展示 第一个Windows窗口 详细过程 设计窗口类 首先 xff0c 自定义窗口类型名和窗口标题 xff
  • 把当前ubuntu16.0.4系统做成镜像<iso>

    Systemback是一个Ubuntu系统中用于发布自定义系统镜像和系统备份的软件 有时候我们对自己的Ubuntu做了很多设置 xff0c 比如各种软件包 xff0c 各种自定义的配置 我们想要在另一台电脑上也安装一个和我们一模一样的系统
  • VS2010开发ribbon风格的程序

    转自 xff1a http blog csdn net akof1314 article details 5268071 创建MFC应用程序项目 实际上 xff0c Ribbon界面 Office 2007风格的界面 的开发早在2008年就
  • win10下载DEVC++5.11

    作为一款免费开源的 C C 43 43 IDE xff0c 内嵌 GCC 编译器 xff08 GCC 编译器的 Windows 移植版 xff09 xff0c 且是 NOI NOIP 等比赛的指定工具 xff0c Dev C 43 43 的
  • ros实现串口通信(记录一次脱发的经历)

    组长发布任务 xff0c 我负责使用ros实现串口通讯 怎么说呢 xff0c 头发可以在地上 桌子上甚至任何地方 xff0c 除了头上 经过询问 xff0c 任务大概分为三个点 xff1a 1 接收话题名为 config detector