ROS 学习笔记(一)发布者与订阅者
一 创建发布节点
1新建工作空间
#先切回主目录
cd ~/
#新建工作空间文件夹
mkdir catkin_ws
#在catkin_ws目录下新建src文件夹
cd catkin_ws
mkdir src
#初始化src目录,生成的CMakeLists.txt为功能包编译配置
cd src
catkin_init_workspace
#切回catkin_ws目录,对该工作空间执行一次编译
cd ~/catkin_ws
catkin_make
#环境变量配置,使新建的catkin_ws工作空间可用
source devel/setup.bash
#在catkin_ws/src/下创建取名为beginner_tutorials的功能包,
cd ~/catkin_ws/src/
catkin_create_pkg beginner_tutorials
#切换到beginner_tutorials目录
#新建src文件夹
roscd beginner_tutorials
mkdir -p src
2 代码
#在src下新建talker.cpp文件
#复制以下代码
#ros/ros.h 是ros系统必需的一个头文件,其中包含了大部分公共组件;
#std_msgs/String.h 是一个基于std_msgs包的头文件,包含字符串相关组件;
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char **argv)
{
#ros初始化,指定节点名称,节点名称在系统中必须唯一且不能含有符号”/”
ros::init(argc, argv, "talker");
#在节点中创建一个句柄,创建第一个句柄的时候将执行节点的初始化
ros::NodeHandle n;
#在chatter话题上创建一个std_msgs/String类型的消息,队列深度1000
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
#循环频率设置为10Hz
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;
}
二 创建订阅节点
1 代码
#include "ros/ros.h"
#include "std_msgs/String.h"
//回调函数,当一个新消息出现在chatter话题中时触发
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;
//订阅chatter话题,每当出现新消息调用回调函数
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
//进入等待回调循环,不会占用很多CPU资源
ros::spin();
return 0;
}
三 修改CMakeLists.txt文件
#在find_package()处添加依赖包;
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)
#在## Generate messages in the 'msg' folder处添加信息依赖文件
generate_messages(
DEPENDENCIES std_msgs
)
#在include_directories处添加头文件目录
include_directories(
#include
${catkin_INCLUDE_DIRS}
)
#在文件末尾添加依赖环境
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)
四 编译调试
#切换至工作空间
cd ~/catkin_ws
#编译所有项目
catkin make
#启动ros核心
roscore
#新开一个终端,source工作空间
source ~/catkin_ws/devel/setup.bash
#运行发布者程序
rosrun beginner_tutorials talker
#新开一个终端,source工作空间
source ~/catkin_ws/devel/setup.bash
#运行订阅者程序
rosrun
程序效果如下: