1.3 Ubuntu18.04 ROS udp server 通信实现

2023-05-16

Ubuntu18.04 ROS udp Server通信实现

此小节介绍udp Server收发数据。udp通信属于帧传输,在帧传输过程中对于消息的次序和到达情况没有需求,没有进行校验,所以UDP属于不可靠传输,但是由于缺少的校验时间,udp通信在一些环境下(比如无线传输,网络信号较差时)通信效率较高,此通信方式通常用于实时性要求较高的传感器信息回传(比如视频流,语音流的回传)。
下一节介绍Ubuntu18.04/ROS udp client的通信实现,后续介绍Ubuntu18.04 ROS与Android tcp/ip的通信实现,通过Android与工控机配合实现车辆遥控操作。
本小节测试工具有所改变,USR-TCP232-Test-V1.3 udp通信默认为服务器,Ubuntu18.04 编写的服务器无法与它连接,本小节Windows采用TCP&UDP测试工具连接Ubuntu18.04/ROS udp/server服务器。
关于Ubuntu ros下tcp/ip 服务器客户端的简单实现可以参考1.1 1.2

测试过程和效果

测试平台为Ubuntu18.04 与Windows系统上的TCP&UDP测试工具进行通信测试。
1.保证两台电脑在同一个网络下,并查看Ubuntu的本机IP,在设置->wifi->中可查看,如下图,192.168.2.204,为本机IP。
在这里插入图片描述

  1. 相互ping另外一台电脑的ip,通则说明两台电脑在同一网络下连接成功。windows打开网络串口助手可自动获取本机IP,也可以在网络状态->详细信息中查看IP。如下图,如果ping失败请查看防护墙是否关闭。
    在这里插入图片描述
    在这里插入图片描述

3 ping成功之后,进行通信效果测试,首先Ubuntu运行roscore,然后启动服务器节点,启动TCP&UDP测试工具,过程如下:
点击操作->创建连接
在这里插入图片描述
输入服务器IP和端口号,点击创建
输入服务器IP和端口号,点击创建。
点击创建,输入要发送的数据。
在这里插入图片描述

4 本次测试发送的为hello,通信成功的截图如下:
在这里插入图片描述
在这里插入图片描述

ROS工作区间和功能包的创建

ROS工作区间和功能包的创建网上资料比较多,这里简单说明。其中使用RoboWare Studio,这个过程变的更简单。

#创建工作空间
mkdir catkin_ws #区间名称
cd catkin_ws 
mkdir src #创建代码空间
cd src
catkin_init_workspace #初始化位ROS工作空间
cd ..
catkin_make
source ~/catkin_ws/devel/setup.bash
#创建功能包
cd ~/catkin_ws/src
catkin_create_pkg ros_socket std_msgs rospy roscpp
#创建通信节点
#在src目录下打开终端
touch udp_server.cpp
#在CMakeLists.txt中添加以下
add_executable(udp_server
  src/udp_server.cpp
)
add_dependencies(udp_server ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(udp_server
  ${catkin_LIBRARIES}
)

ROS UDP Server的实现代码

包括以下步骤
1.创建一个socket
2.绑定本机IP端口
3.bind()绑定
4.等待客户端的连接,接收客户端数据
程序注释的比较清楚,可以看看。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <syspes.h>
#include <sys/stat.h>
#include <string.h>
#include <arpa/inet.h>
#include <ros/ros.h>
int main(int argc, char** argv)
{
    ros::init(argc, argv, "udp_port");
    //创建句柄(虽然后面没用到这个句柄,但如果不创建,运行时进程会出错)
    ros::NodeHandle n;

    //1  创建socket套接字
    int fd = socket(AF_INET, SOCK_DGRAM, 0);
    if(fd == -1)
    {
        perror("socket error");
        exit(1);
    }
    // fd绑定本地的IP和端口
    struct sockaddr_in serv;
    memset(&serv, 0, sizeof(serv));
    serv.sin_family = AF_INET;
    serv.sin_port = htons(1024);//设置服务器端口号
    serv.sin_addr.s_addr = htonl(INADDR_ANY);//获取本机ip
     //3.bind()绑定
    //参数一:0的返回值(fd)
    //参数二:(struct sockaddr*)&addr 前面结构体,即地址
    //参数三: addr结构体的长度
    int ret = bind(fd, (struct sockaddr*)&serv, sizeof(serv));
    if(ret == -1)
    {
        perror("bind error");
        exit(1);
    }

    struct sockaddr_in client;
    socklen_t cli_len = sizeof(client);
    // 通信
    char buf[1024] = {0}; //创建接收数据的数组

    ros::Rate loop_rate(50);//while以50Hz进行循环

    while(ros::ok()) 
    {
        int recvlen = recvfrom(fd, buf, sizeof(buf), 0, 
                               (struct sockaddr*)&client, &cli_len);//接收数据保存到buf,并返回数据长度。
        if(recvlen == -1)
        {
            perror("recvform error");
            exit(1);
        }
        printf("received data: %s\n", buf);
        char ip[64] = {0};
        printf(" Client IP: %s, Port: %d\n",
        inet_ntop(AF_INET, &client.sin_addr.s_addr, ip, sizeof(ip)),
        ntohs(client.sin_port));

        // 给客户端发送数据
        sendto(fd, buf, strlen(buf)+1, 0, (struct sockaddr*)&client, sizeof(client));

         ros::spinOnce(); 
        loop_rate.sleep(); 
    }
    close(fd);
    return 0;
}



功能包程序。
欢迎大家批评指正!!!

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

1.3 Ubuntu18.04 ROS udp server 通信实现 的相关文章

  • 用于发送字符串数据的简单 rpyc 客户端和服务器

    我正在使用 rpyc 在 python 中编写一个程序 我的目标是创建一个简单的服务器 它接受来自客户端的数据字节 字符串 我对 python 和 rpyc 都很陌生 这是我的 server py 代码 from rpyc utils se
  • 如何从里程计/tf数据获取投影矩阵?

    我想将视觉里程计的结果与 KITTI 数据集提供的事实进行比较 对于地面中的每一帧 我都有一个投影矩阵 例如 1 000000e 00 9 043683e 12 2 326809e 11 1 110223e 16 9 043683e 12
  • 为什么UDP服务器上的UDP客户端端口会改变

    我一直在关注一个简 单的 UDP 服务器 客户端教程 发现here http www binarytides com udp socket programming in winsock 我有一个关于客户端连接到服务器的端口的快速问题 仅从代
  • DatagramChannel.close() 在 Windows 上保持端口打开

    我正在实施一个发现流程 打开 UDP 套接字以侦听给定端口上的广播响应 发送一些请求 并期待稍后的响应 在给定时间段后关闭 UDP 套接字 第一次通话有效 但其他调用会出现绑定错误 地址已被使用 绑定 我运行的是Windows 7 我做了一
  • 更改Windows下的默认套接字缓冲区大小[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我无法更改的应用程序正在丢弃一些传入的 UDP 数据包 我怀疑接收缓冲区溢出 是否有注册表设置可以使默认缓冲区大于 8KB From th
  • HTTP 是否使用 UDP?

    这可能是一个愚蠢的问题 HTTP 是否使用过用户数据报协议 例如 如果使用 HTTP 传输 MP3 或视频 它内部是否使用 UDP 进行传输 From RFC 2616 http www ietf org rfc rfc2616 txt 通
  • 当网络上的所有计算机都具有相同的公共IP地址时,如何向特定计算机发送UDP数据包? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 这就是问题 它非常简单 理解 我家里有 2 台电脑 它们都有相同的公共 IP 地址 例如 1 2 3 4 我在咖啡馆有一台计算机 不同的网络 因此它具
  • Java UDP 服务器,并发客户端

    下面的代码足以接受并发 UDP 传输吗 更具体地说 如果 2 个客户端同时传输 当我调用 receive 时 DatagramSocket 会将传输排队并一一传送它们 还是只有一个能够通过 DatagramSocket socket new
  • Electron 构建应用程序无法启动 Express 服务器

    我正在构建一个应用程序 当我处于开发人员模式时一切正常 每件事都按其应有的方式运作 但是 当我使用电子构建器打包我的应用程序时 应用程序会打开 但它不会启动快速服务器 并且应用程序无法正常工作 这是我的 package json 代码 na
  • 我刚刚在哪个适配器上收到此 UDP 数据包?

    我正在尝试用 C 编写一个 BOOTP 服务器 我正在接收并解析来自客户端的 BOOTP 数据包 我需要回复我的服务器 IP 地址 问题是 计算机可以有多个网络适配器 客户端还没有 IP 地址 有什么方法可以查出 UDP 数据包是在哪个适配
  • nginx 服务器中不允许方法 405 错误

    我们的反应应用程序在我们的本地机器上正常工作 但我们将其延迟到更高的环境中 它不起作用 它发送405 Method not allowed error 页面正在加载 每当我们要求时submit form这个问题来了 下面是我的nginx c
  • C++ UDP Socket端口复用

    如何在 C 中创建客户端 UDP 套接字 以便它可以侦听另一个应用程序正在侦听的端口 换句话说 如何在 C 中应用端口复用 我只想监听一个端口 您可以使用嗅探器来做到这一点 只需忽略来自不同端口的数据包即可 我可能需要阻止它发送一些特定的数
  • 在 Perl 中如何接受多个 TCP 连接?

    我对 Linux 的 Perl 脚本有疑问 它的主要目的是成为 3 个应用程序之间的中间人 它应该做什么 它应该能够等待 UDP 文本 不带空格 udp port 当它收到 UDP 文本时 它应该将其转发到连接的 TCP 客户端 问题是我的
  • 为什么我们可以将 sockaddr 转换为 sockaddr_in

    我明白为什么强制转换很有用sockaddr to sockaddr in 但我不明白这怎么可能 据我所知 它们的大小相同sockaddr in添加了sin zero使其大小相同 我想知道编译器如何知道从哪里获取信息sockaddr in如果
  • 接收UDP数据包

    假设我的程序通过网络 UDP 发送 1000 字节 它是否保证接收方将 一批 接收 1000 个字节 或者他可能需要执行多次 读取 直到收到完整的消息 如果后者为真 我如何确保同一消息的数据包顺序不会 混淆 按顺序 或者协议可能保证这一点
  • 您可以bind()和connect() UDP连接的两端吗

    我正在编写一个点对点消息队列系统 它必须能够通过 UDP 运行 我可以任意选择一侧或另一侧作为 服务器 但这似乎不太正确 因为两端都从另一端发送和接收相同类型的数据 是否可以绑定 和连接 两端 以便它们只能彼此发送 接收 这似乎是一种非常对
  • 提高UDP可靠性

    我正在构建一个基于 UDP 的小型服务器 服务器基于 Net并使用它自己的Socket类 我通过 ReceiveMessageFromAsync 和异步发送使用完成端口 我的问题是我失去了大约 5 10 的流量 现在我明白这是正常的 但是有
  • 当 URL 可在浏览器中访问时,SSH Curl 不起作用

    This post is linked with another post of mine still unsolved Laravel 作曲家更新 连接被拒绝 https stackoverflow com questions 52404
  • UDP 广播发送失败:在 Linux 2.6.30 上“网络无法访问”

    我用udp广播写了一个程序 代码段如下 struct sockaddr in broadcast addr socklen t sock len sizeof broadcast addr bzero broadcast addr sock
  • 套接字:监听积压并接受

    listen sock backlog 在我看来 参数backlog限制连接数量 这是我的测试代码 server initialize the sockaddr of server server sin family AF INET ser

随机推荐

  • c++ 编译 报错 未定义的引用

    遇到的问题有两种情况 一个是static没初始化 一个是模板类实现和定义分开写 这里主要记录一下模板类实现和定义分开写报错的问题 xff08 都放在 h文件中就不会报错 xff09 自己尝试用 传统 方法 xff0c 及在 h文件里声明 在
  • JNI基础语法

    一 Java和JNI类型对照 1 1 基本类型对照表 Java类型Native类型C C 43 43 类型大小Booleanjbooleanunsigned char无符号8位Bytejbytechar有符号8位Charjcharunsig
  • STL源码剖析 笔记之三 迭代器

    第三章 迭代器概念与traits编程技法 Design Patterns 中提供有23个设计模式的完整描述 迭代器模式定义如下 xff0c 提供一种方法 xff0c 使之能够依序巡防某个聚合物 容器 所含的各个元素 xff0c 而又无需暴露
  • 带复杂命令启停功能的二自由度自动进样器

    给8051发送 34 Start E 34 后 系统开始工作 发送 34 Stop E 34 后 系统停止工作 与之前以串口中断为主线的控制逻辑不同 这里以定时器0中断为主线 其实也就是以系统序列动作为主线 并提高了串口中断的优先级 以实时
  • Python温度转换实例

    我的第一个程序 xff1a TempCovert py TemStr 61 input 34 请输入带有符号的温度值 xff1a 34 if TemStr 1 in 39 F 39 39 f 39 C 61 eval TemStr 0 1
  • 不同数据类型所占字节

    一 32位处理器 xff1a char xff1a 1个字节 char p xff1a 4个字节 int xff1a 4个字节 unsigned int xff1a 4个字节 double xff1a 8个字节 short xff1a 2个
  • 浏览器中输入www.baidu.com后发生了什么

    一道经典的面试题 xff1a 你输入网址后到页面显示出来 xff0c 中间发生了什么 xff1f 第一步 浏览器查找该域名的 IP 地址 第二步 浏览器根据解析得到的IP地址向 web 服务器发送一个 HTTP 请求 第三步 服务器收到请求
  • 交换机对数据帧的处理规则

    一 概述 以太网交换机对二层帧的转发处理比较复杂 xff0c 很多同事都不是很清楚 本文将对此问题进行总结 xff0c 并通过实验进行验证 二 交换机基本概念 在了解交换机转发规则之前 xff0c 我们先理解交换机的一些概念 xff0c 如
  • NAT详解

    NAT详解 1 概述 1 1 nat简介 NAT xff08 Network Address Translation xff0c 网络地址转换 xff09 是1994年提出的 它是一个IETF Internet Engineering Ta
  • FTP服务

    1 FTP简介 FTP是File Transfer Protocol xff08 文件传输协议 xff09 的英文简称 xff0c 而中文简称为 文传协议 用于Internet上的控制文件的双向传输 同时 xff0c 它也是一个应用程序 x
  • 从Linux服务器下载文件夹到本地

    1 使用scp命令 把本地的source txt文件拷贝到192 168 0 10机器上的 home work目录下 scp home work source txt root 64 192 168 0 10 home work 把192
  • 安卓开发——网络传输工具类HttpUtil(基于okhttp3)使用

    AndroStudio开发 xff1a 使用时需先导入okhttp3依赖 xff1a com squareup okhttp3 okhttp 3 4 1 依赖导入步骤 xff1a File ProjectStructure Dependen
  • 无人系统传感器导航

    文章目录 GPS 全球定位系统 Global positioning system RTK Real time kinematic 距离传感器超声波传感器激光测距传感器毫米波雷达 Lidar Light detection and rang
  • 深度相机选取建议:

    2020 9 4更新 xff1a 现在再回头来看TOF应该会是未来 xff0c 限制TOF发展的硬件问题正在慢慢解决 苹果的ipad上也加上了TOF xff08 用于AR xff09 xff0c ipone12上估计也会有 可能小米的mix
  • JavaHTTP请求工具类HTTPUtils

    HTTP 请求工具类 HTTPUtils xff0c 其中涉及 HTTP 请求相关的各种操作 xff0c 关于这些方法详细的介绍可以查看这些博客 x1f4ac 相关 博客文章 Java发起HTTP请求并解析JSON返回数据 https bl
  • YOLOV7语义分割(日后自用笔记)

    系统win10 本文只是根据readme文件走流程 xff0c 记录一些常用公式 RizwanMunawar yolov7 segmentation at 87b016cda50371d6e2824378d641c2d4417ea1c3 g
  • char型和int型之间的类型转换

    char转换为int型数据 通过赋值方式将char类型变量转换为int型变量 xff0c 变量值为char类型变量的ASCII码值 例如 xff1a int a 61 0 那么打印a的结果为48 xff0c 如果想要得到正确的数字 xff0
  • ROS出现Cannot find source file的错误和add_dependencies,add_executable,target_link_libraries三者先后顺序不对所造成的错误。

    出现上面这个报错 xff0c 往往是 CMakeLists txt中的问题 add executable server tutorial ws src dynamic tutorials src server cpp 这行代码的问题 xff
  • 利用python ast包,绘制python代码的调用关系图(可分析互相调用的多个py文件)

    我的目的是辅助代码阅读 xff08 也方便写文档 xff09 xff0c 因此不需要太详细的信息 xff0c 只需要看用户定义的函数的函数调用关系 文章目录 1 开源项目staticfg的安装和直接使用2 绘制python的简单调用关系图
  • 1.3 Ubuntu18.04 ROS udp server 通信实现

    Ubuntu18 04 ROS udp Server通信实现 此小节介绍udp Server收发数据 udp通信属于帧传输 xff0c 在帧传输过程中对于消息的次序和到达情况没有需求 xff0c 没有进行校验 xff0c 所以UDP属于不可