1、创建工作环境
$mkdir -p ~/catkin_ws/src
$cd ~/catkin_ws
$catkin_make
$source devel/setup.bash
2、在/catkin_ws/src下创建toplic_example功能包
$cd src
$catkin_creat_pkg topic_example std_msgs roscpp
3、在/catkin_ws/src/topic_example下创建src包,放置publish_node.cpp和subscribe_node.cpp两个文件
$cd topic_example
$mkdir -p src
$cd src
$gedit publish_node.cpp
$gedit subscribe_node.cpp
4、publish_node.cpp代码如下
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc,char **argv)
{
ros::init(argc,argv,"publish_node");//初始化ros,节点取名为publish_node
ros::NodeHandle nh;//声明一个句柄
ros::Publisher chatter_pub =nh.advertise<std_msgs::String>("chatter",1000);//告诉ros节点管理器,publish_node会在chatter这个话题上发布std_msgs类型消息
ros::Rate loop_rate(10);//指定自循环的频率,10HZ
int count=0;
while(ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss<<"hello"<<count;
msg.data=ss.str();
ROS_INFO("%s",msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
5、subscribe_node.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::init(argc,argv,"subscribe_node");
ros::NodeHandle nh;
ros::Subscriber chatter_sub =nh.subscribe("chatter",1000,chatterCallback);
ros::spin();
return 0;
}
6、修改catkin_ws/src/topic_example下的CMakeLists.txt文件
在文件末尾加上:
include_directories(include ${catkin_INCLUDE_DIRS})
add_executable(publish_node src/publish_node.cpp)
target_link_libraries(publish_node ${catkin_LIBRARIES})
add_dependencies(publish_node topic_example_generate_messages_cpp)
add_executable(subscribe_node src/subscribe_node.cpp)
target_link_libraries(subscribe_node ${catkin_LIBRARIES})
add_dependencies(subscribe_node topic_example_generate_messages_cpp)
7、回到工作环境下,进行编译
$cd ~/catkin_ws/
$catkin_make
$source devel/setup.bash
8、编译无误后,进行通信
先运行主节点
$roscore
使用ctrl+shift+t,创建新终端,
$rosrun topic_example publish_node
ctrl+t,开新终端,运行:
$source ~/catkin/devel/setup.bash
$rosrun topic_example subscribe_node
9、实现通信
遇到的问题:
解决办法:在catkin_ws/src/topic_example下的CMakeList.txt中添加
cmake_policy(SET CMP0046 OLD)