首先建立一个工作空间(不再赘述)
cd进入src,创建功能包
catkin_creat_pkg test rospy roscpp std_msgs
cd test/src
touch talker.cpp //创建发布者
vi talker.cpp
打开talker.cpp输入以下内容
#include<sstream>
#include"ros/ros.h"
#include"std_msgs/String.h"
int main(int argc, char **argv)
{
//ros节点初始化
ros::init(argc,argv,"talker");
//创建节点句柄
ros::NodeHandle n;
//创建一个publisher,发布名为chatter的Topic,消息类型为std_msgs::String
ros::Publisher chatter_pub=n.advertise<std_msgs::String>("chatter",1000);
ros::Rate loop_rate(10);
int count =0;
while (ros::ok())
{
//初始化std_msgs::String类型的消息
std_msgs::String msg;
std::stringstream ss;
ss<<"hello world"<<count;
msg.data=ss.str();
//发布消息
ROS_INFO("%s",msg.data.c_str());
chatter_pub.publish(msg);
//循环等待回调函数
ros::spinOnce();
//按照循环频率延时
loop_rate.sleep();
++count;
}
return 0;
}
:wq
保存输入的内容
vi listener.cpp
输入以下内容
#include"ros/ros.h"
#include"std_msgs/String.h"
//接受到订阅的消息后,会进入消息回调函数
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
//将受到的消息打印出来
ROS_INFO("I hear: [%s]",msg->data.c_str());
}
int main(int argc,char **argv)
{
//初始化ROS 节点
ros::init(argc,argv,"listener");
//创建节点句柄
ros::NodeHandle n;
//创建一个subscriber,订阅名为chatter的话题,注册回调函数chatterCallback
ros::Subscriber sub=n.subscribe("chatter",1000,chatterCallback);
ros::spin();
return 0;
}
保存后退出,修改cmakelist
cd ~/catkin_ws/src/test
gedit CMakeLists.txt
```![请添加图片描述](https://img-blog.csdnimg.cn/7d5eaaa7447c4db287ab8aed1568384a.png)
```bash
add_executable(listener src/listener.cpp)
add_executable(talker src/talker.cpp)
target_link_libraries(listener
${catkin_LIBRARIES}
)
target_link_libraries(talker
${catkin_LIBRARIES}
)
保存退出后进行编译
cd catkin_ws
catkin_make
打开一个终端
roscore
cd catkin_ws
source devel/setup.bash
rosrun test talker
打开一个新终端
cd catkin_ws
source devel/setup.bash
rosrun test listener
结果如下图,talker为发布者,listener为订阅者
新打开一个终端,使用
rostopic list
可以看到发布的话题
rqt_graph
看到节点之间的关系
代码来源与——ROS机器人开发实践(胡春旭著)