节点与 Master
在 ROS 里,最小的进程单元是节点(node)。一个功能包里可以放多个可执行文件,运行起来就是节点。从程序角度看,节点就是被加载到内存里的可执行文件,通常由 C++ 编译生成,也可以是 Python 脚本。
一般一个节点只负责机器人上的一项功能。比如底盘控制、摄像头驱动、激光雷达处理、路径规划,这些会分到不同节点里。这样每个节点出问题的概率更小,比把所有东西塞进一个进程要好维护得多。
节点一多,就得有个管理角色——master。master 相当于管理中心,节点得先在它那儿注册,然后节点之间的通信也由 master 牵线,两两之间再点对点通信。启动 ROS 程序时,先启动 master,然后才一个一个拉起节点。
roscpp 客户端库
ROS 为不同的语言提供了编程接口:C++ 的 roscpp,Python 的 rospy,还有 Java 的 rosjava 等。这些接口封装了 topic、service、param 这些常用通信功能,和开发中的 Helper Class 差不多。目前用的最多的就是 roscpp 和 rospy,其他语言的基本还在测试阶段。

编写第一个 C++ 节点
下面在已有的 test_pkg 包下写一个最简单的节点,功能是不断发布 'hello world' 话题。
源码
在 ros_workspace/src/test_pkg/src 目录里新建 test.cpp:
#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 << << count;
msg.data = ss.();
(, msg.data.());
chatter_pub.(msg);
ros::();
loop_rate.();
++count;
}
;
}

















