安装ros-tutorials功能包

这一步是我们后续操作的前提,因为我们后续的学习内容都是在这个功能包上进行演示的,所以,这里我们先安装ros-tutorials功能包:

sudo apt-get install ros-kinetic-ros-tutorials

快速预览ros文件系统的概念

Packages:是ROS编程中程序的组织单元,每一个功能包都包含:库(libraries),可执行文件(executables),脚本(scripts)或者一些其他的东西。

Manifests(package.xml):package.xml是用来描述一个功能包(package)的,它用于定义功能包之间的依赖,以及获取关于功能包的版本、维护者和许可证等元信息。

文件系统的工具

由于ros编程中,代码是分布在多个功能包中的,由于使用Ubuntu系统提供的ls和cd等命令在多个功能包之间来回切换非常的麻烦和枯燥,因此,ros系统为用户提供了相关的命令工具,用户在编程的时候可以轻易地在多个功能包之间来回切换。

首先,我们需要介绍的是rospack命令,该命令会返回某个功能包存放位置的完整路径:

rospack find [package_name]

例如:

rospack find roscpp

输出的结果为:

liuqiang@liuqiang-pc:~$ rospack find roscpp
/opt/ros/kinetic/share/roscpp

接着,我们需要介绍的是roscd命令,该命令允许用户直接切换到某个功能包:

roscd [package_name[/subdir]]

例如:

roscd roscpp

输出结果为:

liuqiang@liuqiang-pc:~$ roscd roscpp
liuqiang@liuqiang-pc:/opt/ros/kinetic/share/roscpp$ 

或者:

roscd roscpp/srv

输出结果为:

liuqiang@liuqiang-pc:~$ roscd roscpp/srv
liuqiang@liuqiang-pc:/opt/ros/indigo/share/roscpp/srv$ 

显示当前终端下的路径:

pwd

输出结果为:

liuqiang@liuqiang-pc:/opt/ros/indigo/share/roscpp/srv$ pwd
/opt/ros/indigo/share/roscpp/srv

其实,pwd 就是把:$之间的路径打印出来。

注意:roscd只能切换到包含在ROS_PACKAGE_PATH路径下的功能包。

还记得我们之前用到过的一个命令吗?

echo $ROS_PACKAGE_PATH

没错,就是输出当前添加过的环境变量路径。

roscd命令中,我们使用echo输出ROS_PACKAGE_PATH:

echo $ROS_PACKAGE_PATH

输出的结果为:

liuqiang@liuqiang-pc:~$ roscd roscpp
liuqiang@liuqiang-pc:/opt/ros/kinetic/share/roscpp$ echo $ROS_PACKAGE_PATH
/home/liuqiang/ros_ws/src:/opt/ros/kinetic/share:/opt/ros/kinetic/stacks

然后,我们使用roscd log切换到ROS存储日志的文件夹中,注意:如果你还没有运行任何的ROS程序,那么该命令将输出一个错误,提示日志文件夹不存在。

首先在一个终端中打开节点管理器:

roscore

这里,我的机器上的roscd log输出为:

liuqiang@liuqiang-pc:~$ roscd log
liuqiang@liuqiang-pc:~/.ros/log/45821fc8-b151-11e7-ad43-30b49e59a135$ pwd
/home/liuqiang/.ros/log/45821fc8-b151-11e7-ad43-30b49e59a135

最后,就是使用rosls命令了,该命令的作用就是列出该功能包或者其子目录下的目录和文件名,其命令的格式为:

rosls [package_name/subdir]

例如:

rosls ros_tutorials

输出的结果为:

liuqiang@liuqiang-pc:~$ rosls roscpp_tutorials
cmake  launch  package.xml  srv

Tab补全功能

其作用就是输出冗长乏味的功能包的全称,比如前面我们用到过的一个功能包ros_tutorials,名字还是比较长的,ROS提供了Tab键补全的功能。

具体的用法如下:

roscd roscpp_tut[此时,按下键盘的Tab键]

补全的结果为:

liuqiang@liuqiang-pc:~$ roscd roscpp_tutorials/

上面之所以补全了,是因为当前的ROS_PACKAGE_PATH目录下的功能包中,以roscpp_tut开头的功能包只有roscpp_tutorials,所以按下Tab键,就能够补全功能包的名称。

现在,我们再来试一下:

roscd tur[此时,按下键盘的Tab键]

输出的结果为:

liuqiang@liuqiang-pc:~$ roscd turtle

然而,此时以turtle开头的功能包不止一个,试着再一次按下键盘的Tab键,这一次,终端上将会显示出所有ROS_PACKAGE_PATH中以turtle开头的功能包的全称。

比如,此时我的机器上的输出结果为:

liuqiang@liuqiang-pc:~$ roscd turtle
turtle_actionlib/               turtlebot_interactive_markers/
turtlebot/                      turtlebot_msgs/
turtlebot_actions/              turtlebot_navigation/
turtlebot_apps/                 turtlebot_rapps/
turtlebot_bringup/              turtlebot_rviz_launchers/
turtlebot_calibration/          turtlebot_simulator/
turtlebot_capabilities/         turtlebot_stage/
turtlebot_dashboard/            turtlebot_stdr/
turtlebot_description/          turtlebot_teleop/
turtlebot_follower/             turtlesim/
turtlebot_gazebo/               turtle_tf/
turtlebot_interactions/         turtle_tf2/

接着继续输入sim并按下Tab键

liuqiang@liuqiang-pc:~$ roscd turtlesim/
turtlesim/cmake/   turtlesim/images/  turtlesim/msg/     turtlesim/srv/

总结回顾

在这一节里面,我们学习了

rospack [package_name] # 返回功能包存放位置的完整路径
roscd [package_name/subdir] # 切换到功能包或者功能包的子目录
rosls [package_name/subdir] # 列出指定功能包下的目录和文件名

我们还学习了一个重要的功能,那就是用好Tab键,用好Tab键,大家多多练习。