ROS机器人操作系统是一个机器人软件平台,它能为异质计算机集群提供类似操作系统的功能。
其源代码可以按照网页kinetic/Installation/Source中的步骤下载。
阅读ROS操作系统源代码,将代码下载下来后,需要找到一个切入点,层层深入阅读。
在ROS官网教程中,第一段示例应用代码如下,想以此为依据,找到解析ROS的切入点。
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker");
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
上述代码一开始首先进行ROS环境的初始化,调用了ros::init()函数和创建了ros::NodeHandle类的对象。
ros::init(argc, argv, "talker");
ros::NodeHandle n;
从ROS官网教程中的示例代码可以看到,无论是创建消息发布/订阅者(publisher/subscriber)还是创建服务/客户节点(service and client),都需要使用这两行代码。因此,计划从这两行代码切入,对ROS进行解析。
经查看源代码,ros::init()函数和ros::NodeHandle类的定义,包括创建消息发布/订阅者(publisher/subscriber),还有创建服务/客户节点(service and client)相关的函数和类,都在源代码的
src/ros_comm/roscpp
目录下。文件夹结构如下:
.
├── include
│ └── ros
│ └── transport
├── msg
├── rosbuild
│ └── scripts
├── src
│ ├── libros
│ │ └── transport
│ └── roscpp
└── srv
其中,include/ros目录下是关键的头文件,src/libros目录下是关键的.cpp文件。
后续,我将以ros::init()函数和ros::NodeHandle类为切入,逐步解析src/ros_comm/roscpp下的代码。
ros::init()的解析请关注下一篇博客ROS程序的初始化——从ros:init()出发