rosserial除了串口,usb通信外,也可以用socket来连接服务器,具体用法请百度。
环境:server端:ubuntu 18.04 LTS +ros melodic
client端:win10 +VS2017
我的程序里直接订阅了地图主题,可是客户端怎么也收不到,折腾了一两天,也不知道怎么回事儿。
代码简略如下:
初始化:
nh = std::make_shared<ros::NodeHandle_<WindowsSocket>>();
//Connect;
char *ros_master = (char *)MASTER_IP.c_str();
printf("Connecting to server at %s\n", ros_master);
nh->initNode(ros_master);
mapSub = std::make_shared<ros::Subscriber<nav_msgs::OccupancyGrid, RoboClient>>("map", &RoboClient::MapCallback, this);
nh->subscribe(*(mapSub.get()));
回调
头文件里: void MapCallback(const nav_msgs::OccupancyGrid & map);
实现:
void RoboClient::MapCallback(const nav_msgs::OccupancyGrid & map)
{
printf("Entered MapCallback datalength:%d \n",map.data_length);
}
今天用抓包工具看了一下,数据确实发到客户端了:
又去官网仔细看了看文档,原来缓冲区大小是有限制的,默认最大512字节,我发送的地图最小15k,怪不得客户端没反应。
根据官网,找到代码node_handle.h的98行起的定义:
/* Node Handle */
template<class Hardware,
int MAX_SUBSCRIBERS = 25,
int MAX_PUBLISHERS = 25,
int INPUT_SIZE = 512,
int OUTPUT_SIZE = 512>
class NodeHandle_ : public NodeHandleBase_
修改input_size为51200(或者在初始化NodeHandle_的时候,加上这些参数。这个比较好,不要改代码,我是为了验证结果图省事儿),重新运行,客户端顺利接受地图。
但是不打算这么用了,计划另外写一个节点实现socket专门收发地图。
后记:我代码里的nh的共享指针是为了多线程的需要,不必照抄。