文章目录
小结
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
实现及测试
启动服务器端测试环境
#启动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

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

被折叠的 条评论
为什么被折叠?



