欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

ROS学习笔记(一) : 入门之基本概念

程序员文章站 2022-05-23 09:03:29
目录 基本概念 实践操作 基本概念 1. Package 程序包,里面包含节点Node、ROS程序库、数据集、配置文件 Package Manefist 程序包的配置文件,即描述程序包的相关信息,包括其名字、版本、功能简述、依赖关系 2. Repositories 代码仓库 3. Computati ......

目录

基本概念
实践操作

基本概念

1. package

程序包,里面包含节点node、ros程序库、数据集、配置文件

package manefist

程序包的配置文件,即描述程序包的相关信息,包括其名字、版本、功能简述、依赖关系

2. repositories

代码仓库

3. computation graph

计算图,ros在点对点网络里整合并处理数据的过程。图中包含的基本概念:节点、主机、参数服务器、消息、服务、话题、数据包。

4. node

节点,一个机器人控制系统由多个节点组成,每个节点控制不同的部分。比如一个机器人有两个节点,一个是传感器节点,专门负责接收传感器数据,另一个是控制节点,专门负责控制机器人作出某些动作。

5. master

主机,节点管理器,功能是对于计算图中各个元素进行名字注册(register)和检索,没有主机,节点之间就不能找到彼此则无法进行通信。

parameter service

参数服务器,是主机的一部分,允许数据通过键的方式存储

6. message

消息,节点之间通过传递消息交流,消息是一种数据结构

7. topic

话题,消息的传输使用的是发布\订阅的机制。一个话题可理解为只针对某种消息,节点发送消息则是将该消息发布到其对应的话题上,只有那些订阅该话题的节点才能接收到这个消息。一个话题可能有多个订阅者和发布者,一般他们互相是不知道(也不需知道)对方的存在,以达到解耦(decouple)的效果。

【配图,节点发送消息的过程】

8. service

服务,尽管"发布\订阅"模型非常灵活,但它是多对多、单向传输的,不适用于"发出请求\返回响应"方式的交互,然而这种交互在分布式系统中十分常见。因此 "请求\响应"通过服务来实现。节点需要提供的信息有:所使用服务的名字以及使用服务的客户,将这些信息打包成请求,发送出去之后等待答复。

9. bag

数据包,存储一段时间内ros的消息数据

10. rosout

相当于ros中的stdout/stderr

11. roscore

主机+rosout+参数服务器


实践操作

1. workspace 工作空间

catkin工作空间:

创建catkin工作空间,在需要创建的目录下输入命令:

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_make
  • 最后一个命令是使用catkin工作空间时很方便的工具,在工作空间中第一次执行该命令时,会自动在~/catkin_ws/src文件夹中创建cmakelist,同时在工作空间目录中创建build和devel文件夹
  • 在devel文件夹中有几个setup.*sh 文件,source其中的任一文件可将工作空间路径包含到环境变量中
source devel/setup.bash
  • 为了确认是否包含,检查ros_package _path这个环境变量的值:
echo $ros_package_path

可以看到当前工作空间的路径在最前面
**【注:roscd, rospack等ros工具只能针对那些路径已包含在环境变量ros_package _path中的程序包】**

2. package 程序包

2.1 最简单的程序包 其文件结构看起来如下:

  • my_package
    • cmakelists.txt
    • package.xml

2.2 在catkin工作空间中的程序包

  • workspace_folder
    • src
    • cmakelists.txt
    • pkg_1
      • cmakelists.txt
      • package.xml
    • ...
    • pkg_n
      • cmakelists.txt
      • package.xml

2.3 在工作空间中创建程序包

cd ~/catkin_ws/src
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
  • 最后一个命令用于创建名为beginner_tutorials的新程序包,这个程序包依赖于std _msgs、roscpp和rospy这几个程序包
  • 执行后在src目录下看到beginner_tutorials文件夹,里面包含一个package.xml文件和一个cmakelist,这两个文件已自动包含了之前在命令中规定的依赖关系
  • catkin_create_pkg 格式:
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

2.4 程序包的依赖关系

- 一级依赖

(注意要先将当前工作空间的路径添加到环境变量中,即前面提到的source命令,这样之后执行rospack命令才不会报错提示找不到beginner_tutorials这个包)

rospack depends1 beginner_tutorials

输出结果

std_msgs
rospy
roscpp
- 间接依赖

对于程序包a的一级依赖程序包b,其自身也依赖一些其它的程序包c,这些程序包c是a的间接依赖

rospack depends1 rospy

可看到rospy的一级依赖

rospack depend beginner_tutorials

递归检测出a的所有的依赖包(包括一级和间接)

2.5 编译程序包

用catkin_make,可认为是在cmake标准工作流程中依次调用了cmake和make

在工作空间中使用catkin_make
在工作空间的根目录下,输入

catkin_make

该命令会编译位于目录 catkin_ws/src 中的所有程序包

更多关于catkin_ make的资料:


3. 用实际例子理解节点和话题

每个节点是一个可执行文件

节点之间通过话题来通信

  • 比如一个遥控器节点和一个机器人节点,二者通过话题command来通信,遥控器节点发布信息到command话题中,机器人节点订阅command话题从而接收到遥控器节点发布的信息

使用rosrun

rosrun ros_pkg ros_pkg_node
  • 该命令用于运行某个ros程序包中的某个节点

使用rosnode list

rosnode list
  • 该命令可以列出当前活跃的所有节点
  • rosnode help 列出可选的命令参数

使用rostopic echo

rostopic echo [topic]
  • 该命令可以显示在某个话题上发布的信息
  • rostopic help 列出可选的命令参数

使用rqt_graph

rosrun rqt_graph rqt_graph
  • 打开rqt_graph 可以观察到目前有哪些节点在通过什么话题来通信

使用rqt_plot

rosrun rqt_plot rqt_plot
  • 可以实时显示一个发布到某个话题上的数据变化图形

turtlesim模拟器的使用

首先运行turtlesim包中的turtlesim_node节点[海龟本体]

rosrun turtlesim turtlesim_node

另外打开一个终端

  • 可以通过键盘来控制turtle [运行一个控制海龟的节点]
rosrun turtlesim turtle_teleop_key

在新终端中打开rqt_graph,可观察到这两个节点通过话题cmmd _vel来通信

rosrun rqt_graph rqt_graph
  • 也可以通过手动发布消息到话题上来控制turtle

在新终端中, 列出当前的topic

rostopic list

列出该话题的消息类型

rostopic type /turtle1/cmd_vel

列出该消息类型的详细数据类型

rosmsg show geometry_msgs/twist

发布消息到话题cmd_vel,告诉turtlesim _node,使其以2.0大小的线速度和1.8大小的角速度移动

rostopic pub -1 /turtle1/cmd_vel geometry_msgs/twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

命令中的-1表示rostopic发布一条信息后马上退出,也可以设置为循环发送:

rostopic pub /turtle1/cmd_vel geometry_msgs/twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

该信息以1hz的稳定频率来发送,使turtle保持移动状态

这时可以观察rqt_graph

发现多了一个节点:rostopic发布器节点,同样地,该节点与turtlesim_node节点[海龟本体] 通过话题cmd _vel通信


roslaunch的使用

使用roslaunch同时运行多个节点,通过编写launch文件来配置各个节点

以turtlesim为例

首先保证环境变量中是否有catkin_ws工作空间的路径

echo $ros_package_path

若无,则进入该工作空间的根目录,执行

source devel/setup.bash

之后在任意目录下都可以进入之前创建的程序包

roscd beginner_tutorials

新建launch文件夹,在里面创建launch文件

mkdir launch
gedit turtlemimic.launch

拷贝以下launch文件的内容:
http://wiki.ros.org/cn/ros/tutorials/usingrqtconsoleroslaunch


roscpp

ros编写消息发布器和订阅器

相关api格式

更详细的解释

[http://wiki.ros.org/cn/ros/tutorials/writingpublishersubscriber(c%2b%2b)]