目录
ROS(Robot Operating System)
ros的基本框架是斯坦福大学人工智能实验室在STAIR项目与机器人技术公司Willow Garage的个人机器人项目(Personal Robots Program)之间的合作中为了提高机器人研发中的软件复用率,由吴恩达教授指导的Morgan Quigley博士于2007年主导设计与实现的。一年后交由著名的机器人实验室Willow Garage继续开发维护。后于2010年正式发布。2013年,Willow Garage的创办者也是注资人为了全身心的投入到自己创办的公司,关闭了实验室。此后ros的维护工作交给OSRF(Open Source Robotics Foundation)接管。
ros的特点
1、分布式的结构
一个进程在ros中称作一个节点(node),每个功能节点可以单独编译,节点之间形成点对点的通信,适合多机协同工作。
2、语言支持广泛
功能节点的接口与编程语言无关。支持C++、Python、Java等。
3、集成度高功能完备
集成了众多的开源项目,如OpenCV、pcl(point cloud library)等。
4、丰富的组件化工具
物理仿真环境gazebo,3d的数据可视化工具rviz,数据记录工具rosbag,Qt工具箱rqt_* 。
5、免费且开源
遵循BSD许可协议,可以随意修改并商用,功能包的数量迅速增加。
总结以上特点,ros以其分布式的通信机制为核心,辅以实用的开发工具、丰富的开源功能包,逐渐形成了从社区中汲取知识提升开发效率然后开源分享自己的开发成果的良性生态系统。
ros的系统实现
文件系统级
所谓文件系统,就是说我们的项目放在硬盘里,到底是什么目录结构,长什么样子。一个典型的ros工程如下图所示:
首先我们看到最顶层的catkin工作空间,它是整个ros工程中层次最高的概念。工作空间也就是我们管理和组织ros工程项目文件的地方。而catkin是ros定制的编译构建系统,是对CMake的扩展,对ros这样大体量的工程有更好的支持,同时也简化了操作。
简言之,catkin工作空间就是一个文件夹,用来组织和管理ros功能包。我们可以使用catkin对其进行编译。
那么工作空间如何创建呢?
首先利用mkdir命令建立一个工作空间文件夹(名字任意取),并在这个文件夹下建立一个名为src的文件夹(必须取名为src)
mkdir -p ~/catkin_ws/src
然后进入src文件夹下,调用catkin_init_workspace命令初始化工作空间。
cd ~/catkin_ws/src
catkin_init_workspace
这时我们的src文件夹下会多出一个CMakeLists.txt文件,我们的工作空间也就创建好了。
好的,现在我们回过头来解释一下刚刚建立的src目录以及初始化工作空间后自动生成的CMakeLists.txt文件是干什么的。ros工程默认src目录作为存放功能包(package)的文件夹,即源文件空间(the source space)。而这里的(即主目录下的)CMakeLists.txt文件规定了工程的编译规则,包括指定工程名称,指定工程采用的语言,设置编译类型(debug或release),设置编译器的类型(eg:C、C++),添加要编译的子目录(即功能包,顺序任意)。
我们刚刚初始化的工作空间其实就是一个空的工作空间,里面什么都没有,我们还没有往里面写入任何的程序文件,这也是结构最简单的工作空间。这时我们可以使用catkin_make命令对工作空间进行编译(事实上,我们可以不必特意对工作空间进行初始化,而直接使用catkin_make命令进行编译,catkin_make会自动为我们初始化工作空间)
cd ~/catkin_ws
catkin_make
注意:使用catkin_make编译之前一定要回到工作空间,在其他目录下进行catkin_make是会失败的。
编译完成之后,我们工作空间下会多出build和devel两个文件夹,build文件夹下存放的是CMake和catkin的缓存信息、配置信息和其他中间文件,称为编译空间(the build space)。devel文件夹中存放的是编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等,称为开发空间(the development space)。
一般在catkin_make编译之后要记得source一下devel目录下的setup.bash文件,将编译生成的文件刷新到系统环境中,否则我们调用生成的可执行文件时系统会找不到。
source ~/catkin_ws/devel/setup.bash #编译之后要用source刷新环境
每次重新打开一个新的终端shell,都需要运行