ROS 学习笔记 编写publisher给小乌龟的topic发送信息控制小乌龟运动 subscriber接收小乌龟的位置信息

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同理

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值