第一个hello ros程序

1  设置环境变量

      在用户权限下输入以下命令

      

       每次启动一个新的shell,且要在这个shell中运行ROS时,只要运行上述source命令,ROS就能顺利工作。

      但是切换用户或者新建一个shell时,且要继续运行ros时,需要多次输入source命令,过于重复

      为了解决上述弊端,为每个用户的.bashrc文件添加上述指令

      .bashrc  这个文件主要保存个人的一些个性化设置,如命令别名、路径等。也即在同一个服务器上,只对某个用户的个性化设置相关。~/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。这个文件是用户目录下的隐藏文件,通过ls -a才能显示。使用vim命令打开.bashrc文件。在文件最后一行输入source命令。按esc退出插入模式,输入:wq退出vim。此时,任意打开一个shell,只要用户名是设置过的,如本例中的用户a,那么都可以直接执行ros相关命令

      

      

       

      


2 创建第一个小程序

2.1  创建工作区

        使用mkdir命令去创建一个目录,称之为工作区目录;

        创建工作区目录下的src文件夹,用于存放功能包的源代码

                  

2.2 创建功能包

       使用命令catkin_create_pkg创建一个在src下的功能包ling

    

       可见,在src目录下多了一个文件夹ling,同时,在ling文件夹中又多了2个配置文件;

       第一个配置文件,叫做package.xml,即清单文件;

       第二个文件,叫做CMakeLists.txt,是一个Cmake的脚本文件,Cmake是一个符合工业标准的跨平台编译系统。这个文件包含了一系列的编译指令,包括应该生成哪种可执行文件,需要哪些源文件,以及在哪里可以找到所需的头文件和链接库。当然,这个文件表明catkin在内部使用了Cmake。

  

2.3 编写hello.cpp文件

      在ling目录下,使用命令vim hello.cpp新建一个cpp文件,同时添加以下内容,退出保存(esc->:wq)

  

  ros::init函数初始化ROS客户端库。请在你程序的起始处调用一次该函数3。函数最后的参数是一个包含节点默认名的字符串。

  ros::NodeHandle(节点句柄)对象是你的程序用于和ROS系统交互的主要机制4。创建此对象会将你的程序注册为ROS节点管   理器的节点。最简单的方法就是在整个程序中只创建一个NodeHandle对象。

  ROS_INFO_STREAM宏将生成一条消息,且这一消息被发送到不同的位置,包括控制台窗口。

  此时可以发现文件夹ling下有3个文件

 

2.4 编译hello程序

2.4.1 声明依赖库

       首先,我们需要声明程序所依赖的其他功能包。对于c++程序而言,此步骤是必要的,以确保catkin能够向c++编译
器提供合适的标记来定位编译功能包所需的头文件和链接库。

    编辑包目录下的CMakeLists.txt文件。该文件的默认版本含有如下行:find_package(catkin REQUIRED)

    

     所依赖的其他catkin包可以添加到这一行的COMPONENTS关键字后面,如下所示:

                     find_package(catkin REQUIRED COMPONENTS package-names)

     对于hello例程,我们需要添加名为roscpp的依赖库,它提供了ROS 的C++客户端库。因此,修改后的find_package行如下所示:find_package(catkin REQUIRED COMPONENTS roscpp)

  

      我们同样需要在包的清单文件中列出依赖库,通过使用build_depend (编译依赖)和run_depend(运行依赖)两个关键字实现:
                                             <build_depend>package-name</build_depend>
                                             <run_depend>package-name</run_depend>

   打开package.xml文件后,找到文件偏下方的绿色字体<buildtool_depend>catkin</buildtoo;_depend>,在其后添加我们的依赖库

   

       在清单文件中声明的依赖库并没有在编译过程中用到;如果你在此处忽略它们,你可能不会看到任何错误消息,直到发布你的包给其他人,他们可能在没有安装所需包的情况下编译你发布的包而导致报错。

2.4.2 声明可执行文件

       在CMakeLists.txt中添加两行,来声明我们需要创建的可执行文件。其一般形式是:
                                         add_executable(executable-name source-files)
                                          target_link_libraries(executable-name ${catkin_LIBRARIES})

       第一行声明了我们想要的可执行文件的文件名,以及生成此可执行文件所需的源文件列表。如果你有多个源文件,把它们列在此处,并用空格将其区分开

        第二行告诉Cmake当链接此可执行文件时需要链接哪些库(在上面的find_package中定义)。如果你的包中包括多个可执行文件,为每一个可执行文件复制和修改上述两行代码。

      在我们的例程中,我们需要一个名为hello的可执行文件,它通过名为hello.cpp的源文件编译而来。所以我们需要添加如下几行代码到CMakeLists.txt中。注意:在CMakeLists.txt文件中有很多注释和例句,找到对应的例句,在其下方输入我们要求的命令,保存退出

   

2.4.3 编译工作区

   使用下列命令在工作区目录下编译包中所有的可执行文件 :catkin_make

  

   执行结果如下表示成功

  

  如果出现编译出错,找不到ros头文件,错误截图如下 

 

  此错误说明未正确包含头文件,即是CMakeLists.txt文件出错,2个原因

   第一个原因是依赖项未正确声明,以下是正确声明(find_package部分)

  

   第二个原因是未包含头文件路径,即在CMakeLists.txt文件中错误示例如下

  

 注意看绿色线段标明的一行,此行是包含头文件路径的命令行,此处是用#注释掉的,即没有包含,去掉前面的#号即可成功编译

2.4.4   执行脚本文件

        执行名为setup.bash的脚本文件,它是catkin_make在你工作区的devel子目录下生成的。source devel/setup.bash。这个自动生成的脚本文件设置了若干环境变量,从而使ROS能够找到你创建的功能包和新生成的可执行文件。。它类似于1.1节介绍的全局setup.bash,但是是专门为你的工作区量身定做的。除非目录结构发生变化,否则你只需要在每个终端执行此命令一次,即使你修改了代码并且用catkin_make执行了重编译。为了使rosrun命令可以随时找到你自己编写的包,可以仿照1.1节将source语句添加到用户的.bashrc

     

2.5 执行hello程序

      当所有这些编译步骤完成后,新的ROS程序就可以使用rosrun来执行,就像任何其他ROS程序一样。

      但是注意:任何ros程序在执行前都要保证roscore在运行

如果没有运行节点管理器roscore,那么就会报错,如下


3 补充内容

3.1  source filename 与 sh filename 及./filename执行脚本的区别

      当shell脚本在当前用户下具有可执行权限时,用sh filename与./filename执行脚本是没有区别得。./filename是因为当前目录没有在PATH中,所有”.”是用来表示当前目录的。
      sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell。
      source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。

3.2 为配置为文件package.xml文件添加依赖项的时候注意事项

        catkin支持两种package.xml标签格式,格式1标准说明是REP-0127,格式2标准说明是REP-0140

        格式1   <run_depend> (多个):运行时需要依赖的其它package,如动态链接库、可执行文件、Python模块、脚本文件等

                   <build_depend>:用于帮助使用本package的其它包传递依赖声明

        格式2 <exec_depend>:相当于格式1的run_depend标签。

                   <build_export_depend>:用于帮助使用本package的其它包传递依赖声明

      在不同的版本中要采用对应的版本命令,如果用混将报以下错误

        

        

        如果在package.xml文件的第二行有以下文字  format=“2”   则需要需要使用格式2,否则使用格式1

        


参考文献:

https://blog.csdn.net/bluewhalerobot/article/details/73658162  【 catkin_make的时候发生了什么】

https://blog.csdn.net/sukha/article/details/52460492【ROS源码分析--子话题-catkin】

https://blog.csdn.net/weixin_38500110/article/details/78448603【CMakeList.txt脚本文件及Cmake常用命令】

http://www.cnblogs.com/Jessica-jie/p/6706225.htmlROS两种workspace :overlay rosbuild_ws->catkin_ws->ROS库

https://blog.csdn.net/violet_echo_0908/article/details/52056071【Linux下source命令详解】

猜你喜欢

转载自blog.csdn.net/guosuling/article/details/83214460