ROS学习之发布消息——Publisher_代码分析
//一个非常详细的版本:
//本文件名字为: publisher.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <iostream> //或者 #include<sstream>
//使用命名空间,省的每次都需要ros::
using namespace ros;
//这里使用cout进行打印输出
using namespace std;
int main(int argc, char** argv){
//使用句柄之前必须初始化节点 //第三个参数不能为空,最好和节点名相同,我试过,和节点名不同也没事
init(argc, argv, "publisher_Node");
NodeHandle n;
//广播的消息类型为:std_msgs::String,并把消息放入话题“topic_m” 中可以试着使用rostopic list打印出该话题
//不同软件包下的话题可以同名,但是在ros只允许同时运行一个,所以这里最好是独一无二的消息名称
Publisher pub = n.advertise<std_msgs::String>("topic_m",1000);
//发送消息的频率为2Hz, 1秒发2个,周期为500ms
Rate loop_rate(2);
while(ok()){
//定义一个msg,往msg中装入需要广播的消息
std_msgs::String msg;
//打印输出hello
cout<<"print from cout: Hello wanzew..."<<endl;
//将需要广播的字符串装入msg中
msg.data = "Hello wanzew!";
//使用ROS_INFO打印提醒消息
ROS_INFO("%s",msg.data.c_str());
//把std_msgs::String类型的消息msg
pub.publish(msg);
//发布消息时可以不写spinOnce(),但订阅某个消息时必须要写spin()函数
//spinOnce();
//靠sleep()函数保证连续两个消息之间的时间恰好为一个周期
loop_rate.sleep();
}
return 0;
}
//一个更加简洁的版本
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <iostream>
using namespace ros;
using namespace std;
int main(int argc, char** argv){
init(argc, argv, "publisher_Node");
NodeHandle n;
Publisher pub = n.advertise<std_msgs::String>("topic_m",1000);
Rate loop_rate(2);
while(ok()){
std_msgs::String msg;
msg.data = "Hello wanzew!";
pub.publish(msg);
loop_rate.sleep();
cout<<"print from cout: Hello wanzew..."<<endl;
}
return 0;
}
对应的 CMakeList.txt 文件内容如下:
cmake_minimum_required(VERSION 2.8.3)
project(my_package)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
)
catkin_package(
# 下面注释部分可打开-->
# INCLUDE_DIRS include
# LIBRARIES my_package
# CATKIN_DEPENDS roscpp rospy std_msgs
# DEPENDS system_lib
)
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
# publisher_Node在ros中是独一无二的,不能和其它节点名字重复
add_executable(publisher_Node src/publisher.cpp)
target_link_libraries(publisher_Node ${catkin_LIBRARIES})