ROSBridge - ROS系统与非ROS外部系统的通信的C++客户端实现

本文介绍如何使用C++实现ROSBridge客户端,并通过Websockets与ROS系统进行通信。内容涵盖不同数据类型如字符串、Twist消息和服务的发布与订阅,以及具体的实现代码示例。

小结

ROSBridge可以实现ROS系统与非ROS外部系统的通信,文档比较多比较杂,在Windows客户端的实现大多是Java, Python, JS等,这里对C++客户端使用Websockets通信进行了测试,C++ ROSBridge的客户端有轻量级,解耦合的优点。

回顾

rosserial

参考使用rosserial实现ROS与Windows的service服务通信,使用rosserial也是可以实现ROS系统与非ROS外部系统的通信。

ROSBridge

有关ROSBridge的官方文档可以参见: ROS Wiki - rosbridge_suite

ROSBridge Client的C++实现

用C++实现ROSBridge的客户端主要有两个Github,
1,Github: Sanic/rosbridge2cpp 这个实现不支持Websockets,所以没有进行测试。
2,本文主要参考了Github-C++ Rosbridge client uses Websockets and Rapidjson: ppianpak/rosbridgecpp
Rapidjson主要参考Rapidjson Tutorial

另外也借鉴了Rosbridge的JS客户端的实现:RobotWebTools/roslibjs/examples/simple.html

具体使用的ROSBridge的数据协议详情可以参考:Github: RobotWebTools/rosbridge_suite: rosbridge v2.0 Protocol Specification

ROSBridge Client的其它实现

Github: C# rosbridge-csharp-connection
ROSBridgeClient in Java
Github: ROSBridgeTestclient in Python

实现及测试

启动服务器端测试环境

参考ROS的roslibjs基本功能使用测试:

#启动roscore
roscore
#在/listener这个topic中发布一个"Hello, World"消息
rostopic pub /listener std_msgs/String "Hello, World"
#监听/cmd_vel的消息
rostopic echo /cmd_vel
#启动add_two_ints_server服务
rosrun rospy_tutorials add_two_ints_server
#启动rosbridge_server 
roslaunch rosbridge_server rosbridge_websocket.launch

初始化ROSBridge客户端

RosbridgeWsClient rbc("192.168.238.129:9090");

这里192.168.238.129是服务器地址,端口9090。

ROSBridge测试/listener的topic

发布/listener的topic并订阅/listener的topic:

  rbc.addClient("topic_advertiser");
  rbc.advertise("topic_advertiser", "/listener", "std_msgs/String");
  rbc.addClient("topic_subscriber");
  rbc.subscribe("topic_subscriber", "/listener", subscriberCallback);

subscriberCallback()如下:

void subscriberCallback(std::shared_ptr<WsClient::Connection> /*connection*/, std::shared_ptr<WsClient::InMessage> in_message)
{
   
   
  std::cout << "subscriberCallback(): Message Received: " << in_message->string() << std::endl;
}

先前服务器已经发布了rostopic pub /listener std_msgs/String "Hello, World",客户端会有以下输出:

topic_subscriber: Sending message: {
   
   "op":"subscribe", "topic":"/listener"}
subscriberCallback(): Message Received: {
   
   "op": "publish", "topic": "/listener", "msg": {
   
   "data": "Hello, World"}}

也可以通过ROSBridge C++客户端的代码进行发布:

void publisherThread(RosbridgeWsClient& rbc, const std::future<void>& futureObj)
{
   
   
  rbc.addClient("topic_publisher");

  rapidjson::Document d;
  d.SetObject();
  d.AddMember("data", "Test message from John /listener", d.GetAllocator());

  while (futureObj.wait_for(std::chrono::milliseconds(1)) == std::future_status::timeout)
  {
   
   
    rbc.publish("/listener", d);
    std::this_thread::sleep_for(std::chrono::milliseconds(1000));
  }

  std::cout << "publisherThread stops()" << std::endl;
}

也就是客户端自己发布,自己接收,ROSBridge C++客户端输出如下:

publish_client: Opened connection
publish_client
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值