本文以小海龟为例,介绍了publisher节点和subscriber节点。
配置环境
创建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_make
(环境变量已经设置好,这里略)
创建功能包
catkin_create_pkg <package_name> [depend1] [depend2]
cd ~/catkin_ws/src
catkin_create_pkg learning_pub_sub std_msgs roscpp
创建完后返回目录`catkin_ws`运行`catkin_make`编译
publisher 节点
publisher节点用于不断广播信息
例如,创建一个publisher节点,用于不断向小海龟发布移动指令
代码如下:
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "velocity_publisher");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist(线速度), 队列长度为10
ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
// 设置循环的频率
ros::Rate loop_rate(10);
int count = 0;
// 开始发布信息
while (ros::ok())
{
//初始化geometry_msgs::Twist类型的消息
geometry_msgs::Twist vel_msg;
vel_msg.linear.x = 0.5;
vel_msg.angular.z = 0.2; // 沿z轴旋转
// 发布消息
turtle_vel_pub.publish(vel_msg);
ROS_INFO("publish turtle velocity command[%0.2f m/s, %0,2f rad/s]",
vel_msg.linear.x, vel_msg.angular.z);
// 按照循环频率延时
loop_rate.sleep();
}
return 0;
}
subscriber 节点
用于接收信息
例如,创建一个订阅者节点,接收来自小海龟的运动信息
代码如下
#include <ros/ros.h>
#include "turtlesim/Pose.h"
// 回调函数,用于打印接受到的信息
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}
int main(int argc, char **argv)
{
// 初始化ROS节点
ros::init(argc,argv,"pose_subscriber");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个Subscriber, 订阅名为/turtle1/pose的topic, 注册回调函数poseCallback
ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);
//循环等待回调汉书
ros::spin();
return 0;
}
编写cmakelist.txt
找到功能包下的CMakeList.txt(目录~/catkin_ws/src/learning_pub_sub),在以下位置添加代码
代码如下
# publisher
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
# subscriber
add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})
然后返回目录`catkin_ws`, 运行`catkin_make`编译,至此小海龟代码编译结束。
运行
- 新建终端,运行`roscore`
- 新建终端,运行`rosrun turtlesim turtlesim_node`,激活小乌龟节点。
- 运行`rosrun learning_pub_sub pose_subscriber`,激活sublisher节点,接受来自小乌龟的位置信息。
- 运行`rosrun learning_pub_sub velocity_publisher`,激活publisher节点,开始向小乌龟发送运动指令。
运行结果如下
此时小乌龟收到来自publisher节点的信息开始做匀速圆周运动,并把位置信息发送给subscriber节点。
节点图
输入代码查看节点图
rosrun rqt_graph rqt_graph
节点图如下