1. ROS系统的基本结构
ROS 系统简单的说是一个多进程管理系统,其中结点Node是最小的功能执行单元,它可以是一个main函数,当一个node被启动时,其相应的功能便被执行。Package是ROS里最小的编译单元,其包含多个node以及相关结构性文件。当需要执行某个node时,需要表明此node所在package。Workspace是ROS最小的环境配置单元,package需要放置在workspace才能被编译。
2. 构建简单ROS系统
了解ROS系统的基本结构后,我们来自己构建一个简单的ROS系统。
首先我们新建文件夹HalloRos作为我们的workspace,在此文件夹下再新建次级文件夹src,在terminal中cd到src文件下执行以下命令:
catkin_init_workspace
用来初始化workspace,可以看到在此src下自动生成一个CMakeLists.txt文件(不用编辑)用来生成此workspace的相关信息。然后cd回到HalloRos文件夹下,执行:
catkin_make
用来真正生成此工作空间,同时build和devel文件夹自动生成(不用编辑)。此时我们需要执行命令:
echo 'source ~/HalloRos/devel/setup.bash' >> ~/.bashrc
向Linux系统也就是我们的工作环境报备我们生成了一个ROS系统,以便使系统知道此ROS系统及其命令的存在。此刻workspace成功创建,接下来我们需要cd到src文件夹下,然后创建我们自己的包package,命令如下:
catkin_create_pkg printHelloRosPK std_msgs rospy roscpp
第一个参数printHelloRosPK是包名,后面的参数是依赖库,例如如果需要使用c++,则需要依赖库roscpp。至此,包printHelloRosPK建立成功,在此包下自动生成include、src文件夹以及CMakelists、package.xml文件。在此workspace下可以用相同的命令建立多个包。
3. 节点建立
在包printHelloRosPK下我们可以建立多个结点node。cd到printHelloRosPK下的src文件夹,新建一个printHelloRosPK.cpp文件作为我们的第一个节点node。
#include <ros/ros.h>
int main(int argc, char **argv)
{
ros::init(argc,argv,"printHelloRosPK");//初始化ros系统,注意这里的printHelloRosPK是节点的名称
ros::NodeHandle n;//创建一个ros节点
ROS_INFO("Hello ROS");//打印信息
ros::spinOnce();//消息回调处理函数,也就是系统等在这里,直到有回调消息进入
}
然后我们在包printHelloRosPK下的CMakeLists.txt文件里添加:
add_executable(printHelloRosPK src/printHelloRosPK.cpp)
target_link_libraries(printHelloRosPK ${catkin_LIBRARIES})
告诉系统此node的存在。然后回到工作空间HalloRos文件夹下,再次编译:
catkin_make
则拥有节点printHelloRosPK的ROS系统建立成功。
在一个新terminal中输入:
roscore
再在另一个terminal中输入:
rosrun printHelloRosPK printHelloRosPK
(其中第一个参数是包名,第二个参数是节点名),节点功能便被执行,输出:
至此,一个简单的ROS系统建立成功,下一篇将介绍ROS系统节点间通信机制。如有问题欢迎讨论。