一.在catkin_ws/src/pkg_name/src下创建talker.cpp和listener.cpp.分别编辑三个文件:
1.你创建的publisher(talker.cpp):
#include<sstream>
#include<ros/ros.h>
#include<std_msgs/String.h>
int main(int argc,char** argv)
{
ros::init(argc,argv,"talker");//ros节点初始化,输入参数和为节点命名
ros::NodeHandle n;//创建一个节点句柄
ros::Publisher chatter_pub=n.advertise<std_msgs::String>("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"<<count;
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<ros/ros.h>
#include<std_msgs/String.h>
//接收到消息后进入回调函数
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中添加功能包依赖:
<build_depend>message</build_depend>
<exec_depend>message<exec_depend>
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<pkg_name/msg_name.h>即可使用
3.add_message_files(
FILES
msg文件夹下定义的msg文件名.msg
)
4.generate_messages(
DEPENDENCIES
std_msgs
)