1. ROS文件系统和软件包简介

1、ROS文件系统

(1)功能包集(stack)

         将几个具有某种功能的包组织在一起,就是一个功能包集,在ROS 系统中,存在大量不同用途的功能包集,例如导航功能包集。

(2) 软件包(Packages)

         ROS应用程序代码组织单元,每个软件包都可以包含程序库、可执行文件、脚本、或其他手动创建的东西。

(3) 清单文件(package.xml)

         关于“软件包”相关信息的描述,用于定义软件包相关元信息之间的依赖关系,这些信息包括版本、维护者和许可协议等。

 (4)编译配置文件(CMakeLists.txt)

      使用cmake进行程序编译时,会根据CMakeLists.txt这个文件进行一步步处理,然后形成一个MakeFile文件,系统再通过这个文件设置进行程序编译。

2、文件系统工具

rospack:获取软件包的有关信息

rospack list:列出软件包以及路径

rospack list|grep cpp:过滤查找关键字的软件包并列出路径

roscd:直接切换到某个软件包或者软件包集中

rosls:直接按软件包名称而不是绝对路径执行ls命令

Tab补全

rosed:直接编辑某个软件包中的可编辑的文件//软件包得直接包含可执行文件

$rosed grid_map_visualization  GridMapVisualizationHelpers.cpp

roscp:直接从某个软件包中复制某个文件到指定目录下

$roscp  voice_system xf_tts.cpp .

$cp catkin_ws/src/voice _system/src/xf_tts.cpp .

把voice_system软件包下的xf_tts.cpp复制到当前目录下

3、创建和编辑ROS 软件包

(1)创建软件包

 在我们写任何程序之前,第一步是创建一个容纳我们的软件包工作区,然后再创建软件包本身。

   a、创建工作空间

 创建的工作区是一个文件夹,用于存储我们的软件包,可以任意命名,任意选择存储在home目录下。

$ mkdir  -p ros_workspace/src
  $tree   ros_workspace
  $tree rosworkspace/

 注:即使没有软件包,空的工作空间也可以编译,会在当前目录下生成build和level目录

$cd rosworkspace
$catkin_make

  对于很多用户,没必要使用多个ROS 工作区,但是ROS下的catkin编译系统,试图一次性编译同一工作区的所有功能包,因此涉及大量功能包或者独立项目时。维护多个工作区是必要的。

    b、创建软件包

    创建一个新的ROS软件包的命令应该再你的工作区的src目录下运行。   

$cd  rosworkspace/src
$catkin_create_pkg  test_pkg  std_msgs  rospy  roscpp

  (2)程序包的依赖关系

       a、一级依赖:在使用catkin_create_pkg命令时提供了几个程序包作为依赖包,现在我们可以使用rospack命令工具来查看一级依赖包。  

 $ rospack depends1 test_pkg
 package src
wtj@wtj:~/rosworkspace$ source devel/setup.bash
wtj@wtj:~/rosworkspace$ rospack depends1 test_pkg
roscpp
rospy
std_msgs

   

当新创建了工作空间时,ROS知道该空间的环境变量才能定位到该空间下的软件包,因此,为了方便每次打开终端都自动配置环境,需要再home目录下的.bashrc文件最下面添加如下信息:

source /opt/ros/kinetic/setup.bash    //系统空间下的环境变量

source   ~/rosworkspack/devel/setup.bash  //工作空间下的环境变量

rospack列出了运行在catkin_create_pkg命令时作为参数的依赖包,这些依赖包随后保存再package.xml文件中。

 b、间接依赖:在很多情况下,一个依赖包还会有它自己的依赖包,比如,rospy还有其他依赖包。

$ rospack  depends  test_pkg
wtj@wtj:~/rosworkspace$ rospack depends test_pkg
cpp_common
rostime
roscpp_traits
roscpp_serialization
catkin
genmsg
genpy
message_runtime
gencpp
geneus
gennodejs
genlisp
message_generation
rosbuild
rosconsole
std_msgs
rosgraph_msgs
xmlrpcpp
roscpp
rosgraph
rospack

注意:ROS包的命名遵循一个命名规范,只允许使用小写字母、数字和下划线,而且首字符必须是一个小写字母,一些ROS工具,包括catkin,不支持不遵循此命名规范的包。

(3)删除工作空间的软件包

删除不想要的工作空间的软件包,直接rm  -rf整个软件包目录即可,然后重新编译整个工作空间。

wtj@wtj:~/rosworkspace/src$ rm -rf test_pkg   //删除软件包

wtj@wtj:~/rosworkspace/src$ ls

CmakeLists.txt

wtj@wtj:~/rosworkspace/src$ cd ..

wtj@wtj:~/rosworkspace$ catkin_make     //重新编译

(4)编写测试代码

为了演示如何正确的编译软件包,我们需要在测试软件包test_pkg中编写一个测试代码才能演示如何编译软件包。

在test_pkg 包下的src中新建test.cpp并编辑

测试代码含义,创建一个话题,并向其中发送hello world字段。

$cd src

$touch test.cpp

$vim  test.cpp

#include"ros/ros.h"
#include"std_msgs/String.h"
#include"sstream"

int main(int argc,char **argv)
{
   ros::init(argc,argv,"talker");
   ros::NodeHandle n;

   ros::Publisher chatter_pub=n.advertise("chatter",1000);
   ros::Rate loop_rate(10);
   int count =0;

   while(ros::ok())
   {
     std_msgs::String msg;
     std::stringstream ss;

     ss<<"hello word"<< count;
     msg.data=ss.str();

     ROS_INFO("%s",msg.data.c_str());
     chatter_pub.publish(msg);

     ros::spinOnce();
     loop_rate.sleep();
     ++count;
   }

return 0;
}

(5)编译软件包

主要修改CMakeList.txt这个配置文件。

你可能感兴趣的:(ros)