
rosbridge入门教程
发布日期:2021-11-03 21:19:26
浏览次数:9
分类:技术文章
本文共 12587 字,大约阅读时间需要 41 分钟。
转
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的命令的规范。
- 订阅主题的协议示例:
{ "op": "subscribe", "topic": "/cmd_vel", "type": "geometry_msgs/Twist"}
- 规范是编程语言和传输方式无关。
- 想法是任何语言或传输可以发送JSON形式的rosbridge协议与ROS交互。
- 协议涵盖订阅和发布主题,服务调用,获取和设置参数,甚至压缩消息等。
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--rosbridge-server
- 为对应的ros版本,如indigo
Rosbridge运行
- 新终端,运行rosbridge并启动websocket:
roslaunch rosbridge_server rosbridge_websocket.launch
- 默认情况下,这将运行rosbridge并创建一个WebSocket在端口9090
- 您可以通过在ROS中设置~/port参数来配置端口。
- 例如修改端口为8080,如下所示:
- 现在rosbridge已经启动,并且WebSocket连接可用,我们可以创建一个基本的HTML网页发送和接收呼叫rosbridge。
- Roslibjs是一个JavaScript库,为您处理通信。
- 查看,使用roslibjs和rosbridge创建一个网页。
Rosbridge开发
- Rosbridge套件提供了一套默认的套件,用于在WebSocket传输层使用rosbridge协议。
- 然而,协议是传输层无关的,并且可以非常好地支持TCP和其他传输。
(1)构建Rosbridge包
- 安装rosauth
sudo apt-get install ros-indigo-rosauth
- 加入ROS环境
source /opt/ros/indigo/setup.bash
- 创建工作空间和下载代码
$ mkdir -p ~/catkin_ws/src$ cd ~/catkin_ws/src$ git clone https://github.com/RobotWebTools/rosbridge_suite.git
- 编译
$ cd ~/catkin_ws$ catkin_make
- 加入工作环境
$ cd ~/catkin_ws$ source devel/setup.bash
rosbridge_suite入门教程-rosbridge_suite代码解读
说明:
- 介绍rosbridge_suite元包解读
代码目录结构:
├── CHANGELOG.rst├── CMakeLists.txt #构建文件,包括Cmake版本,包路径,指明为元包等└── package.xml
#包信息,包含包名称,版本,介绍,作者,构建依赖,运行依赖等。
rosbridge_suite入门教程-rosbridge_library代码解读
说明:
- 介绍rosbridge_library各文件及功能
代码目录结构:
├── CHANGELOG.rst├── CMakeLists.txt├── msg
#定义消息│ ├── Num.msg
#定义数字消息│ ├── TestChar.msg
#定义字符消息│ ├── TestDurationArray.msg
#定义Duration数组消息│ ├── TestHeaderArray.msg
#定义Header数组消息│ ├── TestHeader.msg
#定义Header消息│ ├── TestHeaderTwo.msg
#定义Header消息 │ ├── TestTimeArray.msg
#定义Time数组消息│ ├── TestUInt8FixedSizeArray16.msg #定义Unit8[16]消息│ └── TestUInt8.msg
#定义Unit8[]消息├── package.xml├── setup.py
#python安装脚本├── src│ └── rosbridge_library
#核心库│
├── capabilities
#功能包│
│ ├── advertise.py
#执行话题的广播和取消│
│ ├── advertise_service.py #执行服务的广播│
│ ├── call_service.py
#调用服务│
│ ├── defragmentation.py
#对消息内容解析│
│ ├── fragmentation.py
#对消息内容封装│
│ ├── __init__.py
#声明为Python库│
│ ├── publish.py
#发布话题│
│ ├── service_response.py
#服务反馈处理│
│ ├── subscribe.py
#订阅话题│
│ └── unadvertise_service.py #取消服务广播│
├── capability.py│
├── __init__.py│
├── internal
#内部功能实现│
│ ├── exceptions.py
#异常处理│
│ ├── __init__.py│
│ ├── message_conversion.py #消息转换│
│ ├── pngcompression.py
#图像压缩│
│ ├── publishers.py
#跟踪使用特定发布者的客户端。提供用于发布消息和注册使用这个发布者的客户端的API│
│ ├── ros_loader.py
#ros相关核心类导入│
│ ├── services.py
#为特定的服务创建服务调用者,使用start()开启独立线程,或在线程中使用run()函数。│
│ ├── subscribers.py
#管理和与ROS订阅服务器对象接口.单个订阅者在多个客户端之间共享│
│ ├── subscription_modifiers.py #位于来自订阅的传入消息和传出消息之间发布方法,提供限制/缓冲功能.当参数改变时,处理程序可以转换到不同的类型的处理程序│
│ └── topics.py
#发布者和订阅者共同的代码和异常处理 │
├── protocol.py
#单个客户端与ROS交互的接口.│
├── rosbridge_protocol.py
#继承protocol协议,初始化rosbridge功能列表│
└── util│
└── __init__.py├── srv
#服务定义│ ├── AddTwoInts.srv
#│ ├── SendBytes.srv
#发送内容定义│ ├── TestArrayRequest.srv│ ├── TestEmpty.srv│ ├── TestMultipleRequestFields.srv│ ├── TestMultipleResponseFields.srv│ ├── TestNestedService.srv│ ├── TestRequestAndResponse.srv│ ├── TestRequestOnly.srv│ └── TestResponseOnly.srv└── test
#相关测试,包括核心功能,扩展功能,内部执行
├── capabilities
│ ├── __init__.py
│ ├── test_advertise.py
│ ├── test_call_service.py
│ ├── test_capabilities.test
│ ├── test_publish.py
│ └── test_subscribe.py
├── experimental
│ ├── complex_srv+tcp
│ │ ├── test_non-ros_service_client_complex-srv.py
│ │ └── test_non-ros_service_server_complex-srv.py
│ └── fragmentation+srv+tcp
│
├── test_non-ros_service_client_fragmented.py
│
└── test_non-ros_service_server_fragmented.py
├── __init__.py
├── internal
│ ├── __init__.py
│ ├── publishers
│ │ ├── __init__.py
│ │ ├── test_multi_publisher.py
│ │ ├── test_multi_unregistering.py
│ │ ├── test_publisher_consistency_listener.py
│ │ └── test_publisher_manager.py
│ ├── subscribers
│ │ ├── __init__.py
│ │ ├── test_multi_subscriber.py
│ │ ├── test_subscriber_manager.py
│ │ └── test_subscription_modifiers.py
│ ├── test_compression.py
│ ├── test_internal.test
│ ├── test_message_conversion.py
│ ├── test_ros_loader.py
│ └── test_services.py
└── 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提供的多种服务器模式及实现
代码目录结构:
├── CHANGELOG.rst├── CMakeLists.txt├── launch
#启动│ ├── rosbridge_tcp.launch
#启动TCP服务器,调用rosbridge_tcp.py│ ├── rosbridge_udp.launch
#启动UDP服务器,调用rosbridge_udp.py
│ └── rosbridge_websocket.launch
#启动WEBSOCKET服务器,调用rosbridge_websocket.py├── package.xml├── scripts│ ├── rosbridge_tcp -> ./rosbridge_tcp.py│ ├── rosbridge_tcp.py
#ros TCP节点, 利用SocketServer实现TCP通讯│ ├── rosbridge_udp -> rosbridge_udp.py│ ├── rosbridge_udp.py
#ros UPD节点,利用reactor.listenUDP实现UDP通讯│ ├── rosbridge_websocket -> rosbridge_websocket.py│ └── rosbridge_websocket.py
#ros websocket节点,利用tornado.web实现websocket通讯├── setup.py└── src
├── backports
│ ├── __init__.py
│ └── ssl_match_hostname
│
├── __init__.py
│
├── LICENSE.txt
│
└── README.txt
├── rosbridge_server
#服务器处理
│ ├── __init__.py
│ ├── tcp_handler.py
#实现RosbridgeTcpSocket类,用于处理TCP消息
│ ├── udp_handler.py
#实现RosbridgeUdpFactory类和RosbridgeUdpSocket类,用于处理UDP消息
│ ├── websocket_handler.py
#实现RosbridgeWebSocket类,用于处理websocket消息
└── tornado
#Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本
├── auth.py
├── autoreload.py
├── concurrent.py
├── curl_httpclient.py
├── escape.py
├── gen.py
├── http1connection.py
├── httpclient.py
├── httpserver.py
├── httputil.py
├── __init__.py
├── ioloop.py
├── iostream.py
├── locale.py
├── log.py
├── log.pyc
├── netutil.py
├── options.py
├── platform
│ ├── asyncio.py
│ ├── auto.py
│ ├── auto.pyc
│ ├── caresresolver.py
│ ├── common.py
│ ├── epoll.py
│ ├── epoll.pyc
│ ├── __init__.py
│ ├── interface.py
│ ├── kqueue.py
│ ├── posix.py
│ ├── select.py
│ ├── twisted.py
│ └── windows.py
├── process.py
├── simple_httpclient.py
├── speedups.c
├── stack_context.py
├── tcpclient.py
├── tcpserver.py
├── template.py
├── test
│ ├── auth_test.py
│ ├── concurrent_test.py
│ ├── csv_translations
│ │ └── fr_FR.csv
│ ├── curl_httpclient_test.py
│ ├── escape_test.py
│ ├── gen_test.py
│ ├── gettext_translations
│ │ └── fr_FR
│ │
└── LC_MESSAGES
│ │
├── tornado_test.mo
│ │
└── tornado_test.po
│ ├── httpclient_test.py
│ ├── httpserver_test.py
│ ├── httputil_test.py
│ ├── import_test.py
│ ├── __init__.py
│ ├── ioloop_test.py
│ ├── iostream_test.py
│ ├── locale_test.py
│ ├── log_test.py
│ ├── __main__.py
│ ├── netutil_test.py
│ ├── options_test.cfg
│ ├── options_test.py
│ ├── process_test.py
│ ├── README
│ ├── resolve_test_helper.py
│ ├── runtests.py
│ ├── simple_httpclient_test.py
│ ├── stack_context_test.py
│ ├── static
│ │ ├── dir
│ │ │ └── index.html
│ │ └── robots.txt
│ ├── tcpclient_test.py
│ ├── templates
│ │ └── utf8.html
│ ├── template_test.py
│ ├── test.crt
│ ├── testing_test.py
│ ├── test.key
│ ├── twisted_test.py
│ ├── util.py
│ ├── util_test.py
│ ├── websocket_test.py
│ ├── web_test.py
│ └── wsgi_test.py
├── testing.py
├── util.py
├── web.py
├── websocket.py
└── 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服务
代码目录结构:
├── CHANGELOG.rst├── CMakeLists.txt├── msg│ └── TypeDef.msg
#消息类型定义├── package.xml├── scripts
#脚本│ └── rosapi_node
#初始化服务和参数├── setup.py├── src│ └── rosapi
#API具体实现│
├── __init__.py│
├── objectutils.py │
├── params.py│
└── proxy.py└── srv
#定义各种服务
├── DeleteParam.srv
├── GetActionServers.srv
├── GetParamNames.srv
├── GetParam.srv
├── GetTime.srv
├── HasParam.srv
├── MessageDetails.srv
├── NodeDetails.srv
├── Nodes.srv
├── Publishers.srv
├── SearchParam.srv
├── ServiceHost.srv
├── ServiceNode.srv
├── ServiceProviders.srv
├── ServiceRequestDetails.srv
├── ServiceResponseDetails.srv
├── ServicesForType.srv
├── Services.srv
├── ServiceType.srv
├── SetParam.srv
├── Subscribers.srv
├── TopicsForType.srv
├── Topics.srv
└── TopicType.srv
重要文件说明:
scripts/rosapi_node
- 初始化服务
- 服务包含:
rospy.Service('/rosapi/topics', Topics, get_topics)rospy.Service('/rosapi/topics_for_type', TopicsForType, get_topics_for_type)rospy.Service('/rosapi/services', Services, get_services)rospy.Service('/rosapi/services_for_type', ServicesForType, get_services_for_type)rospy.Service('/rosapi/nodes', Nodes, get_nodes)rospy.Service('/rosapi/node_details', NodeDetails, get_node_details)rospy.Service('/rosapi/action_servers', GetActionServers, get_action_servers)rospy.Service('/rosapi/topic_type', TopicType, get_topic_type)rospy.Service('/rosapi/service_type', ServiceType, get_service_type)rospy.Service('/rosapi/publishers', Publishers, get_publishers)rospy.Service('/rosapi/subscribers', Subscribers, get_subscribers)rospy.Service('/rosapi/service_providers', ServiceProviders, get_service_providers)rospy.Service('/rosapi/service_node', ServiceNode, get_service_node)rospy.Service('/rosapi/service_host', ServiceHost, get_service_host)rospy.Service('/rosapi/message_details', MessageDetails, get_message_details)rospy.Service('/rosapi/service_request_details', ServiceRequestDetails, get_service_request_details)rospy.Service('/rosapi/service_response_details', ServiceResponseDetails, get_service_response_details)rospy.Service('/rosapi/set_param', SetParam, set_param)rospy.Service('/rosapi/get_param', GetParam, get_param)rospy.Service('/rosapi/has_param', HasParam, has_param)rospy.Service('/rosapi/search_param', SearchParam, search_param)rospy.Service('/rosapi/delete_param', DeleteParam, delete_param)rospy.Service('/rosapi/get_param_names', GetParamNames, get_param_names)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,获取服务器时间
转载地址:https://blog.csdn.net/wjydym/article/details/95380260 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.249.79.50]2022年04月14日 04时30分16秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
最新文章
多线程之旅:避免死锁——简单的锁分级(锁排序)
2020-02-06 08:52:10
多线程之旅:解读async和await
2020-02-06 08:52:10
多线程之旅六——异步编程模式,自己实现IAsyncResult
2020-02-06 08:52:10
多线程之旅二——线程与进程简介
2020-02-06 08:52:10
多线程之旅之四——浅谈内存模型和用户态同步机制
2020-02-06 08:52:10
多线程之旅之三——Windows内核对象同步机制
2020-02-06 08:52:10
多线程之旅七——GUI线程模型,消息的投递(post)与处理
2022-04-11
多线程之旅——从概念开始
2022-04-11
多线程之并发容器一
2020-02-06 08:52:09
多线程之守护线程
2020-02-06 08:52:09
多线程之多个线程同时下载同一个资源文件
2020-02-06 08:52:09
多线程之基础
2020-02-06 08:52:09
多线程之内置锁原理简介
2020-02-06 08:52:08
多线程之synchronized
2020-02-06 08:52:08
多线程之sleep和wait的区别
2020-02-06 08:52:08
多线程之CAS与synchronized的比较
2020-02-06 08:52:08
多线程之callable详解
2020-02-06 08:52:08
多线程之BlockingQueue中 take、offer、put、add的一些比较
2020-02-06 08:52:08
多线程之BackgroundWorker组件
2020-02-06 08:52:08
多线程之 生产者消费者模型 线程池
2020-02-06 08:52:07