本节创建两个节点,一个用于发布数据,另一个节点接收该数据。
定位到工作区的src目录下,创建两cpp文件。
example_1a.cpp
#include "ros/ros.h" //包含ros节点所需的全部文件
#include "std_msgs/String.h" //用于向ros计算网络发布消息的类型头文件
#include <sstream>
int main(int argc,char **argv){
ros::init(argc,argv,"example1a"); //初始化节点并设置名称(名称需要是独一无二的)
ros::NodeHandle n; //节点相关进程的处理程序,实现节点与环境的交互
ros::Publisher pub = n.advertise<std_msgs::String>("message",100); //实例化发布程序,第二个参数指定了缓冲区的大小
ros::Rate loop_rate(10); //设置数据发送频率,10Hz
while(ros::ok()){ //当按下Ctrl+C组合键,ros::ok停止运行
std_msgs::String msg; //创建消息变量
std::stringstream ss; //创建消息流
ss << "Hello World!";
msg.data = ss.str(); //消息赋值
pub.publish(msg); //发布消息
ros::spinOnce(); //处理所有内部ROS事件和动作,例如对订阅的话题阅读
loop_rate.sleep(); //休眠一段时间
}
return 0;
}
程序截图:
example_1b.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
void messageCallback(const std_msgs::String::ConstPtr& msg){ //定义回调函数
ROS_INFO("Thanks: [%s]", msg->data.c_str());
}
int main(int argc, char **argv){
ros::init(argc, argv, "example1b"); //初始化节点并设置名称(名称需要是独一无二的)
ros::NodeHandle n; //节点相关进程的处理程序,实现节点与环境的交互
ros::Subscriber sub = n.subscribe("message",1000,messageCallback); //创建订阅器,并开始监听名为message的话题,设置缓冲区大小,处理消息的函数
ros::spin(); //主循环一直执行,按下Ctrl+C停止并结束
return 0;
}
程序截图:
编辑CMakeList.txt文件,准备配置好编译所需的包
在文件的末尾添加以下几行代码:
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(example1a src/example_1a.cpp)
add_executable(example1b src/example_1b.cpp)
add_dependencies(example1a chapter2_turtleial_generate_messages_cpp)
add_dependencies(example1b chapter2_turtleial_generate_messages_cpp)
target_link_libraries(example1a ${catkin_LIBRARIES})
target_link_libraries(example1b ${catkin_LIBRARIES})
编译所有节点的包:
$ cd ~/catkin_ws/
$ catkin_make --pkg chapter2_turtleial
测试:
运行节点管理器:
$roscore
在其他终端中分别运行:
$ rosrun chapter2_turtleial example1a
$ rosrun chapter2_turtleial example1b
测试效果截图: