当前位置:   article > 正文

rosbridge入门教程_rosbridge_suite

rosbridge_suite

https://www.ncnynl.com/category/ros-rosbridge_suite/

rosbridge_suite入门教程-目录

说明:

  • 介绍rosbridge_suite包的功能及使用

介绍:

  • Rosbridge为非ROS程序提供了一个使用ROS功能的JSON API。
  • 有许多前端与rosbridge接口,包括一个WebSocket服务器,用于Web浏览器进行交互。
  • Rosbridge_suite是一个包含rosbridge的元包,rosbridge的各种前端包,像一个WebSocket包和帮助包。

目录:

  • rosbridge_suite入门教程-目录
  • rosbridge_suite入门教程-rosbridge_suite介绍
  • rosbridge_suite入门教程-rosbridge_suite代码解读
  • rosbridge_suite入门教程-rosbridge_library代码解读
  • rosbridge_suite入门教程-rosbridge_server代码解读
  • rosbridge_suite入门教程-rosapi代码解读

 

rosbridge_suite入门教程-rosbridge_suite介绍

说明:

  • 介绍rosbridge_suite协议及安装

rosbridge

  • Rosbridge为非ROS程序提供了一个使用ROS功能的JSON API。
  • 有许多前端与rosbridge接口,包括一个WebSocket服务器,用于Web浏览器进行交互。
  • Rosbridge_suite是一个包含rosbridge的元包,rosbridge的各种前端包,像一个WebSocket包和帮助包。
  • rosbridge包含两个部分:
    • rosbridge协议
    • rosbridge实现

rosbridge协议

  • rosbridge协议是用于向ROS(并且在理论上,任何其他机器人中间件)发送基于JSON的命令的规范。
  • 订阅主题的协议示例:
  1. { "op": "subscribe",
  2. "topic": "/cmd_vel",
  3. "type": "geometry_msgs/Twist"
  4. }
  • 规范是编程语言和传输方式无关。
  • 想法是任何语言或传输可以发送JSON形式的rosbridge协议与ROS交互。
  • 协议涵盖订阅和发布主题,服务调用,获取和设置参数,甚至压缩消息等。
  • 详细的规范定义参考github说明

rosbridge实现

  • rosbridge_suite包是一个包集合,用于实现rosbridge协议和提供WebSocket传输层。
  • 包含如下几个包:
    • rosbridge_library - 核心rosbridge包。rosbridge_library负责获取JSON字符串并将命令发送到ROS,反之亦然。
    • rosapi - 通过服务调用使某些ROS actions可访问。 这包括获取和设置参数,获取主题列表等。
    • rosbridge_server - 虽然rosbridge_library提供了JSON ROS转换,但它将传输层留给其他人。
      • Rosbridge_server提供了一个WebSocket连接,所以浏览器可以“与rosbridge交谈”。
      • Roslibjs是一个浏览器的JavaScript库,可以通过rosbridge_server与ROS交谈。

rosbridge安装

  • 新终端输入:
sudo apt-get install ros-<rosdistro>-rosbridge-server
  • 为对应的ros版本,如indigo

Rosbridge运行

  • 新终端,运行rosbridge并启动websocket:
roslaunch rosbridge_server rosbridge_websocket.launch
  • 默认情况下,这将运行rosbridge并创建一个WebSocket在端口9090
  • 您可以通过在ROS中设置~/port参数来配置端口。
  • 例如修改端口为8080,如下所示:
  1. <launch>
  2. <include file="$(find rosbridge_server)/launch/rosbridge_websocket.launch" >
  3. <arg name="port" value="8080"/>
  4. </include>
  5. </launch>
  • 现在rosbridge已经启动,并且WebSocket连接可用,我们可以创建一个基本的HTML网页发送和接收呼叫rosbridge。
  • Roslibjs是一个JavaScript库,为您处理通信。
  • 查看roslibjs教程的入门,使用roslibjs和rosbridge创建一个网页。

Rosbridge开发

  • Rosbridge套件提供了一套默认的套件,用于在WebSocket传输层使用rosbridge协议。
  • 然而,协议是传输层无关的,并且可以非常好地支持TCP和其他传输。

(1)构建Rosbridge包

  • 安装rosauth
sudo apt-get install ros-indigo-rosauth
  • 加入ROS环境
source /opt/ros/indigo/setup.bash
  • 创建工作空间和下载代码
  1. $ mkdir -p ~/catkin_ws/src
  2. $ cd ~/catkin_ws/src
  3. $ git clone https://github.com/RobotWebTools/rosbridge_suite.git
  • 编译
  1. $ cd ~/catkin_ws
  2. $ catkin_make
  • 加入工作环境
  1. $ cd ~/catkin_ws
  2. $ source devel/setup.bash

 

rosbridge_suite入门教程-rosbridge_suite代码解读

说明:

  • 介绍rosbridge_suite元包解读

代码目录结构:

  1. ├── CHANGELOG.rst
  2. ├── CMakeLists.txt #构建文件,包括Cmake版本,包路径,指明为元包等
  3. └── package.xml #包信息,包含包名称,版本,介绍,作者,构建依赖,运行依赖等。

 

rosbridge_suite入门教程-rosbridge_library代码解读

说明:

  • 介绍rosbridge_library各文件及功能

代码目录结构:

  1. ├── CHANGELOG.rst
  2. ├── CMakeLists.txt
  3. ├── msg #定义消息
  4. │   ├── Num.msg #定义数字消息
  5. │   ├── TestChar.msg #定义字符消息
  6. │   ├── TestDurationArray.msg #定义Duration数组消息
  7. │   ├── TestHeaderArray.msg #定义Header数组消息
  8. │   ├── TestHeader.msg #定义Header消息
  9. │   ├── TestHeaderTwo.msg #定义Header消息
  10. │   ├── TestTimeArray.msg #定义Time数组消息
  11. │   ├── TestUInt8FixedSizeArray16.msg #定义Unit8[16]消息
  12. │   └── TestUInt8.msg #定义Unit8[]消息
  13. ├── package.xml
  14. ├── setup.py #python安装脚本
  15. ├── src
  16. │   └── rosbridge_library #核心库
  17. │   ├── capabilities #功能包
  18. │   │   ├── advertise.py #执行话题的广播和取消
  19. │   │   ├── advertise_service.py #执行服务的广播
  20. │   │   ├── call_service.py #调用服务
  21. │   │   ├── defragmentation.py #对消息内容解析
  22. │   │   ├── fragmentation.py #对消息内容封装
  23. │   │   ├── __init__.py #声明为Python库
  24. │   │   ├── publish.py #发布话题
  25. │   │   ├── service_response.py #服务反馈处理
  26. │   │   ├── subscribe.py #订阅话题
  27. │   │   └── unadvertise_service.py #取消服务广播
  28. │   ├── capability.py
  29. │   ├── __init__.py
  30. │   ├── internal #内部功能实现
  31. │   │   ├── exceptions.py #异常处理
  32. │   │   ├── __init__.py
  33. │   │   ├── message_conversion.py #消息转换
  34. │   │   ├── pngcompression.py #图像压缩
  35. │   │   ├── publishers.py #跟踪使用特定发布者的客户端。提供用于发布消息和注册使用这个发布者的客户端的API
  36. │   │   ├── ros_loader.py #ros相关核心类导入
  37. │   │   ├── services.py #为特定的服务创建服务调用者,使用start()开启独立线程,或在线程中使用run()函数。
  38. │   │   ├── subscribers.py #管理和与ROS订阅服务器对象接口.单个订阅者在多个客户端之间共享
  39. │   │   ├── subscription_modifiers.py #位于来自订阅的传入消息和传出消息之间发布方法,提供限制/缓冲功能.当参数改变时,处理程序可以转换到不同的类型的处理程序
  40. │   │   └── topics.py #发布者和订阅者共同的代码和异常处理
  41. │   ├── protocol.py #单个客户端与ROS交互的接口.
  42. │   ├── rosbridge_protocol.py #继承protocol协议,初始化rosbridge功能列表
  43. │   └── util
  44. │   └── __init__.py
  45. ├── srv #服务定义
  46. │   ├── AddTwoInts.srv #
  47. │   ├── SendBytes.srv #发送内容定义
  48. │   ├── TestArrayRequest.srv
  49. │   ├── TestEmpty.srv
  50. │   ├── TestMultipleRequestFields.srv
  51. │   ├── TestMultipleResponseFields.srv
  52. │   ├── TestNestedService.srv
  53. │   ├── TestRequestAndResponse.srv
  54. │   ├── TestRequestOnly.srv
  55. │   └── TestResponseOnly.srv
  56. └── test #相关测试,包括核心功能,扩展功能,内部执行
  57. ├── capabilities
  58. │   ├── __init__.py
  59. │   ├── test_advertise.py
  60. │   ├── test_call_service.py
  61. │   ├── test_capabilities.test
  62. │   ├── test_publish.py
  63. │   └── test_subscribe.py
  64. ├── experimental
  65. │   ├── complex_srv+tcp
  66. │   │   ├── test_non-ros_service_client_complex-srv.py
  67. │   │   └── test_non-ros_service_server_complex-srv.py
  68. │   └── fragmentation+srv+tcp
  69. │   ├── test_non-ros_service_client_fragmented.py
  70. │   └── test_non-ros_service_server_fragmented.py
  71. ├── __init__.py
  72. ├── internal
  73. │   ├── __init__.py
  74. │   ├── publishers
  75. │   │   ├── __init__.py
  76. │   │   ├── test_multi_publisher.py
  77. │   │   ├── test_multi_unregistering.py
  78. │   │   ├── test_publisher_consistency_listener.py
  79. │   │   └── test_publisher_manager.py
  80. │   ├── subscribers
  81. │   │   ├── __init__.py
  82. │   │   ├── test_multi_subscriber.py
  83. │   │   ├── test_subscriber_manager.py
  84. │   │   └── test_subscription_modifiers.py
  85. │   ├── test_compression.py
  86. │   ├── test_internal.test
  87. │   ├── test_message_conversion.py
  88. │   ├── test_ros_loader.py
  89. │   └── test_services.py
  90. └── test_all.test

重要文件说明:

rosbridge_library/src/protocol.py

  • 单个客户端与ROS交互的接口.
  • 协议实例的生命周期如下:
    • 处理从客户端传入的消息
    • 发送处理后的消息到客户端
    • 客户端完成清除相关资源

rosbridge_library/test

  • python的单元测试目录
  • http://wiki.ros.org/unittest
  • http://wiki.ros.org/rostest

 

rosbridge_suite入门教程-rosbridge_server代码解读

说明:

  • 介绍rosbridge_server提供的多种服务器模式及实现

代码目录结构:

  1. ├── CHANGELOG.rst
  2. ├── CMakeLists.txt
  3. ├── launch #启动
  4. │   ├── rosbridge_tcp.launch #启动TCP服务器,调用rosbridge_tcp.py
  5. │   ├── rosbridge_udp.launch #启动UDP服务器,调用rosbridge_udp.py
  6. │   └── rosbridge_websocket.launch #启动WEBSOCKET服务器,调用rosbridge_websocket.py
  7. ├── package.xml
  8. ├── scripts
  9. │   ├── rosbridge_tcp -> ./rosbridge_tcp.py
  10. │   ├── rosbridge_tcp.py #ros TCP节点, 利用SocketServer实现TCP通讯
  11. │   ├── rosbridge_udp -> rosbridge_udp.py
  12. │   ├── rosbridge_udp.py #ros UPD节点,利用reactor.listenUDP实现UDP通讯
  13. │   ├── rosbridge_websocket -> rosbridge_websocket.py
  14. │   └── rosbridge_websocket.py #ros websocket节点,利用tornado.web实现websocket通讯
  15. ├── setup.py
  16. └── src
  17. ├── backports
  18. │   ├── __init__.py
  19. │   └── ssl_match_hostname
  20. │   ├── __init__.py
  21. │   ├── LICENSE.txt
  22. │   └── README.txt
  23. ├── rosbridge_server #服务器处理
  24. │   ├── __init__.py
  25. │   ├── tcp_handler.py #实现RosbridgeTcpSocket类,用于处理TCP消息
  26. │   ├── udp_handler.py #实现RosbridgeUdpFactory类和RosbridgeUdpSocket类,用于处理UDP消息
  27. │   ├── websocket_handler.py #实现RosbridgeWebSocket类,用于处理websocket消息
  28. └── tornado #Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本
  29. ├── auth.py
  30. ├── autoreload.py
  31. ├── concurrent.py
  32. ├── curl_httpclient.py
  33. ├── escape.py
  34. ├── gen.py
  35. ├── http1connection.py
  36. ├── httpclient.py
  37. ├── httpserver.py
  38. ├── httputil.py
  39. ├── __init__.py
  40. ├── ioloop.py
  41. ├── iostream.py
  42. ├── locale.py
  43. ├── log.py
  44. ├── log.pyc
  45. ├── netutil.py
  46. ├── options.py
  47. ├── platform
  48. │   ├── asyncio.py
  49. │   ├── auto.py
  50. │   ├── auto.pyc
  51. │   ├── caresresolver.py
  52. │   ├── common.py
  53. │   ├── epoll.py
  54. │   ├── epoll.pyc
  55. │   ├── __init__.py
  56. │   ├── interface.py
  57. │   ├── kqueue.py
  58. │   ├── posix.py
  59. │   ├── select.py
  60. │   ├── twisted.py
  61. │   └── windows.py
  62. ├── process.py
  63. ├── simple_httpclient.py
  64. ├── speedups.c
  65. ├── stack_context.py
  66. ├── tcpclient.py
  67. ├── tcpserver.py
  68. ├── template.py
  69. ├── test
  70. │   ├── auth_test.py
  71. │   ├── concurrent_test.py
  72. │   ├── csv_translations
  73. │   │   └── fr_FR.csv
  74. │   ├── curl_httpclient_test.py
  75. │   ├── escape_test.py
  76. │   ├── gen_test.py
  77. │   ├── gettext_translations
  78. │   │   └── fr_FR
  79. │   │   └── LC_MESSAGES
  80. │   │   ├── tornado_test.mo
  81. │   │   └── tornado_test.po
  82. │   ├── httpclient_test.py
  83. │   ├── httpserver_test.py
  84. │   ├── httputil_test.py
  85. │   ├── import_test.py
  86. │   ├── __init__.py
  87. │   ├── ioloop_test.py
  88. │   ├── iostream_test.py
  89. │   ├── locale_test.py
  90. │   ├── log_test.py
  91. │   ├── __main__.py
  92. │   ├── netutil_test.py
  93. │   ├── options_test.cfg
  94. │   ├── options_test.py
  95. │   ├── process_test.py
  96. │   ├── README
  97. │   ├── resolve_test_helper.py
  98. │   ├── runtests.py
  99. │   ├── simple_httpclient_test.py
  100. │   ├── stack_context_test.py
  101. │   ├── static
  102. │   │   ├── dir
  103. │   │   │   └── index.html
  104. │   │   └── robots.txt
  105. │   ├── tcpclient_test.py
  106. │   ├── templates
  107. │   │   └── utf8.html
  108. │   ├── template_test.py
  109. │   ├── test.crt
  110. │   ├── testing_test.py
  111. │   ├── test.key
  112. │   ├── twisted_test.py
  113. │   ├── util.py
  114. │   ├── util_test.py
  115. │   ├── websocket_test.py
  116. │   ├── web_test.py
  117. │   └── wsgi_test.py
  118. ├── testing.py
  119. ├── util.py
  120. ├── web.py
  121. ├── websocket.py
  122. └── wsgi.py

重要文件说明:

SocketServer

  • SocketServer内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求的Socket服务端
  • https://docs.python.org/2/library/socketserver.html
  • http://www.cnblogs.com/zhangkui/p/5655428.html
  • http://blog.csdn.net/ghostfromheaven/article/details/8653421

Twisted/reactor

  • Twisted 是用Python实现的基于事件驱动的网络引擎框架
  •  
  • http://www.cnblogs.com/whiggzhaohong/p/5401679.html
  • http://www.tuicool.com/articles/MJBviuM

tornado

  • Tornado是FriendFeed使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本
  • http://www.tornadoweb.cn/
  • http://www.tornadoweb.cn/documentation
  • http://www.tornadoweb.org/en/stable/

 

rosbridge_suite入门教程-rosapi代码解读

说明:

  • 介绍rosapi包功能,提供各种ROS服务

代码目录结构:

  1. ├── CHANGELOG.rst
  2. ├── CMakeLists.txt
  3. ├── msg
  4. │   └── TypeDef.msg #消息类型定义
  5. ├── package.xml
  6. ├── scripts #脚本
  7. │   └── rosapi_node #初始化服务和参数
  8. ├── setup.py
  9. ├── src
  10. │   └── rosapi #API具体实现
  11. │   ├── __init__.py
  12. │   ├── objectutils.py
  13. │   ├── params.py
  14. │   └── proxy.py
  15. └── srv #定义各种服务
  16. ├── DeleteParam.srv
  17. ├── GetActionServers.srv
  18. ├── GetParamNames.srv
  19. ├── GetParam.srv
  20. ├── GetTime.srv
  21. ├── HasParam.srv
  22. ├── MessageDetails.srv
  23. ├── NodeDetails.srv
  24. ├── Nodes.srv
  25. ├── Publishers.srv
  26. ├── SearchParam.srv
  27. ├── ServiceHost.srv
  28. ├── ServiceNode.srv
  29. ├── ServiceProviders.srv
  30. ├── ServiceRequestDetails.srv
  31. ├── ServiceResponseDetails.srv
  32. ├── ServicesForType.srv
  33. ├── Services.srv
  34. ├── ServiceType.srv
  35. ├── SetParam.srv
  36. ├── Subscribers.srv
  37. ├── TopicsForType.srv
  38. ├── Topics.srv
  39. └── TopicType.srv

重要文件说明:

scripts/rosapi_node

  • 初始化服务
  • 服务包含:
  1. rospy.Service('/rosapi/topics', Topics, get_topics)
  2. rospy.Service('/rosapi/topics_for_type', TopicsForType, get_topics_for_type)
  3. rospy.Service('/rosapi/services', Services, get_services)
  4. rospy.Service('/rosapi/services_for_type', ServicesForType, get_services_for_type)
  5. rospy.Service('/rosapi/nodes', Nodes, get_nodes)
  6. rospy.Service('/rosapi/node_details', NodeDetails, get_node_details)
  7. rospy.Service('/rosapi/action_servers', GetActionServers, get_action_servers)
  8. rospy.Service('/rosapi/topic_type', TopicType, get_topic_type)
  9. rospy.Service('/rosapi/service_type', ServiceType, get_service_type)
  10. rospy.Service('/rosapi/publishers', Publishers, get_publishers)
  11. rospy.Service('/rosapi/subscribers', Subscribers, get_subscribers)
  12. rospy.Service('/rosapi/service_providers', ServiceProviders, get_service_providers)
  13. rospy.Service('/rosapi/service_node', ServiceNode, get_service_node)
  14. rospy.Service('/rosapi/service_host', ServiceHost, get_service_host)
  15. rospy.Service('/rosapi/message_details', MessageDetails, get_message_details)
  16. rospy.Service('/rosapi/service_request_details', ServiceRequestDetails, get_service_request_details)
  17. rospy.Service('/rosapi/service_response_details', ServiceResponseDetails, get_service_response_details)
  18. rospy.Service('/rosapi/set_param', SetParam, set_param)
  19. rospy.Service('/rosapi/get_param', GetParam, get_param)
  20. rospy.Service('/rosapi/has_param', HasParam, has_param)
  21. rospy.Service('/rosapi/search_param', SearchParam, search_param)
  22. rospy.Service('/rosapi/delete_param', DeleteParam, delete_param)
  23. rospy.Service('/rosapi/get_param_names', GetParamNames, get_param_names)
  24. rospy.Service('/rosapi/get_time', GetTime, get_time)

节点说明:

  • /rosapi/Topics,返回所有发布的话题列表
  • /rosapi/topics_for_type,返回指定类型的所有发布的话题列表
  • /rosapi/services, 返回所有发布的服务列表
  • /rosapi/services_for_type,返回指定类型的所有发布的服务列表
  • /rosapi/nodes,返回所有已经注册的节点列表
  • /rosapi/node_details,返回某节点详情
  • /rosapi/action_servers,返回action服务列表
  • /rosapi/topic_type,通过话题名获取相应的消息类型
  • /rosapi/service_type,通过服务名获取相应的消息类型
  • /rosapi/publishers,提供话题名获取发布此话题的节点名列表
  • /rosapi/subscribers,提供话题名获取接受此话题的节点名列表
  • /rosapi/service_providers,提供话题名返回广播此服务类型的节点名列表
  • /rosapi/service_node,提供服务名,返回提供此服务的节点名
  • /rosapi/service_host,提供服务名,返回提供此服务的主机名
  • /rosapi/message_details,提供消息类型名,返回类型的TypeDef
  • /rosapi/service_request_details,提供服务类型名,返回消息请求的服务类型的TypeDef
  • /rosapi/service_response_details,提供服务类型名,返回消息反馈的服务类型的TypeDef
  • /rosapi/set_param,设置参数
  • /rosapi/get_param,获取参数
  • /rosapi/has_param,判断参数是否存在
  • /rosapi/search_param,检索参数
  • /rosapi/delete_param,删除参数
  • /rosapi/get_param_names,获取参数名
  • /rosapi/get_time,获取服务器时间
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号