当前位置: 首页 > news >正文

本地TCP通讯(C++)

概要

利用TCP技术,实现本地ROS1和ROS2的通讯。

服务端代码

头文件

#include <ros/ros.h>
#include "std_msgs/String.h"
#include "std_msgs/Bool.h"
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include "geometry_msgs/Twist.h"using namespace std;class TCPPublisher
{public:TCPPublisher();~TCPPublisher();void cmdVelCallback(const geometry_msgs::Twist::ConstPtr& msg);private:ros::NodeHandle n, nPrivate;ros::Publisher tcpPub;ros::Subscriber cmdVelSub;// 创建服务器套接字int serverSocket;// 设置服务器地址结构sockaddr_in serverAddr;int clientSocket;std::string topicStatus;
};

源代码

#include "./tcp_pub/tcp_pub.h"TCPPublisher::TCPPublisher():nPrivate("~")
{nPrivate.param("topicStatus", topicStatus, std::string("/cmd_vel"));/*订阅话题*/cmdVelSub = n.subscribe(topicStatus.c_str(), 10, &TCPPublisher::cmdVelCallback, this);serverSocket = socket(AF_INET, SOCK_STREAM, 0);// 设置服务器地址结构sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = INADDR_ANY;serverAddr.sin_port = htons(8080); // 服务器监听的端口号// 绑定套接字if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1) {std::cerr << "Bind failed." << std::endl;close(serverSocket);return;}// 监听连接if (listen(serverSocket, SOMAXCONN) == -1) {std::cerr << "Listen failed." << std::endl;close(serverSocket);return;}std::cout << "Server is listening for incoming connections..." << std::endl;ROS_INFO("TCPPublisher init successfully!!!");
}TCPPublisher::~TCPPublisher()
{close(serverSocket);
}void TCPPublisher::cmdVelCallback(const geometry_msgs::Twist::ConstPtr& msg)
{float velX = msg->linear.x;float angularZ = msg->angular.z;// ROS_INFO("velX : %f, angularZ : %f", velX, angularZ);// 定义字符数组,用于存储转换后的结果char buffer[50]; // 适当调整数组大小以适应你的需求snprintf(buffer, sizeof(buffer), "%f,%f", velX, angularZ);// ROS_INFO("buffer %s", buffer);// 接受连接int clientSocket = accept(serverSocket, NULL, NULL);if (clientSocket == -1) {std::cerr << "Accept failed." << std::endl;close(serverSocket);return;}std::cout << "Connection established with a client." << std::endl;// 发送消息给客户端const char* message = buffer;ROS_INFO("message %s", message);if (send(clientSocket, message, strlen(message), 0) == -1) {std::cerr << "Error sending message." << std::endl;}// 关闭客户端套接字close(clientSocket);
}int main(int argc, char **argv) {//创建节点ros::init(argc, argv, "pure_pursuit");TCPPublisher tp;  ros::spin();return 0;
}

客户端代码

#include <rclcpp/rclcpp.hpp>
#include <geometry_msgs/msg/twist.hpp>
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>int main(int argc, char * argv[]) {rclcpp::init(argc, argv);auto node = std::make_shared<rclcpp::Node>("tcp_client");/*define publisher*/rclcpp::Publisher<geometry_msgs::msg::Twist>::SharedPtr cmd_pub_;// Advertise velocity commandsauto default_qos = rclcpp::QoS(rclcpp::SystemDefaultsQoS());cmd_pub_ = node->create_publisher<geometry_msgs::msg::Twist>("cmd_vel", default_qos);//连接到服务器// if (connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1) {//     std::cerr << "Connection failed." << std::endl;//     close(clientSocket);//     return 1;// }// std::cout << "Connected to the server." << std::endl;while (true) {// 创建客户端套接字int clientSocket = socket(AF_INET, SOCK_STREAM, 0);if (clientSocket == -1) {std::cerr << "Failed to create client socket." << std::endl;return 1;}// 设置服务器地址结构sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); // 本地回环地址 // 服务器的 IP 地址serverAddr.sin_port = htons(8080); // 服务器监听的端口号// 连接到服务器if (connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1) {std::cerr << "Connection failed." << std::endl;close(clientSocket);// return 1;}// std::cout << "Connected to the server." << std::endl;// 接收消息char buffer[50];memset(buffer, 0, sizeof(buffer));if (recv(clientSocket, buffer, sizeof(buffer), 0) == -1) {std::cerr << "Error receiving message." << std::endl;} else {std::cout << "Received message from server: " << buffer << std::endl;// 定义两个变量来存储解析后的浮点数float floatValue1, floatValue2;// 使用 sscanf 解析字符数组if (std::sscanf(buffer, "%f,%f", &floatValue1, &floatValue2) == 2) {// 打印解析结果std::cout << "解析后的浮点数1: " << floatValue1 << std::endl;std::cout << "解析后的浮点数2: " << floatValue2 << std::endl;} else {// 解析失败std::cerr << "解析失败" << std::endl;}geometry_msgs::msg::Twist cmd_msg;cmd_msg.linear.x = floatValue1;cmd_msg.angular.z = floatValue2;cmd_pub_->publish(cmd_msg);std::cout << "Publishing zero speed to /cmd_vel. " << std::endl;}// 关闭客户端套接字close(clientSocket);// 在这里可以添加一些延时,以避免过于频繁地连接服务器sleep(0.1);}rclcpp::spin(node);rclcpp::shutdown();return 0;
}

相关文章:

本地TCP通讯(C++)

概要 利用TCP技术&#xff0c;实现本地ROS1和ROS2的通讯。 服务端代码 头文件 #include <ros/ros.h> #include "std_msgs/String.h" #include "std_msgs/Bool.h" #include <iostream> #include <cstring> #include <unistd.h>…...

docker 安装jenkins

使用 Docker 安装 Jenkins 是一种快速、方便的方法&#xff0c;可以避免本地环境的复杂依赖。以下是通过 Docker 安装 Jenkins 的基本步骤&#xff1a; 安装 Docker&#xff1a; 如果你的系统尚未安装 Docker&#xff0c;请先安装 Docker。对于 Ubuntu 系统&#xff0c;可以通过…...

电脑黑屏什么都不显示怎么办 电脑开机黑屏不显示任何东西的4种解决办法

相信有很多网友都有经历电脑开机黑屏不显示任何东西&#xff0c;找了很多方法都没处理好&#xff0c;其实关于这个的问题&#xff0c;首先还是要了解清楚开机黑屏的原因&#xff0c;才能够对症下药&#xff0c;下面大家可以跟小编一起来看看怎么解决吧 电脑开机黑屏不显示任何…...

MT8781核心板_MTK8781安卓核心板规格参数

MT8781安卓核心板以其强大的性能和高效的能耐备受瞩目。其八核CPU架构包括(2x Cortex-A76 2.2GHz 6x Cortex-A55 2.0GHz)&#xff0c;以及高性能的Arm Mali G57级GPU。同时&#xff0c;配备高达2,133MHz的LPDDR4X内存和快速的UFS 2.2级存储&#xff0c;大大加速了数据访问速…...

HTML知识点

HTML 【一】HTML简介 【1】什么是HTML HTML是一种用于创建网页结构和内容的超文本标记语言&#xff0c;它是构建网页的基础。为了让浏览器正确渲染页面&#xff0c;我们必须遵循HTML的语法规则。浏览器在解析网页时会将HTML代码转换为可视化的页面&#xff0c;所以我们在浏览…...

聊聊分库分表

文章导读 背景介绍 随着互联网技术的发展&#xff0c;数据量呈爆炸性增长。大数据量的业务场景中&#xff0c;数据库成为系统性能瓶颈的一个主要因素。当单个数据库包含了太多数据或过高的访问量时&#xff0c;会出现查询缓慢、响应时间长等问题&#xff0c;严重影响用户体验。…...

小米标准模组+MCU 快速上手开发(二)——之模组串口调试

小米标准模组MCU 开发笔记之固件调试 背景技术名词简介● 小米IoT开发者平台● 小米IoT 模组● 固件● OTA● CRC32 固件双串口调试● MHCWB6S-IB 模组资料下载● MHCWB6S-IB 模组管脚图● 上电调试 背景 小米标准模组MCU的开发过程中&#xff0c;由于部分官方资料较为古早&am…...

Ubuntu22.04和Windows10双系统安装

概要 本篇演示Ubuntu22.04和Windows10双系统的安装。先安装Ubuntu22.04&#xff0c;再安装Windows10。 一、说明 1、电脑 笔者的电脑品牌是acer(宏碁/宏基) 电脑开机按F2进入BIOS 电脑开机按F12进入Boot Manager 2、U盘启动盘 需要用到两个U盘启动盘 &#xff08;1&a…...

重新安装VSCode后,按住Ctrl(or Command) 点击鼠标左键不跳转问题

重新安装VSCode后&#xff0c;按住Ctrl&#xff08;or Command&#xff09; 点击鼠标左键不跳转问题 原因&#xff1a;重新安装一般是因为相应编程语言的插件被删除了或还没有下载。 本次是由于Python相关的插件被删除了&#xff0c;因此导致Python无法跳转。 解决办法 在vs…...

QPaint绘制自定义仪表盘组件01

网上抄别人的&#xff0c;只是放这里自己看一下&#xff0c;看完就删掉 ui Dashboard.pro QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomm…...

华为笔记本原厂系统镜像恢复安装教程方法

1.安装方法有两种&#xff0c;一种是用PE安装&#xff0c;一种是华为工厂包安装&#xff08;安装完成自带F10智能还原&#xff09; 若没有原装系统文件&#xff0c;请在这里远程恢复安装&#xff1a;https://pan.baidu.com/s/166gtt2okmMmuPUL1Fo3Gpg?pwdm64f 提取码:m64f …...

互联网高科技公司领导AI工业化,MatrixGo加速人工智能落地

作者&#xff1a;吴宁川 AI&#xff08;人工智能&#xff09;工业化与AI工程化正在引领人工智能的大趋势。AI工程化主要从企业CIO角度&#xff0c;着眼于在企业生产环境中规模化落地AI应用的工程化举措&#xff1b;而AI工业化则从AI供应商的角度&#xff0c;着眼于以规模化方式…...

Apache服务

目录 引言 一、常见的http服务程序 &#xff08;一&#xff09;lls &#xff08;二&#xff09;nginx &#xff08;三&#xff09;Apache &#xff08;四&#xff09;Tomcat 二、Apache特点 三、Apache服务的安装 &#xff08;一&#xff09;yum安装及配置文件 1.配置…...

【Spring连载】使用Spring Data访问 MongoDB(二)----Template API

【Spring连载】使用Spring Data访问 MongoDB&#xff08;二&#xff09;----Template API 一、方便的方法二、执行回调函数Execute Callbacks三、Fluent API四、异常转换五、域类型映射六、配置6.1 默认读取首选项Read Preference6.2 WriteResultChecking策略6.3 默认写安全Wri…...

手写table表格(一表头多数据)

手写table表格&#xff08;一表头多数据&#xff09; <template><div class"table-info"><div class"info-list"><div class"header-wrapper"><div class"columns-title" v-for"(i, k) in columns&q…...

python3 flask 实现对config.yaml文件的内容的增删改查,并重启服务

config.yaml配置文件内容 功能就是userpass下的用户名和密码做增删改查&#xff0c;并重启hy2服务 auth:type: userpassuserpass:csdn: csdnlisten: :443 masquerade:proxy:rewriteHost: trueurl: https://www.bing.com/type: proxy tls:cert: /root/hyst*****马赛克******er…...

ADO世界之“对象”

目录 一、Command 对象 1.Command 对象 2.语法 3.属性 4.方法 5.集合 二、Connection 对象 1.Connection 对象 2.语法 3.属性 4.方法 5.事件 6.集合 三、Error 对象 1.Error 对象 2.语法 3.属性 四、Parameter 对象 1.Field 对象 2.语法 3.属性 4.方法 …...

LeetCode59-螺旋矩阵II

参考链接&#xff1a;代码随想录->螺旋矩阵II 关键是学视频链接里面的编码思想&#xff0c;然后背下来 class Solution { public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> resvector(n,vector<int>(n,0));int sx0,s…...

MySQL 索引原理以及 SQL 优化

索引 索引&#xff1a;一种有序的存储结构&#xff0c;按照单个或者多个列的值进行排序。索引的目的&#xff1a;提升搜索效率。索引分类&#xff1a; 数据结构 B 树索引&#xff08;映射的是磁盘数据&#xff09;hash 索引&#xff08;快速锁定内存数据&#xff09;全文索引 …...

C++学习Day08之函数模板和普通函数的区别以及调用规则

目录 一、程序及输出1.1 区别1.1.1 自动类型推导&#xff0c;不可以发生隐式类型转换的1.1.2 普通函数 可以发生隐式类型转换 1.2 调用规则 二、分析与总结 一、程序及输出 1.1 区别 1.1.1 自动类型推导&#xff0c;不可以发生隐式类型转换的 1.1.2 普通函数 可以发生隐式类型…...

DeepSeek-Coder-V2-Lite-Instruct评估指标详解:代码准确率、效率与创新性

DeepSeek-Coder-V2-Lite-Instruct评估指标详解&#xff1a;代码准确率、效率与创新性 【免费下载链接】DeepSeek-Coder-V2-Lite-Instruct 开源代码智能利器——DeepSeek-Coder-V2&#xff0c;性能比肩GPT4-Turbo&#xff0c;全面支持338种编程语言&#xff0c;128K超长上下文&a…...

ESLint代码规范(二)

通过配置文件来忽略对指定文件的代码检查ESLint低于7.0.0.eslintignore/config src/utils/**.prettierignore&#xff08;避免代码被 Prettier 的通用规则修改&#xff09;.eslintcache *.lock yarn-error.log src/utils/**ESLint大于7.0.0.eslintrc.js"ignorePatterns&qu…...

intv_ai_mk11效果展示:中文古诗英译+文化注释+押韵风格选择(Shakespearean/Modern)

intv_ai_mk11效果展示&#xff1a;中文古诗英译文化注释押韵风格选择&#xff08;Shakespearean/Modern&#xff09; 1. 惊艳的中英古诗翻译能力 intv_ai_mk11在中文古诗翻译领域展现出令人惊叹的能力&#xff0c;不仅能准确传达原诗的意境&#xff0c;还能根据需求选择不同的…...

RIFE智能帧插值技术全解析:从原理到实战的视频流畅度提升指南

RIFE智能帧插值技术全解析&#xff1a;从原理到实战的视频流畅度提升指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/v…...

幻兽帕鲁存档迁移完全手册:告别数据丢失的终极解决方案

幻兽帕鲁存档迁移完全手册&#xff1a;告别数据丢失的终极解决方案 【免费下载链接】palworld-host-save-fix 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-host-save-fix 你是否曾在更换幻兽帕鲁服务器时&#xff0c;眼睁睁看着自己辛苦培养的角色数据消失无…...

Windows 11硬件限制突破与系统升级完全指南

Windows 11硬件限制突破与系统升级完全指南 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat 当你的电脑因TPM 2.0或CPU世…...

3个步骤突破微信小程序渲染瓶颈:pixi-miniprogram的WebGL性能革新实践

3个步骤突破微信小程序渲染瓶颈&#xff1a;pixi-miniprogram的WebGL性能革新实践 【免费下载链接】pixi-miniprogram 一个可运行于微信小程序的PIXI引擎&#xff0c;通过模拟window环境&#xff0c;有些功能小程序无法模拟&#xff0c;就直接修改了PIXI引擎代码&#xff0c;最…...

3分钟净化微信社交圈:WechatRealFriends让200+好友检测效率提升99%的秘密

3分钟净化微信社交圈&#xff1a;WechatRealFriends让200好友检测效率提升99%的秘密 【免费下载链接】WechatRealFriends 微信好友关系一键检测&#xff0c;基于微信ipad协议&#xff0c;看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/Wech…...

磁盘 I/O 性能优化

磁盘 I/O 性能优化是一个从硬件、系统内核、文件系统、应用程序到I/O 模式的全链路优化过程&#xff0c;核心目标是减少磁盘访问次数、降低延迟、提升吞吐量与 IOPS。硬件层面 1. 存储介质升级HDD → SATA SSD → NVMe SSD&#xff1a;随机读写性能提升 10–100 倍&#xff0c;…...

终极指南:gh_mirrors/log/log构建流程解析:从CoffeeScript到Grunt自动化

终极指南&#xff1a;gh_mirrors/log/log构建流程解析&#xff1a;从CoffeeScript到Grunt自动化 【免费下载链接】log Console.log with style. 项目地址: https://gitcode.com/gh_mirrors/log/log 如何快速构建优雅的控制台日志工具&#xff1f;gh_mirrors/log/log项目…...