ROS 学习笔记 编写publisher给小乌龟的topic发送信息控制小乌龟运动 2021.3.4
创建功能包
- 在workspace目录下输入
catkin_creat_pkg learning_topic geometry_msgs roscpp rospy std_msgs turtlesim
其中 learning_topic 是功能包的名字,后面所跟的是功能包的依赖
编写代码
- 在learning_topic/src目录下创建velocity_publisher.cpp文件
代码来自古月居的b站视频
#include <geometry_msgs/Twist.h>//geometry_msgs中有许多已经封装好的数据结构 Twist是其中之一
#include <ros/ros.h>
int main(int argc, char **argv) {
ros::init(argc, argv, "velocity_publisher");//PublisherName 声明此节点的名字为:velocity_publisher
ros::NodeHandle n; //creat handle 创建句柄 一些方法需要通过句柄调用
ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",10);//消息队列长度为10
//定义一个对象 在ros master中注册一个 publisher 并告诉ros master ,publisher要以Twist的数据结构发送给 topic /turtle1/cmd_vel 消息队列长为10
ros::Rate loop_rate(10);//设置循环频率 单位是HZ 时间是 10/1000s = 100ms
while(ros::ok()){
geometry_msgs::Twist vel_msgs;//定义消息对象
vel_msgs.linear.x = 1;//给消息对象赋值
vel_msgs.angular.z = 0.5;
turtle_vel_pub.publish(vel_msgs);//发送消息
ROS_INFO("velocity = %0.2f, angular = %.2f",vel_msgs.linear.x ,vel_msgs.angular.z );//当printf用就好来
loop_rate.sleep();//sleep100ms
}
return 0;
}
编译
打开learning_topic/CMakeLists.txt 在
include_directories(
${catkin_INCLUDE_DIRS}
)
下面加入两行
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
打开终端进入workspace目录下输入
catkin_make
运行
打开一个终端输入
roscore
打开一个终端输入
rosrun turtlesim turtlesim_node
再打开一个终端输入
rosrun learning_topic velocity_publisher
就可以看到你的小乌龟在转圈来
subscriber
#include "turtlesim/Pose.h"
#include <ros/ros.h>
//编写回调函数
void poseCallBack(const turtlesim::Pose::ConstPtr &msg) {//传入的参数是所要接收到的信息的指针
ROS_INFO("x = %.2f, y = %.2f", msg->x, msg->y);
}
int main(int argc, char **argv) {
ros::init(argc, argv, "pose_subscriber"); //初始化node
ros::NodeHandle n;//创建handle
ros::Subscriber pose_sub = n.subscribe("/turtle1/pose",10,poseCallBack);//创建一个subscriber去接收名为/turtle1/pose的topic 回调函数为posCallBack 消息队列长为10
ros::spin(); //调用回调函数
return 0;
}
spin回调函数介绍
当程序执行到spin()时,如果前面有有subscriber ,则程序会进入这个subscriber的回调函数并进入死循环,反复的接收信息,即使没有信息也会一直循环,直到你kill掉这个程序。
经过实验,当我把乌龟的程序kill掉后,subscriber程序会直接卡住???
编译和运行方法与publisher同理