欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ROS(1)编写第一个ROS程序(创建工作空间workspace和功能包package)

程序员文章站 2022-07-14 22:09:11
...

一、先从三个方面去理解ROS:(自己查,不详表)

ROS是什么,为什么使用ROS,如何使用ROS

ROS(Robot Operating System)    地址链接:http://www.ros.org/

侧重点:a 首先,ROS是一个操作系统os;

              b 是一种跨平台模块化软件通讯机制,ROS用节点(Node)的概念表示一个应用程序,不同node之间通过事先定义好格式的消息(Topic),服务(Service),动作(Action)来实现连接;

              c  是一系列开源工具,ROS为开发者提供了一系列非常有用的工具,可以大大提高我们开发的效率,

        rqt_plot:可以实时绘制当前任意Topic的数值曲线;

        rqt_graph:可以绘制出各节点之间的连接状态,和正在使用的Topic等;

       TF:TF是Transform的简写,利用它,我们可以实时知道各连杆坐标系的位姿,也可以求出两个坐标系的相对位置;

        Rviz:超强大的3D可视化工具,可以显示机器人模型、3D电影、各种文字图标、也可以很方便二次开发;

             d 具有很多先进算法:

           OROCOS:这个开源项目主要侧重于机器人底层控制器的设计,包括用于计算串联机械臂运动学数值解的KDL、贝叶斯滤波、实时控制等功能。

  OpenRave:这是在ROS之前最多人用来做运动规划的平台,ROS已经将其中的ikfast(计算串联机械臂运动学解析解)等功能吸收。

  Player:一款优秀的二维仿真平台,可以用于平面移动机器人的仿真,现在在ROS里可以直接使用。

  OpenCV:大名鼎鼎的机器视觉开源项目,ROS提供了cv_bridge,可以将OpenCV的图片与ROS的图片格式相互转换。

  OMPL:现在最著名的运动规划开源项目,已经成了MoveIt的一部分。

  Visp:一个开源视觉伺服项目,已经跟ROS完美整合。

  Gazebo:一款优秀的开源仿真平台,可以实现动力学仿真、传感器仿真等,也已被ROS吸收。

二、创建工作空间(workspace)

我们所创建的功能包,都全部放在一个叫工作空间(workspace)的目录中。先创造一个工作空间test,并在此文件夹下创建一个SRC的子目录,用于存放功能包的源代码。而 代码中的 “-p” ,这时mkdir命令会自动创建所有不存在的目录。

在终端命令中键入(打开终端的快捷键为“Ctrl+Alt+T”)

mkdir -p ~/test/src

三、创建功能包(package)

创建一个新ROS功能包的命令应该在你工作空间中的src目录下运行:catkin_create_pkg package-name,package-name指的是你功能包的名字,我所创建的功能包名为first,注意是在你工作空间中的src目录下运行(cd命令可以进入你要进入的目录)继续在终端中键入 

cd ~/test/src

进入src目录下运行 

catkin_create_pkg first

其实,这个功能包创建命令没有做太多工作,它只不过创建了一个存放这个功能包的目录(也就是我所创建的功能包first),并在first那个目录下生成了两个配置文件。
第一个配置文件,叫做 package.xml,称为清单文件。

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

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

四、编写ROS程序

我编写一个简单的 hello,ros!的程序,命名为hello.cpp。这个名为 hello.cpp 的源文件 也 存 放 在 你 的 功 能 包 first文 件 夹 中 , 挨 着 package.xml 和CMakeLists.txt。

注意:一些在线教程建议在你的功能包目录中创建 src 目录来存放 C ++源文件。这个附加的组织结构可能是有益的,特别是对于那些含有多种类型文件的较大的功能包,但它不是严格必要的。

#include <ros/ros.h>

int main ( int argc , char ** argv ) 
{
  ros::init ( argc , argv , "hello" ) ;
  ros::NodeHandle nh ;
  ROS_INFO_STREAM( " Hello , ROS! " ) ;
}

五、编译 Hello 程序

我们该如何编译和运行这个程序呢?这些交给ROS的catkin编译系统来处理。

第一步: 编辑包目录下的 CMakeLists.txt 文件

sudo gedit CMakeLists.txt

内容如下: 

cmake_minimum_required(VERSION 2.8.3)
project(first)
#添加需要的依赖库 roscpp
find_package(catkin REQUIRED COMPONENTS roscpp)
include_directories(
${catkin_INCLUDE_DIRS}
)
#声明想要的可执行文件的文件名,以及所需要的源列表,如果有多个源列表,空格列在此处
add_executable(hello src/hello.cpp)
#告诉Cmake当链接此可执行文件时需要链接哪些库
target_link_libraries(hello ${catkin_LIBRARIES})

 

我们同样需要在包的清单文件package.xml 中列出依赖库,通过使用build_depend (编译依赖)和 run_depend(运行依赖)两个关键字实现:格式如下:
<build_depend>package-name</build_depend>
<run_depend>package-name</run_depend>
在hello 程序在编译时和运行时都需要 roscpp 库,因此清单文件package.xml加入:

<build_depend>roscpp</build_depend>
<exec_depend>roscpp</exec_depend>

ROS(1)编写第一个ROS程序(创建工作空间workspace和功能包package)

第二步:声明可执行文件

接下来,我们需要在 CMakeLists.txt 中添加两行,来声明我们需要创建的可执行文件。

其一般形式是:add_executable(executable-name source-files)                           此处executable-name为执行文件的名字(hello),source-files为源文件的名字(hello.cpp)

                      target_link_libraries(executable-name ${catkin_LIBRARIES})


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

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

在我的例程中,我们需要一个名为 hello 的可执行文件,它通过名为 hello.cpp 的源文件编译而来。所以我们需要添加如下几行代码到 CMakeLists.txt 中:

add_executable(hello hello.cpp)
target_link_libraries(hello ${catkin_LIBRARIES})

ROS(1)编写第一个ROS程序(创建工作空间workspace和功能包package)

第三步:编译工作区

利用catkin_make这个命令进行编译,注意必须从你的工作空间目录运行,此命令时是进入你的工作空间目录。

cd ~/test
catkin_make

ROS(1)编写第一个ROS程序(创建工作空间workspace和功能包package)

六、执行hello程序

roscore

source devel/setup.bash

rosrun first hello

ROS(1)编写第一个ROS程序(创建工作空间workspace和功能包package)

通过上面的操作,我们就完成了一个简单的ROS程序。