C#开发ROS的话题发布与订阅
一、前言
在写这篇文章之前,我花费了将近一周时间研究,终于发现了一个ROS的库,这是由小日子过得不错的日本人开发的
Github地址如下:
https://github.com/zoetrope/rossharp
这是在.NET Framework 4.0开发的,其实这并不是我想要的,我想在Linux平台下开发,并且发布在Linux平台下。
正好这段时间.NET5出来了,我就想着把这个库改成.NET Core或者.NET5
二、原理
花了两天时间,研究了原理,简单的说一下原理
下面这张图描述了话题的通信机制
从上图中可以看到,通信方式使用的是XmlRPC 以及 TCP
XmlRPC API参照下面网址
https://wiki.ros.org/ROS/Master_Slave_APIs
里面有三个API MasterAPI、ParameterServerAPI、以及SlaveAPI
MasterAPI是节点管理器的接口,主要用于向节点管理器注册或者取消注册各种通信(发布者、订阅者、服务)
ParameterServerAPI是参数服务器,主要用于ROS中参数的存取
SlaveAPI是各个节点的回调服务,如果自己写个节点的话,需要创建这个服务供其他节点访问
1.话题订阅
1.1 话题订阅需要通过xmlRPC协议向ROS节点管理器注册Subscriber,然后开启回调服务
1.2 ROS Master会返回所有的发布该话题的 URL
1.3 根据URL,创建Slave客户端,向那些节点请求话题
1.4 然后会返回TCP通信的主机与通信端口号
1.5 根据通信端口号与主机建立TCP连接,然后向TCP服务端发送请求头
1.6 TCP服务端就会将发布的消息返回到客户端
2.消息发布就反推,需要开启TCP服务端,Slave服务端需要在RequestTopic中返回该端口号
3.TCP通信的消息头参考http://wiki.ros.org/ROS/TCPROS
三、使用
RosSharp库我已放到gitee上
https://gitee.com/zjwno1/ros-sharp-net5
1.使用VS2019 最新版,支持.NET5
2.Ubuntu上安装.NET5环境,查看我上篇博客
3.编写测试代码
4.运行测试
4.1 开启roscore
4.2 发布话题
rostopic pub -r 1 /chatter std_msgs/String "data: 'AAABBBCCC'"
4.3 输出消息
rostopic echo /chatter
5.运行程序(VS要用管理员方式打开,否则会SlaveServer监听失败)
成功显示消息
6.再开一个VS 运行Publisher
成功发布话题
反过来再看看终端,也能显示消息
7.打开rqt_graph,查看一下节点关系
rqt_graph
OK,成功
四、发布到Ubuntu中使用
1.修改代码中的HostName为localhost ,因为再ubuntu中,ROS节点管理器,跟我们写的都在同一台主机,所以可以用localhost
2.发布完上传到ubuntu中
在终端授权为可执行
chmod 777 RosPublisher chmod 777 RosSubscriber
3.在ubuntu中运行