2021@SDUSC
ROS-3DSLAM(1):综述
2021年9月27日星期一——2021年9月29日星期三
一、项目简介:
Robot operating System (ROS),通常被称为机器人操作系统,是一种弱耦合的分布式进程框架,通过进程间的消息传递和管理来实现硬件抽象和设备控制。
我们的任务是对于这一系统的源代码进行分析。
二、基本知识储备:
一、概念初识(基于乌龟例子的学习)
ROS文件系统
创建软件包:catkin和rosmake两种方式
软件包的编译
节点:节点、消息、话题、主节点、roscore、rosout
话题:发布和订阅、消息、查看rosmsg
服务和参数:请求和响应、查看rosservice、rosparam
rqt_console和roslaunch
二 进一步的学习
使用rosed来编辑
消息和服务
简单的发布者和订阅者(python版本)
简单的服务和客户端(python版本)
编写后测试与检验
三、确定关键代码:
我负责的部分是通信和摄像头相关的包:
2、12、14、15、16、17
2-ros_comm-noetic-devel(本文代码中最重要的一个包)
ROS通信相关包,包括核心客户端库(roscpp, rospy)和图形自检工具(rostopic, rosnode, rosservice, rosparam)。
clients:clients目录下有两个,分别是python实现和cpp实现:
1. roscpp:roscpp是最广泛使用的ROS客户端库,被设计为是高性能的ROS库。
2. rospy:rospy是一个纯Python的ROS客户端库。rospy客户端API使Python程序员能够快速地与ROS进行接 口, rospy的设计有利于测试需要快速实现(如开发时)的运行时性能,以便算法可以快速在ROS中进行原型测 试。它也是理想的非关键路径代码,例如配置和初始化代码。许多ROS工具都是用rospy编写的类型自省能力 的优势。许多ROS工具都建立在rospy之上。
tools:(只介绍上文中的四个包)
rostopic:Rostopic包含Rostopic命令行工具,用于显示关于ROS,包括发布者、订阅者、发布速率和ROS。它还包含一个实验性的Python库,用于获取关于主题的信息并与主题动态交互。这个库只供内部使用,因为代码API可能会改变,尽管它提供了如何在ROS中实现动态订阅和发布行为的示例
rsnode:Rosnode是一个用于显示调试信息的命令行工具关于ROS包括发布、订阅和连接。它还包含用于检索节点的实验库信息。此库仅供内部使用。
rosservice:Rosservice包含用于列表的Rosservice命令行工具和查询ROS服务。它还包含一个Python库,用于检索关于服务和动态调用它们。Python库是实验性的,仅供内部使用。
rosparam:rosparam包含用于rosparam命令行工具来获取和设置参数服务器使用yaml编码的文件。它还包含实验库使用YAML的参数服务器。此库仅供内部使用。rosparam可以在roslaunch文件中调用。
tool文件夹下的其他包。
12-rosserial-noetic-devel
ROS串口通信的实现,以及一些给arduino之类的小板子提供的ROS通信库。
rosserial是一种协议,用于在字符设备(如串行端口或网络套接字)上包装标准的ROS串行消息并多路复用多个主题和服务。
客户端库允许用户轻松地启动ROS节点并在各种系统上运行。这些客户端是通用的ANSI c++ rosserial_client库的端口。包括:
rosserial_arduino | 支持Arduino兼容板包括UNO, Leonardo, MEGA, DUE, Teensy 3。LC、Spark、STM32F1、STM32Duino、ESP8266、ESP32 |
---|---|
rosserial_embeddedlinux | 支持嵌入式Linux(如路由器) |
rosserial_windows | 支持与Windows应用程序通信 |
rosserial_mbed | 支持mbed平台 |
rosserial_tivac | 支持TI的Launchpad板,TM4C123GXL和TM4C1294XL |
rosserial_vex_v5 | 支持VEX V5 Robot Brain |
rosserial_vex_cortex | 支持VEX皮质板 |
rosserial_stm32 | 支持STM32 mcu,基于STM32CubeMX HAL |
ros-teensy | 支持小型平台 |
运行rosserial代码的设备需要主机上的一个节点来桥接从串行协议到更通用的ROS网络的连接:
rosserial_python:基于python的实现(推荐用于PC)。
rosserial_server: 基于ShapeShifter消息的c++实现,与rosserial_python相比有一些限制,但推荐用于高性能应用程序。
示例和用例
我们已经创建了一些扩展和示例:
rosserial_arduino教程-包含使用Arduino的各种传感器和执行器的一些例子。这是最有文档记录的教程,其中描述的许多功能可以扩展到其他平台。用于使用XBEE设备和Arduino创建传感器网络的工具。
rosserial_embeddedlinux教程包含了许多带有嵌入式linux系统的各种传感器和驱动器的例子,这些系统不能运行全面的ROS。
rosserial_mbed教程-包含使用各种传感器和执行器与Mbed平台的许多例子。
rosserial_tivac教程-使用Energia IDE或catkinized项目编程TI的TivaC Launchpad的各种示例。
14-video_stream_opencv-master
video_stream_opencv包包含一个用于发布视频流的节点(协议在ROS图像主题中支持opencv支持,包括rtsp, webcams on /dev/video和视频文件),它支持摄像头信息和基本图像翻转(水平,垂直或两者)能力,也可以调整发布速率。
一个包查看视频流基于OpenCV videcapture模块,简单的方式发布一个ROS图像主题(包括摄像头信息)usb摄像头,以太网摄像头,视频流或视频文件。它还支持图像翻转和fps节流。
15-gscam-master
一个ROS摄像头驱动程序,使用gstreamer连接设备,如网络摄像头。
gscam是一种在ROS中使用网络摄像头的简单方法,可以最大限度地提高兼容性。gscam利用了Gstreamer,一个类似于DirectShow的多媒体框架。具体来说:Gstreamer可用于构建由源、汇和过滤器组成的多媒体“管道”。例如:一个v4l网络摄像头源在被发送到屏幕(接收器)之前可能会被一个升级器过滤。另一种方法是,mp4文件可以作为源文件,然后作为接收器过滤到avi文件中。有很多可能性。有关概述,请参见:使用Gstreamer。
Gscam可以将自己附加到一个特殊格式的管道上。如果这个管道是处理RGB视频,gscam将作为标准ROS图像传输和ROS摄像机重播视频。由于Gstreamer兼容Linux下的几乎所有视频捕捉标准(以及OSX上的许多标准),gscam使得ROS实际上兼容几乎所有Linux网络摄像头或视频系统。此外,由于有许多Gstreamer过滤器处理视频(例如白平衡,裁剪等),gscam允许更高级的视频处理,即使是在更便宜的网络摄像头。
Gstreamer是一个非常丰富的框架,但基本用法相当简单。请参阅“基本用法”部分开始。你也可以在他们的网站上找到Gstreamer文档。
16- ros_controllers-noetic-devel
在一个机器人当中有多个controller,类似ros_controllers中现提供的、effort_controllers、joint_state_controller、position_controllers、velocity_controllers、joint_trajectory_controllers,其中不同的controller可以完成对不同模块的控制。如:
effort_controllers -向关节施加所需的力/扭矩。
Joint_effort_controller(力/扭矩输入直接输出到关节)
joint_position_controller(位置输入进入PID控制器,输出力/力矩到关节)
joint_velocity_controller(速度输入进入PID控制器,输出力/扭矩到关节)
joint_state_controller—将注册到hardware_interface::JointStateInterface的所有资源的状态发布到sensor_msgs/JointState类型的主题。
joint_state_controller
position_controllers—一次设置一个或多个关节位置。
joint_position_controller
joint_group_position_controller
velocity_controllers—一次设置一个或多个关节速度。
类似于包12的第一部分,也是各种各样的模块。
17-ros_control-noetic-devel
controller_manager:管理和控制各个controller的管理器,其主要提供统一的接口来管理不同的manager。
hardware_interface: 在撰写本文时,可用硬件接口(通过硬件资源管理器)的列表。硬件接口由ROS控制与上述其中一个ROS控制器一起使用,向硬件发送和接收命令。这个文件为硬件提供了接口。
controller_interface:这个文件为contrller提供了接口。
ros_control: 一组包,包括控制器接口、控制器管理器、传输和硬件。
commbined_robot_hw: 组合的硬件机器人,ComboRobotHW是某种RobotHW管理器。
rqt_controller_manager: 用于与控制器管理器交互的图形前端。
四、组内分工:
关键代码确定工作:
导航相关:1、5、6、10、13、。 通信和摄像头相关:2、16、17、15、12、14。 图、rviz和tf相关:3、4、7、8、9、11。
五、参考资料:
ROS学习笔记——初识源代码 - 知乎 (zhihu.com)