ROS 常用命令(ROS虽好,只是比较费终端)

前提条件:
安装小乌龟模拟器:
$ sudo apt-get install ros-<<kinetic>>-ros-tutorials
请使用ROS发行版名称(比如 electric、fuerte、groovy、hydro、indigo、kinetic、melodic)替换掉。

a. 文件系统工具

  • rospack = ros+pack(age) : provides information related to ROS packages
  • rosstack = ros+stack : provides information related to ROS stacks
  • roscd = ros+cd : changes directory to a ROS package or stack
  • rosls = ros+ls : lists files in a ROS package
  • roscp = ros+cp : copies files from/to a ROS package
  • rosmsg = ros+msg : provides information related to ROS message definitions
  • rossrv = ros+srv : provides information related to ROS service definitions
  • rosmake = ros+make : makes (compiles) a ROS package

b. 工作空间

$ source /opt/ros/kinetic/setup.bash
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make
$ source devel/setup.bash
$ echo $ROS_PACKAGE_PATH

一个简单的工作空间也许看起来像这样:

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

c. 程序包

$ cd ~/catkin_ws/src
# 现在使用catkin_create_pkg命令来创建一个名为'beginner_tutorials'的新程序包,这个程序包依赖于std_msgs、roscpp和rospy:
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
# 一级依赖
$ rospack depends1 beginner_tutorials
# 间接依赖
$ rospack depends1 rospy

d. 编译

$ cd ~/catkin_ws/
$ catkin_make
# build 目录是build space的默认所在位置,同时cmake 和 make也是在这里被调用来配置并编译你的程序包。devel 目录是devel space的默认所在位置, 同时也是在你安装程序包之前存放可执行文件和库文件的地方。

1. 图概念概述:
Nodes:节点,一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信。
Messages:消息,消息是一种ROS数据类型,用于订阅或发布到一个话题。
Topics:话题,节点可以发布消息到话题,也可以订阅话题以接收消息。
Master:节点管理器,ROS名称服务 (比如帮助节点找到彼此)。
rosout: ROS中相当于stdout/stderr。
roscore: 主机+ rosout + 参数服务器 (参数服务器会在后面介绍)。

2. 节点
#roscore运行所有ROS程序前首先要运行的命令。
$ roscore
#rosnode 显示当前运行的ROS节点信息。
$ rosnode -h
Commands:

rosnode ping test connectivity to node
rosnode list list active nodes
rosnode info print information about node
rosnode machine list nodes running on a particular machine or list machines
rosnode kill kill a running node
rosnode cleanup purge registration information of unreachable nodes

#rosrun 允许你使用包名直接运行一个包内的节点(而不需要知道这个包的路径)。
格式:rosrun [package_name] [node_name]
例子:

# 启动小乌龟
$ rosrun turtlesim turtlesim_node
# 自定义节点名
$ rosrun turtlesim turtlesim_node __name:=my_turtle
# 通过键盘远程控制小乌龟
$ rosrun turtlesim turtle_teleop_key

3. 话题
rostopic命令工具能让你获取有关ROS话题的信息。
$ rostopic -h
Commands:

rostopic bw display bandwidth used by topic
rostopic delay display delay of topic from timestamp in header
rostopic echo echo可以显示在某个话题上发布的数据。
rostopic find find可以查找某个话题
rostopic hz hz命令可以用来查看数据发布的频率。
rostopic info info可以打印话题的信息
rostopic list list能够列出所有当前订阅和发布的话题。
rostopic pub pub可以把数据发布到当前某个正在广播的话题上。
rostopic type type 命令用来查看所发布话题的消息类型。
例子:
# 发布数据到话题
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
# 以上命令会发送一条消息给turtlesim,告诉它以2.0大小的线速度和1.8大小的角速度开始移动。
$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
# 这条命令以1Hz的频率发布速度命令到速度话题上。

4. rqt程序包
4.1 rqt_graph能够创建一个显示当前系统运行情况的动态图形。
安装:
$ sudo apt-get install ros–rqt
$ sudo apt-get install ros–rqt-common-plugins

命令:
$ rosrun rqt_graph rqt_graph

如果你将鼠标放在/turtle1/command_velocity(kinetic版为/turtle1/cmd_vel)上方,相应的ROS节点(蓝色和绿色)和话题(红色)就会高亮显示。正如你所看到的,turtlesim_node和turtle_teleop_key节点正通过一个名为 /turtle1/command_velocity的话题来互相通信。

4.2 rqt_plot命令可以实时显示一个发布到某个话题上的数据变化图形。
命令:
$ rosrun rqt_plot rqt_plot

5. 消息
rosmsg命令来查看消息的详细情况
$ rosmsg show geometry_msgs/Twist
$ rostopic type /turtle1/cmd_vel | rosmsg show

6. 服务
服务(services)是节点之间通讯的另一种方式。服务允许节点发送请求(request) 并获得一个响应(response)。
rosservice可以很轻松的使用 ROS 客户端/服务器框架提供的服务。

rosservice list 输出可用服务的信息
rosservice call 调用带参数的服务
rosservice type 输出服务类型
rosservice find 依据类型寻找服务find services by service type
rosservice uri 输出服务的ROSRPC uri

例子:

$ rosservice list
# 重置(reset), 清除(clear), 再生(spawn), 终止(kill)
# 看看clear服务的类型:
$ rosservice type clear
# std_srvs/Empty说明不需要参数,可以进行无参数调用
$ rosservice call clear
# 效果服务清除了turtlesim_node的背景上的轨迹。
# 查看再生(spawn)服务的信息,我们来了解带参数的服务:
$ rosservice type spawn| rossrv show
# 这个服务使得我们可以在给定的位置和角度生成一只新的乌龟。
$ rosservice call spawn 2 2 0.2 ""

7. 参数
rosparam使得我们能够存储并操作ROS 参数服务器(Parameter Server)上的数据。参数服务器能够存储整型、浮点、布尔、字符串、字典和列表等数据类型。rosparam使用YAML标记语言的语法。一般而言,YAML的表述很自然:1 是整型, 1.0 是浮点型, one是字符串, true是布尔, [1, 2, 3]是整型列表, {a: b, c: d}是字典. rosparam有很多指令可以用来操作参数

rosparam set 设置参数
rosparam get 获取参数
rosparam load 从文件读取参数
rosparam dump 向文件中写入参数
rosparam delete 删除参数
rosparam list 列出参数名
例子:
# 列出参数名
$ rosparam list
# 修改背景颜色的红色通道:
$ rosparam set background_r 150
# 调用清除服务使得修改后的参数生效:
$ rosservice call clear
# 获取背景的绿色通道的值:
$ rosparam get background_g
# 显示参数服务器上的所有内容:
$ rosparam get /
# 将所有的参数写入params.yaml文件:
$ rosparam dump params.yaml
# 将yaml文件重载入新的命名空间,比如说copy空间:
$ rosparam load params.yaml copy

8. 日志

# rqt_console属于ROS日志框架(logging framework)的一部分,用来显示节点的输出信息。
$ rosrun rqt_console rqt_console
# rqt_logger_level允许我们修改节点运行时输出信息的日志等级(logger levels)(包括 DEBUG、WARN、INFO和ERROR)。
$ rosrun rqt_logger_level rqt_logger_level
# 命令行设置日志级别
$ rosservice call /node_name/set_logger_level ros.package_name DEBUG

9. roslaunch
# 先切换到beginner_tutorials程序包目录下:
$ roscd beginner_tutorials
$ mkdir launch
$ cd launch
# 创建turtlemimic.launch文件,内容如下

# 运行launch文件
$ roslaunch beginner_tutorials turtlemimic.launch

10. 消息和服务

msg文件存放在package的msg目录下,srv文件则存放在srv目录下。

msg文件实际上就是每行声明一个数据类型和变量名。可以使用的数据类型如下:

  • int8, int16, int32, int64 (plus uint*)
  • float32, float64
  • string
  • time, duration
  • other msg files
  • variable-length array[] and fixed-length array[C]
rosmsg show Show message description
rosmsg info Alias for rosmsg show
rosmsg list List all messages
rosmsg md5 Display message md5sum
rosmsg package List messages in a package
rosmsg packages List packages that contain messages
rossrv show Show service description
rossrv info Alias for rossrv show
rossrv list List all services
rossrv md5 Display service md5sum
rossrv package List services in a package
rossrv packages List packages that contain services

例子:

#~/catkin_ws/src/beginner_tutorials/msg/Num.msg
int64 num
# ~/catkin_ws/src/beginner_tutorials/srv/AddTwoInts.srv
# srv 文件copy自其他包
# roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
# srv文件分为请求和响应两部分,由'---'分隔。样例如下

int64 a
int64 b
---
int64 sum

新建msg或srv后,对package.xml和CMakeLists.txt进行修改:

package.xml文件
#确保msg文件被转换成为C++,Python和其他语言的源代码:

  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>

CMakeLists.txt文件

# 利用find_packag函数,增加对message_generation的依赖,这样就可以生成消息了。
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)
# 利用catkin_package函数,确保你设置了运行依赖。
catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)
# add_message_files 添加msg文件
add_message_files(
  FILES
  Num.msg
)
# add_service_files 添加srv文件
add_service_files(
  FILES
  AddTwoInts.srv
)

11. 录制与回放数据

rosbag check Determine whether a bag is playable in the current system, or if it can be migrated.
rosbag compress Compress one or more bag files.
rosbag decompress Decompress one or more bag files.
rosbag filter Filter the contents of the bag.
rosbag fix Repair the messages in a bag file so that it can be played in the current system.
rosbag help
rosbag info Summarize the contents of one or more bag files.
rosbag play Play back the contents of one or more bag files in a time-synchronized fashion.
rosbag record Record a bag file with the contents of specified topics.
rosbag reindex Reindexes one or more bag files.

栗子:

# 如前,启动小王八
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
# 录制所有话题
rosbag record -a
# 或者录制指定话题
rosbag record -O subset /turtle1/cmd_vel /turtle1/pose
# turtle_teleop_key界面动动小王八
# 播放bag文件例的数据
rosbag play *.bag

参考:
ROS文件系统介绍
创建一个工作空间
创建ROS程序包
编译ROS程序包
理解ROS节点
理解ROS话题
理解ROS服务和参数
使用rqt_console 和 roslaunch
创建ROS消息和ROS服务
录制与回放数据