ros操作系统创建一个话题发布者和订阅者通信的例子

一.在catkin_ws/src/pkg_name/src下创建talker.cpp和listener.cpp.分别编辑三个文件:

1.你创建的publisher(talker.cpp):

#include

#include

#include

int main(int argc,char** argv)

{

ros::init(argc,argv,"talker");//ros节点初始化,输入参数和为节点命名

ros::NodeHandle n;//创建一个节点句柄

ros::Publisher chatter_pub=n.advertise("chatter",1000);

//在ros master端注册一个publisher,并告诉系统publisher节点将会发布以chatter为话题的string类型消息,第二个参数表示消息发布队列大小(创建一个publisher,发布名为chatter的topic 消息类型为std_msgs::string)

ros::Rate loop_rate(10);//设置循环的频率,这里是10hz,为ros::sleep()设置休眠时间

int count=0;

while(ros::ok())//在节点未发生异常的时候循环

{

std_msgs::String msg;//初始化stdmsgs::string类型的消息

std::stringstream ss;

ss<<"hello world"<

msg.data=ss.str();

ROS_INFO("%s",msg.data.c_str());//发布日志消息,类似于c语言中的printf

chatter_pub.publish(msg);//发布封装完毕的消息msg,master会查找订阅该话题的节点,帮助其建立连接,完成消息的传输。

//循环等待回调函数,用来处理节点订阅话题的所有回调函数

ros::spinOnce();

//按照循环频率延时

loop_rate.sleep();

++count;

}

return 0;

}


2.你的subscriber(listener.cpp):

#include

#include

//接收到消息后进入回调函数

void chatterCallback(const std_msgs::String::ConstPtr& msg)

{

//将接收到的消息打印出来

ROS_INFO("I heard :[%s].",msg->data.c_str());

}

//回调函数是订阅节点接收消息的基础机制,当有消息到达时会自动以消息指针作为参数,再调用回调函数,完成对消息内容的处理,如上是一个简单的回调函数,用来接收publisher发布的string消息,并将其打印出来

int main(int argc,char **argv)

{

//初始化节点

ros::init(argc,argv,"listener");

ros::NodeHandle n;

ros::Subscriber sub=n.subscribe("chatter",1000,chatterCallback);

//订阅节点首先需要声明自己订阅的消息话题,该消息会在ros master中注册,master会关注系统中是否存在发布该话题的节点,如果存在则会帮助两个节点建立连接,完成数据的传输,NodeHandle::subscriber()用来创建一个Subscriber,第一个参数即为消息话题,第二个是消息队列的大小,第三个参数是接收到话题消息后的回调函数.

ros::spin();//节点进入循环状态,有消息到达时调用回调函数完成处理

return 0;

}


3.在cmakelist.txt中添加:

include_directories(include ${catkin_INCLUDE_DIRS})

//用于设置头文件的相对路径,默认在include文件夹下

add_executable(talker src/talker.cpp)//用于设置需要编译的代码和生成的可执行文件,第一个参数为期望生成的可执行文件名称,后边的参数为参与编译的源码文件,多个文件则用空格隔开

target_link_libraries(talker ${catkin_LIBRARIES} )//用于设置链接库,第一个参数同上,第二个为需要链接的库,这次使用默认库

add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)//用于设置依赖,如果编译的可执行文件依赖这些动态生成的代码,则需要添加这个来配置

 

add_executable(listener src/listener.cpp)

target_link_libraries(listener ${catkin_LIBRARIES} )

add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)


二.运行publisher和subscriber

1.启动roscore:

$ roscore

2.启动publisher

$rosrun pkg_name talker

3.启动subscriber

$rosrun pkg_name listener

若运行成功,在终端将会出现接受和发布的消息内容


三.若要使用自定义msg消息类型文件:

1.在package.xml中添加功能包依赖:

message

message

2.在cmakelist.txt中添加编译选项:

1.find_package(catkin REQUIRED COMPONENTS

roscpp

rospy

std_msga

message_generation//新添加

)

2catkin_package(

......

CATKIN_DEPENDS roscpp rospy std_msgs message_runtime

......

)

最后在需要用的c文件中include即可使用

3.add_message_files(

FILES

msg文件夹下定义的msg文件名.msg

)

4.generate_messages(

DEPENDENCIES

std_msgs

)

你可能感兴趣的:(ros,ros,机器人操作系统,话题通信机制)