ROS笔记——创建简单的主题发布节点和主题订阅节点

2023-05-16

 

  在安装好ROS后,接着学习如何创建节点和节点之间的通信方式,以一个简单的主题发布节点和主题订阅节点说明。

  节点是连接ROS网络等可执行文件,是实现某些功能的软件包,也是一个主要计算执行的进程。

 

  一、创建工作空间

  创建新文件夹,名字自定义,路径也根据自己设定。


cd ~
mkdir -p ros_workspace

  创建好后,就需要将次路径添加到ROS_PACKAGE_PATH中。

  查看目前ROS的工作空间,


echo $ROS_PACKAGE_PATH  

  一般显示如下:

  /opt/ros/kinetic/share

  下面将路径添加到~/.bashrc中


echo "export ROS_PACKAGE_PATH=~/ros_workspace:${ROS_PACKAGE_PATH}" >> ~/.bashrc
. ~/.bashrc  

  再次查看ROS正在使用的空间,确保路径正确添加。

 

  二、创建ROS功能包

  打开ROS工作目录:


cd ~/ros_workspace  

  在该目录下创建功能包:


roscreate-pkg test1_tutorials std_msgs rospy roscpp  

  功能包文件夹下一般包括Makefile、manifest.xml、CMakeLists.txt、mainpage.dox等文件。

  std_msgs  包含常见等消息类型

  rospy    py库

  roscpp    cpp库

  运行命令,查看功能包是否创建


rospack find test1_tutorials  

  

  三、编写代码

  1、主题发布节点

  在功能包中创建src/test1_a.cpp,并添加代码:


 1 #include "ros/ros.h"
 2 #include "std_msgs/String.h"
 3 #include <sstream>
 4 
 5 
 6 int main(int argc, char **argv)
 7 {
 8     ros::init(argc,argv,"test1_a");
 9     ros::NodeHandle n;
10     ros::Publisher chatter_pub = n.advertise<std_msgs::String>("message",1000);
11     ros::Rate loop_rate(10);
12     while(ros::ok()) {
13         std_msgs::String msg;
14         std::stringstream ss;
15         ss << "Hello test1_b! I am test1_a.";
16         msg.data = ss.str();
17         ROS_INFO("%s",msg.data.c_str());
18         chatter_pub.publish(msg);
19         ros::spinOnce();
20         loop_rate.sleep();
21     }
22     return 0;
23 }  

  第8行: 初始化,其中第三个参数是节点名称,在ROS系统中必须唯一。

  第10行:声明主题message上发布一个消息类型为str_msgs::String的消息,并设置消息缓冲区的大小。

  第11行:设置发送消息的频率 10HZ,它追踪自从上一次Rate::sleep()被唤醒之后的持续时间,并在到达时间后继续休眠。

  第12行:ros::ok()函数返回值,在下列情况返回false。

  •   SIGINT句柄接收到Ctrl+C命令来结束;
  •   被名称相同的节点提出ROS网络;
  •   ros::shutdown()被应用的另一部分唤醒。

  第18行:把消息通过主题发布出去。

  第19行:和下面test1_b.cpp程序ros::spin()进行对比,参考http://www.yfworld.com/?p=2318

 

  2、主题订阅节点

  在功能包中创建src/test1_b.cpp,并添加代码:


 1 #include "ros/ros.h"
 2 #include "std_msgs/String.h"
 3 
 4 void chatterCallback(const std_msgs::String::ConstPtr &msg)
 5 {
 6     ROS_INFO("Hello test1_a! I am test1_b. I heard:[%s]",msg->data.c_str());
 7 }
 8 
 9 int main(int argc, char **argv)
10 {
11     ros::init(argc,argv,"test1_b");
12     ros::NodeHandle n;
13     ros::Subscriber sub = n.subscribe("message",1000,chatterCallback);
14     ros::spin();
15 
16     return 0;
17 }  

  第4-7行:回调函数,当一个新消息到达指定主题时即调用。

  第17行:第一个参数指定订阅主题;第二个参数设置消息缓冲区的大小;第三个参数指定回调函数。

  订阅节点需要做四件事情:

  1)初始化;

  2)从主题订阅消息;

  3)然后等待消息到达;

  4)当消息到达时,chatterCallback()被回调。

 

  四、编译节点

  编辑CMakeLists.txt文件,在末尾处添加如下代码:


rosbuild_add_executable(test1_a src/test1_a.cpp)
rosbuild_add_executable(test1_b src/test1_b.cpp)  

 

  rosmake工具进行编译:


rosmake test1_tutorials  

 

  五、运行功能包

  在运行功能包前,请确认节点管理器已经打开。使用下面的命令运行:


roscore  

  在不同的终端窗口分别运行:


rosrun test1_tutorials test1_a
rosrun test1_tutorials test1_b  

  可以看到以下信息:

   

  

  六、参考

  http://wiki.ros.org/ROS/Tutorials

  《ROS机器人程序设计》 刘品杰 译

 

  (欢迎转载,转载请注明出处。)

转载于:https://www.cnblogs.com/xuanxiaochen/p/6013886.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS笔记——创建简单的主题发布节点和主题订阅节点 的相关文章

随机推荐

  • 【问题解决】SUMO——netedit编辑时键盘失效

    问题描述 xff1a 使用SUMO的netedit软件编辑路网信息的时候 xff0c 发现只能输入数字 xff0c 无法输入字符 解决方法 xff1a 将键盘模式切换成英文后 xff0c 就可以正常输入了
  • 用git命令行向gitee推送代码

    目录 1 生成个人公钥 2 在gitee上添加个人公钥 3 添加远程主机到本机SSH可信列表 4 提交本地文件 1 生成个人公钥 xff08 参考生成 添加SSH公钥 Gitee com xff09 打开git命令行 xff0c 输入命令
  • 【Anaconda环境】安装gym+pytorch

    1 创建conda新环境 conda create name gymTorch python 61 3 7 conda activate gymTorch xff08 进入新环境 xff09 python如果为3 6版本 xff0c 在导入
  • 【解决git报错 10054】OpenSSL SSL_read: Connection was reset, errno 10054

    使用git获取github上代码时报错 xff1a OpenSSL SSL read Connection was reset errno 10054 此时又必须开着vpn才能访问到github 参考网上的回答 xff0c 成功解决问题 x
  • 解决torch.from_numpy报错 (ValueError)

    变量screen的类型是numpy ndarray xff0c 使用如下代码想要将numpy数组转化为torch Tensor xff1a screen 61 torch from numpy screen 运行报错 xff1a Value
  • 【gym】env.render三种mode

    最近使用gym提供的小游戏做强化学习DQN算法的研究 xff0c 首先就是要获取游戏截图 xff0c 并且对截图做一些预处理 screen 61 env render mode 61 39 rgb array 39 上述代码是将游戏截图转换
  • python slice()函数

    slice函数会返回一个切片对象 xff0c 让数组按照该切片对象获取数据 参考自网站 xff1a Python slice 函数 菜鸟教程 slice的语法 xff1a class slice stop class slice start
  • 软件工程概论,课后作业1

    1 网站系统开发需要掌握的技术 在看了网上一些前辈的文章后 xff0c 我认为大体上有以下几点 至少熟悉一种建站程序 对空间和域名的知识有一定的了解 有一些美工基础 对编程有一些了解 代码知识基本的要懂 css 43 div会一点 简单的网
  • Debian11设置屏幕分辨率

    问题现象 xff1a 新的华硕计算机安装debian11后屏幕分辨率是1920 748并且无法修改 xff0c 换了显示屏和HDMI接口一样无法修改 使用 xrandr命令查询反馈 xrandr failed to get size of
  • matplotlib.pyplot.imshow()

    用matplotlib pyplot imshow x 函数将一个x矩阵转化为可显示的图像 这里需要注意的是x的数据类型 xff1a x为float xff0c 那么x的值要在0 1之间 xff1b x为int xff0c 那么x的值要在0
  • 使用telnet通过SMTP协议发送邮件

    1 确认本地电脑的telnet服务是否打开 2 查看邮箱授权码是否设置 在图片中有提示 xff0c 授权码是用于登录第三方邮件客户端的专用密码 xff0c 这样可以保护自己的密码不被泄露 xff0c 还能委托其他客户端进行邮件的操作 如果没
  • 在Linux环境下使用命令行编译运行C源文件

    1 安装gcc 首先如何确定是否已经安装gcc了呢 xff1f 如果有一个hello c的源文件 xff0c 那么使用命令gcc hello c 如果报出提示 xff0c command gcc not found就是代表没有安装这个程序
  • C语言的指针传递和C++的引用传递

    首先 xff0c C语言没有引用传递 C 43 43 中使用引用传递的方式是在函数的参数前加 amp 号 xff0c 如 xff1a void Delete X LinkList amp L ElemType x 声明 Delete X L
  • python 安装pandas失败的解决办法

    python 安装pandas失败的解决办法 1 首先用CMD进行安装 xff0c 安装失败 2 然后用pycharm进行安装 xff0c 同样也失败 图片省略 3 最后在pycharm中添加清华源网址 https pypi tuna ts
  • docker 容器的启动、停止和删除

    1 查看所有docker容器 查看所有在运行的容器 xff1a docker ps 查看所有容器 包括停止的 docker ps a 来看看他们的区别 xff1a 2 启动容器 这里我来启动第二个Redis容器 xff08 因为我已经有一个
  • 用real vnc连接服务器

    用real vnc连接服务器 xff08 一 xff09 在无法访问服务器内部网络 首先 xff0c 本地电脑需要可以ping通服务器的IP xff0c 像学校的服务器 xff0c 一般只能用学校的网络才能访问 xff0c 若在校外 xff
  • nginx配置ssl证书实现https访问

    配置ssl证书之前 xff0c 先准备SSL证书 xff0c 至于获取的途径很多 xff08 阿里云的服务 xff0c 第三方服务购买 xff09 这里不详细解释 以下是我的SSL证书 准备好证书后 xff0c 找到nginx的安装目录 x
  • 棋牌游戏算法——麻将系列总结

    麻将介绍 麻将的基本规则都是一样的 xff0c 我就不累赘了 我从事棋牌工作五年了 xff0c 开发过无数的麻将玩法 xff0c 如柳州麻将 xff0c 转转麻将 xff0c 红中麻将 xff0c 来宾麻将 xff0c 广东麻将 xff0c
  • Docker run 命令详解

    命令格式 xff1a docker run OPTIONS IMAGE COMMAND ARG Usage Run a command in a new container 中文意思为 xff1a 通过run命令创建一个新的容器 xff08
  • ROS笔记——创建简单的主题发布节点和主题订阅节点

    在安装好ROS后 xff0c 接着学习如何创建节点和节点之间的通信方式 xff0c 以一个简单的主题发布节点和主题订阅节点说明 节点是连接ROS网络等可执行文件 xff0c 是实现某些功能的软件包 xff0c 也是一个主要计算执行的进程 一