|

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})

Similar Posts

Leave a Reply