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。
- 相互ping另外一台电脑的ip,通则说明两台电脑在同一网络下连接成功。windows打开网络串口助手可自动获取本机IP,也可以在网络状态->详细信息中查看IP。如下图,如果ping失败请查看防护墙是否关闭。
3 ping成功之后,进行通信效果测试,首先Ubuntu运行roscore,然后启动服务器节点,启动TCP&UDP测试工具,过程如下:
点击操作->创建连接
输入服务器IP和端口号,点击创建
点击创建,输入要发送的数据。
4 本次测试发送的为hello,通信成功的截图如下:
ROS工作区间和功能包的创建
ROS工作区间和功能包的创建网上资料比较多,这里简单说明。其中使用RoboWare Studio,这个过程变的更简单。
mkdir catkin_ws
cd catkin_ws
mkdir src
cd src
catkin_init_workspace
cd ..
catkin_make
source ~/catkin_ws/devel/setup.bash
cd ~/catkin_ws/src
catkin_create_pkg ros_socket std_msgs rospy roscpp
touch udp_server.cpp
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;
int fd = socket(AF_INET, SOCK_DGRAM, 0);
if(fd == -1)
{
perror("socket error");
exit(1);
}
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);
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(ros::ok())
{
int recvlen = recvfrom(fd, buf, sizeof(buf), 0,
(struct sockaddr*)&client, &cli_len);
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(使用前将#替换为@)