安装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键,大家多多练习。