rosserial修改socket默认缓冲区大小

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的共享指针是为了多线程的需要,不必照抄。

 

参考资料:http://wiki.ros.org/rosserial/#Maximum_Size_of_a_Message.2C_Maximum_Number_of_Publishers.2FSubscribers

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值