ROS
目录
1. 文件系统
-
**软件包(Packages):**包是ROS代码的软件组织单元,每个软件包都可以包含程序库、可执行文件、脚本或其他构件。
-
Manifests (package.xml): 清单(Manifest)是对软件包的描述。它用于定义软件包之间的依赖关系,并记录有关软件包的元信息,如版本、维护者、许可证等。
$ rospack find [package_name] $ roscd [locationname[/subdir]] $ pwd //输出工作目录 $ roscd log //进入存储ROS日志文件的目录 $ rosls [locationname[/subdir]] //直接执行ls命令 <<<按TAB键>>> //补全
2. ROS程序包
2.1 概述
一个catkin包(软件包、功能包
- 这个包必须有一个符合catkin规范的package.xml文件
- 这个
package.xml
文件提供有关该软件包的元信息
- 这个
- 这个包必须有一个catkin版本的CMakeLists.txt文件,编译相关信息
- 如果它是个Catkin元包的话,则需要有一个
CMakeList.txt
文件的相关样板
- 如果它是个Catkin元包的话,则需要有一个
- 每个包必须有自己的目录
- 这意味着在同一个目录下不能有嵌套的或者多个软件包存在
2.2 开发:使用catkin工作空间
workspace_folder/ -- WORKSPACE
src/ -- SOURCE SPACE
CMakeLists.txt -- 'Toplevel' CMake file, provided by catkin
package_1/
CMakeLists.txt -- CMakeLists.txt file for package_1
package.xml -- Package manifest for package_1
...
package_n/
CMakeLists.txt -- CMakeLists.txt file for package_n
package.xml -- Package manifest for package_n
创建工作空间在创建功能包,一定要注意环境变量的生效
$ rospack depends1 beginner_tutorials //查看依赖包
$ roscd beginner_tutorials
$ cat package.xml //将文件在屏幕上显示
2.3 自定义软件包
2.3.1 自定义package.xml
- description标签
- maintainer标签
- licenese标签:BSD MIT GPLv2 GPLv3 LGPLv2 LGPLv3
- 依赖项标签
除了catkin中默认提供的buildtool_depend
,所有我们列出的依赖包都已经被添加到build_depend
标签中。在编译和运行时都需要用到所有指定的依赖包,要将每一个依赖包分别添加到run_depend
标签中
12 <buildtool_depend>catkin</buildtool_depend>
13
14 <build_depend>roscpp</build_depend>
15 <build_depend>rospy</build_depend>
16 <build_depend>std_msgs</build_depend>
17
18 <exec_depend>roscpp</exec_depend>
19 <exec_depend>rospy</exec_depend>
20 <exec_depend>std_msgs</exec_depend>
2.3.2 自定义CMakeLists.txt
2.4 编译软件包
$ source /opt/ros/<distro>/setup.bash //各种环境生效
$ mkdir build //cmake工作流程
$ cd build
$ cmake ..
$ make
$ make install # (可选
使用catkin_make工具:在标准CMake工作流程中依次调用了cmake
和make
# 在catkin工作空间下
$ catkin_make --source my_src
$ catkin_make install --source my_src # (可选)
catkin_make首先输出它所使用到的每个空间所在的路径
build
目录是构建空间的默认位置,同时cmake
和make
也是在这里被调用来配置和构建你的软件包。而devel
目录是开发空间的默认位置, 在安装软件包之前,这里可以存放可执行文件和库。
3. ROS节点
计算图(Computation Graph)是一个由ROS进程组成的点对点网络,它们能够共同处理数据。ROS的基本计算图概念有节点(Nodes)、主节点(Master)、参数服务器(Parameter Server)、消息(Messages)、服务(Services)、话题(Topics)和袋(Bags),它们都以不同的方式向图(Graph)提供数据
-
节点(Nodes):节点是一个可执行文件,它可以通过ROS来与其他节点进行通信。
-
消息(Messages):订阅或发布话题时所使用的ROS数据类型。
-
话题(Topics):节点可以将消息发布到话题,或通过订阅话题来接收消息。
-
主节点(Master):节点管理器,ROS的命名服务,例如帮助节点发现彼此。
-
rosout:在ROS中相当于
stdout/stderr(标准输出/标准错误)
。 -
roscore:主节点 + rosout + [参数服务器](https://wiki.ros.org/Parameter Server)(会在以后介绍)
roscore
是你在运行所有ROS程序前首先要运行的命令 -
客户端库
- rospy = Python客户端库
- roscpp = C++客户端库
-
rosnode:
rosnode
显示当前正在运行的ROS节点信息。rosnode list
命令会列出这些活动的节点 -
rosrun:直接运行包内的节点
-
ROS有一个强大的功能,就是你可以通过命令行重新分配名称
4.ROS话题
4.1 ros topic
使用rqt_graph来显示当前运行的节点和话题,rqt_graph
用动态的图显示了系统中正在发生的事情
$ sudo apt-get install ros-<distro>-rqt
$ sudo apt-get install ros-<distro>-rqt-common-plugins
$ rosrun rqt_graph rqt_graph //下载完之后开新终端
rostopic
命令工具能让你获取ROS话题的信息
$ rostopic -h
Commands:
rostopic bw display bandwidth used by topic
rostopic delay display delay of topic from timestamp in header
rostopic echo print messages to screen
rostopic find find topics by type
rostopic hz display publishing rate of topic
rostopic info print information about active topic
rostopic list list active topics
rostopic pub publish data to topic
rostopic type print topic or field type
$ rostopic list -v //在rostopic list中使用verbose选项:
4.2 ros message
使发布者(turtle_teleop_key
)和订阅者(turtulesim_node
)进行通信,发布者和订阅者必须发送和接收相同类型的消息,话题的类型是由发布在它上面消息的类型决定
rostopic type [topic] //rostopic type命令用来查看所发布话题的消息类型
$ rostopic type /turtle1/cmd_vel
geometry_msgs/Twist
$ rosmsg show geometry_msgs/Twist //rosmsg查看消息的详细信息
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
rostopic pub //可以把数据发布到当前某个正在广播的话题上
$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]' //以1 Hz的速度发布velocity指令到velocity话题上
rostopic hz [topic] //报告数据发布的速率
$ rosrun rqt_plot rqt_plot //绘制正被发布到话题上的数据,用来调试
5. ROS服务和参数
5.1 rosservice
服务(Services)是节点之间通讯的另一种方式。服务允许节点发送一个请求(request)并获得一个响应(response)
list 输出活跃服务的信息
rosservice call 用给定的参数调用服务
rosservice type 输出服务的类型
rosservice find 按服务的类型查找服务
rosservice uri 输出服务的ROSRPC uri
5.2 rosparam
rosparam
能让我们在ROS[参数服务器(Parameter Server)](https://wiki.ros.org/Parameter Server)上存储和操作数据。参数服务器能够存储整型(integer)、浮点(float)、布尔(boolean)、字典(dictionaries)和列表(list)等数据类型。rosparam使用YAML标记语言的语法。一般而言,YAML的表述很自然:1
是整型,1.0
是浮点型,one
是字符串,true
是布尔型,[1, 2, 3]
是整型组成的列表,{a: b, c: d}
是字典。rosparam
有很多命令可以用来操作参数,如下所示:
rosparam set 设置参数
rosparam get 获取参数
rosparam get / //来显示参数服务器上的所有内容:
rosparam load 从文件中加载参数
rosparam dump 向文件中转储参数
rosparam delete 删除参数
rosparam list 列出参数名
rosparam dump [file_name] [namespace] ///我们将所有的参数写入params.yaml文件
rosparam load [file_name] [namespace] //yaml文件重载入新的命名空间