ROS通信-小例子
1、环境
ubuntu20.04 + ROS Noetic Ninjemys(http://wiki.ros.org/noetic/Installation)
2、例子(目的是建立talker1和listener1的通信,talker1为发布者,listener1为订阅者)
2.1 cd ~ # 进入用户目录。
2.2 mkdir -p ~/catkin_ws/src # 创建工作空间。
2.3 catkin_create_pkg message std_msgs roscpp # 创建message功能包,message依赖于std_msg,roscpp等package。运行该命令后会生成CMakeLists.txt、include、package.xml、src等文件。如下图所示
2.4 cd ~/catkin_ws/src/message/src # 进入cpp节点创建路径。
2.5 touch talker1.cpp和touch listener1.cpp # 创建两个cpp节点。如下图所示。
talk1.cpp代码(代码有不懂的可以去看《ROS机器人上程序设计》的P35页):
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker");
ros::NodeHandle n;
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 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;
}
listener1.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());
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
ros::spin();
return 0;
}
2.6 修改~/catkin_ws/src目录下的CMakelist.txt文件,加入
add_executable(talker1 src/talker1.cpp)
target_link_libraries(talker1 ${catkin_LIBRARIES})
add_executable(listener1 src/listener1.cpp)
target_link_libraries(listener1 ${catkin_LIBRARIES})
四行代码即可。如下图所示。
2.7 cd ~/catkin_ws,然后运行catkin_make进行编译。如下图所示为编译成功。
2.8 编译成功后,会在~/catkin_ws/devel/lib/messager目录下生成talker1和listener1两个可执行文件。
2.9 另起一个终端,运行roscore
2.10 再另起两个终端运行,先运行./talker1发布节点到topic,再运行./listener1订阅该节点。至此即完成ROS通信过程。如下图所示。