ROS(1)编写第一个ROS程序(创建工作空间workspace和功能包package)
一、先从三个方面去理解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>
第二步:声明可执行文件
接下来,我们需要在 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})
第三步:编译工作区
利用catkin_make这个命令进行编译,注意必须从你的工作空间目录运行,此命令时是进入你的工作空间目录。
cd ~/test
catkin_make
六、执行hello程序
roscore
source devel/setup.bash
rosrun first hello
通过上面的操作,我们就完成了一个简单的ROS程序。