ROS学习第十二节——话题通信控制小乌龟
1.基操一下
首先打开小乌龟程序和键盘控制程序
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key


查看话题列表
rostopic list

打开计算图查看具体是那个话题在起作用
rqt_graph

从上图可以看到两个节点之间的话题是
/turtle1/cmd_vel
使用以下命令获取话题信息
rostopic info /turtle1/cmd_vel
Type: geometry_msgs/Twist
这就是该话题下挂载的信息
也可以通过以下命令直接查看
rostopic type /turtle1/cmd_vel

使用以下任意命令获取消息格式
rosmsg info geometry_msgs/Twist
rosmsg show geometry_msgs/Twist

打印出来乌龟键盘控制节点的话题
rostopic echo /turtle1/cmd_vel

2.话题发布
2.1终端实现
这里要实现一个小乌龟转圈圈的功能
这个其实可以通过终端实现,输入以下代码
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist


2.2C++代码实现
创建功能包
添加依赖的时候要另外加上
roscpp rospy std_msgs geometry_msgs


新建编程文件

编写一下代码
/*编写 ROS 节点,控制小乌龟画圆准备工作:1.获取topic(已知: /turtle1/cmd_vel)2.获取消息类型(已知: geometry_msgs/Twist)3.运行前,注意先启动 turtlesim_node 节点实现流程:1.包含头文件2.初始化 ROS 节点3.创建发布者对象4.循环发布运动控制消息*/#include "ros/ros.h"
#include "geometry_msgs/Twist.h"int main(int argc, char *argv[])
{setlocale(LC_ALL,"");// 2.初始化 ROS 节点ros::init(argc,argv,"control");ros::NodeHandle nh;// 3.创建发布者对象ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1000);// 4.循环发布运动控制消息//4-1.组织消息geometry_msgs::Twist msg;msg.linear.x = 1.0;msg.linear.y = 0.0;msg.linear.z = 0.0;msg.angular.x = 0.0;msg.angular.y = 0.0;msg.angular.z = 2.0;//4-2.设置发送频率ros::Rate r(10);//4-3.循环发送while (ros::ok()){pub.publish(msg);ros::spinOnce();}return 0;
}
修改配置文件
add_executable(control_turtle0_c src/control_turtle0_c.cpp)
target_link_libraries(control_turtle0_c${catkin_LIBRARIES}
)

运行观看效果


2.3Ptyon代码实现
创建编程文件并添加可执行权限,编辑配置文件

编写以下代码
#! /usr/bin/env python
# -*- coding: UTF-8 -*-
"""编写 ROS 节点,控制小乌龟画圆准备工作:1.获取topic(已知: /turtle1/cmd_vel)2.获取消息类型(已知: geometry_msgs/Twist)3.运行前,注意先启动 turtlesim_node 节点实现流程:1.导包2.初始化 ROS 节点3.创建发布者对象4.循环发布运动控制消息"""import rospy
from geometry_msgs.msg import Twistif __name__ == "__main__":# 2.初始化 ROS 节点rospy.init_node("control_circle_p")# 3.创建发布者对象pub = rospy.Publisher("/turtle1/cmd_vel",Twist,queue_size=1000)# 4.循环发布运动控制消息rate = rospy.Rate(10)msg = Twist()msg.linear.x = 1.0msg.linear.y = 0.0msg.linear.z = 0.0msg.angular.x = 0.0msg.angular.y = 0.0msg.angular.z = 0.5while not rospy.is_shutdown():pub.publish(msg)rate.sleep()
运行查看效果


3.话题订阅
3.1准备工作
使用最开始helloworld功能包里的launch文件

运行laucnh文件
查看目前所有话题
rostopic list

查看每个话题详细信息
rosmsgs info turtlesim/Pose

查看消息的具体格式
rosmsg info turtlesim/Pose

使用终端订阅话题/turtle1/pose
rostopic echo /turtle1/pose
3.2C++实现
因为这里要调用turtlesim功能包里面定义的消息类型,所以需要添加该功能包作为依赖
find_package(catkin REQUIRED COMPONENTSgeometry_msgsroscpprospystd_msgsturtlesim
)

<buildtool_depend>catkin</buildtool_depend><build_depend>geometry_msgs</build_depend><build_depend>roscpp</build_depend><build_depend>rospy</build_depend><build_depend>std_msgs</build_depend><build_depend>turtlesim</build_depend><build_export_depend>geometry_msgs</build_export_depend><build_export_depend>roscpp</build_export_depend><build_export_depend>rospy</build_export_depend><build_export_depend>std_msgs</build_export_depend><exec_depend>geometry_msgs</exec_depend><exec_depend>roscpp</exec_depend><exec_depend>rospy</exec_depend><exec_depend>std_msgs</exec_depend><exec_depend>turtlesim</exec_depend>

创建编程文件,修改配置文件
/* 订阅小乌龟的位姿: 时时获取小乌龟在窗体中的坐标并打印准备工作:1.获取话题名称 /turtle1/pose2.获取消息类型 turtlesim/Pose3.运行前启动 turtlesim_node 与 turtle_teleop_key 节点实现流程:1.包含头文件2.初始化 ROS 节点3.创建 ROS 句柄4.创建订阅者对象5.回调函数处理订阅的数据6.spin
*/#include "ros/ros.h"
#include "turtlesim/Pose.h"void doPose(const turtlesim::Pose::ConstPtr& p){ROS_INFO("乌龟位姿信息:x=%.2f,y=%.2f,theta=%.2f,lv=%.2f,av=%.2f",p->x,p->y,p->theta,p->linear_velocity,p->angular_velocity);
}int main(int argc, char *argv[])
{setlocale(LC_ALL,"");// 2.初始化 ROS 节点ros::init(argc,argv,"sub_pose");// 3.创建 ROS 句柄ros::NodeHandle nh;// 4.创建订阅者对象ros::Subscriber sub = nh.subscribe<turtlesim::Pose>("/turtle1/pose",1000,doPose);// 5.回调函数处理订阅的数据// 6.spinros::spin();return 0;
}

add_executable(sub_turtle1_c src/sub_turtle1_c.cpp)
target_link_libraries(sub_turtle1_c${catkin_LIBRARIES}
)

运行查看效果
source ./devel/setup.bash
roslaunch helloworld first_launch.launch
rosrun control_turtle0 sub_turtle1_c

https://mp.csdn.net/mp_download/manage/download/UpDetailed
3.2Python实现
创建编程文件,编写代码,编辑配置文件
#! /usr/bin/env python
"""订阅小乌龟的位姿: 时时获取小乌龟在窗体中的坐标并打印准备工作:1.获取话题名称 /turtle1/pose2.获取消息类型 turtlesim/Pose3.运行前启动 turtlesim_node 与 turtle_teleop_key 节点实现流程:1.导包2.初始化 ROS 节点3.创建订阅者对象4.回调函数处理订阅的数据5.spin"""import rospy
from turtlesim.msg import Posedef doPose(data):rospy.loginfo("乌龟坐标:x=%.2f, y=%.2f,theta=%.2f",data.x,data.y,data.theta)if __name__ == "__main__":# 2.初始化 ROS 节点rospy.init_node("sub_pose_p")# 3.创建订阅者对象sub = rospy.Subscriber("/turtle1/pose",Pose,doPose,queue_size=1000)# 4.回调函数处理订阅的数据# 5.spinrospy.spin()

catkin_install_python(PROGRAMSscripts/control_turtle0_p.pyDESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
catkin_install_python(PROGRAMSscripts/sub_turtle1_p.pyDESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
添加可执行权限,运行查看效果


https://mp.csdn.net/mp_download/manage/download/UpDetailed
相关文章:
ROS学习第十二节——话题通信控制小乌龟
1.基操一下 首先打开小乌龟程序和键盘控制程序 rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key 查看话题列表 rostopic list 打开计算图查看具体是那个话题在起作用 rqt_graph 从上图可以看到两个节点之间的话题是 /turtle1/cmd_vel 使用以下命令获…...
matlab点云的可视化-源码复制粘贴即可(一)
一、导入并可视化一个无属性的点云 clc; clear; close; % clear everything% Import a point cloud from a plain text file (run type(Lion.xyz) to see the contents of the file) pc pointCloud(Lion.xyz);% Generate a z-colored view of the point cloud pc.plot;% Set …...
反射-Class类分析
反射相关的主要类 java.lang.Class:代表一个类,Class对象表示某个类加载后在堆中的对象java.lang.reflect.Method:代表类的方法,Method对象表示某个类的方法java.lang.reflect.Field:代表类的成员变量,Fie…...
Let’s Make C++ Great Again——string与常用字符处理函数
文章目录 string使用string类的例子,统计一个字符串中单词的个数:在算法模拟题中翻转字符串:判断回文字符串:字符串查找:字符串替换: 常用字符处理函数strlen()strcpy()strcat()strcmp()toupper() 和 tolow…...
〖Python网络爬虫实战⑰〗- 网页解析利器parsel实战
订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付…...
中电金信:生成式AI热潮下,文本智能走向何方?
突破通用人工智能场景,生成式AI正在向全行业应用进攻。 一个脑筋急转弯,几个月前ChatGPT是这样回答的: 然而,仅仅几个月的迭代,它的回答却让人出乎意料。 看似调侃的对比背后实则是无数次模型训练的支撑。基于数据的激…...
探索Linux设备树:硬件描述与驱动程序的桥梁
目录标题 引言:Linux设备树简介 | Introduction: Linux Device Tree Overviewa. 设备树的背景与发展 | Background and Development of Device Treeb. 设备树的作用与意义 | The Role and Significance of Device Tree 设备树语法与结构 | Device Tree Syntax and S…...
UNION ALL用法 以及 UNION ALL和UNION的区别
部分参考自文章: https://blog.csdn.net/a200822146085/article/details/119545374(CC 4.0 BY-SA版权协议)CSDN「我心依依旧」 https://www.1keydata.com/cn/sql/sql-unionall.php SQL Union All SQL指令 UNION ALL用法 UNION ALL 这个指令的目的也是要将两个 SQL 语…...
Ubuntu Linux操作
引言 晚上上课发现桌子上遗留了这本书,水课就看了看学习下,以下内容直接总结知识点 磁盘内存解析 (1)硬盘有数个盘片,每个盘片两个面,每个面一个磁头。 (2)盘片被划分为多个扇形区域即扇区。 (3)同一盘片不同半径的同心圆为磁道。 (4)不同盘片相同半径…...
MongoDB常用语句(CURD)
文章目录 一、数据库操作二、集合操作三、文档操作3.1 插入文档3.2 查询文档3.3 更新文档3.4 删除文档 四、安全认证4.1 创建管理员账号4.2 创建应用数据库用户4.3 启动和连接 (校验方式) 提示:以下是本篇文章正文内容,MongoDB 系列学习将会持续更新 一…...
一篇文章让你彻底学会--节流(并且自己可以手写)
Hi,有的小伙伴们在面试的时候会被要求手写节流函数,很多都被难着了吧,宝贝,那你你没有理解节流函数。 今天,就让我带你攻克它! 1.节流 单位时间内,事件触发,最多只执行一次事件回调。 人话:说…...
C++ 形参是类的指针 class * 通过new的方式创建对象
当你在C中使用类指针(class *)作为函数的形参,并通过 new 关键字创建对象时,这种用法确实会改变类对象的值。原因是你通过指针传递了对象的内存地址,而不是传递对象本身。这意味着在函数内部对对象的任何修改都会直接影…...
手把手教你将项目部署到服务器!
一、导入centos7虚拟机: 打开VMWare,点击“打开虚拟机”,选择centos7.ova之后,选择存储路径: 点击导入: 选择“不再显示此消息”,点击“重试”按钮: 点击“编辑虚拟机设置”&#x…...
OpenHarmony应用开发-ArkUI方舟开发框架简析
方舟开发框架(简称ArkUI)为OpenHarmony应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能(组件、布局、动画以及交互事件),以及实时界面预览工具等,可以支持开发者进行可视化界…...
【Transformer系列(4)】Transformer模型结构超详细解读
前言 前一篇我们一起读了Transformer的论文《Attention Is All You Need》,不知道大家是否真的理解这个传说中的神(反正俺是没有~) 这两天我又看了一些视频讲解,感谢各位大佬的解读,让我通透了不少。 这篇文章就和…...
Idea启动运行报错:Error:java: 无效的源发行版: 13
最近在做Springboot项目时,常常出现上述错误,小编也不知道怎么回事,到网上找了这个方面的解决办法,但是却发现根本解决不了,最终通过小编多次尝试,终于发现,为什么会报这个错误。(应该是Java版本…...
【元分析研究方法】学习笔记1.形成问题
步骤1 形成问题 该步骤的作用该步骤中需要注意的问题该步骤中部分知识点我的收获 参考来源:库珀 (Cooper, H. M. )., 李超平, & 张昱城. (2020). 元分析研究方法: A step-by step approach. 中国人民大学出版社. 这章内容很简单:①变量的刻画&#x…...
2023年3月 青少年软件编程(Python) 等级考试试卷(五级)
一、单选题(共25题,共50分) 1.已知一个列表lst [2,3,4,5,6],lst.append(20),print(lst)的结果是?(C)(2分) A.[10,2,3,4,5,6,20] B.[20,2,10,3,4,5,6] C.[2,3,4,5,6,20] D.[2,3,4,5,…...
必须要知道的hive调优知识(上)
Hive数据倾斜以及解决方案 1、什么是数据倾斜 数据倾斜主要表现在,map/reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key的条数比其…...
什么是Cache Aside Pattern与延迟双删
Cache Aside Pattern是一种常用的缓存设计模式,用于在应用程序中使用缓存提高系统性能的同时,避免缓存与数据库数据不一致的情况出现。延迟双删是Cache Aside Pattern的一种优化,可以进一步提高系统性能。 以下是关于Cache Aside Pattern和延…...
2025最权威的AI辅助论文网站实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在学术研究跟论文写作这个领域当中,人工智能工具的兴起给学者和学生带来了从来没…...
终极M3U8视频下载神器:3步搞定加密流媒体!
终极M3U8视频下载神器:3步搞定加密流媒体! 【免费下载链接】m3u8-downloader 一个M3U8 视频下载(M3U8 downloader)工具。跨平台: 提供windows、linux、mac三大平台可执行文件,方便直接使用。 项目地址: https://gitcode.com/gh_mirrors/m3u8d/m3u8-do…...
Sunshine游戏串流终极指南:5步搭建你的私人云游戏服务器
Sunshine游戏串流终极指南:5步搭建你的私人云游戏服务器 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一款功能强大的开源游戏串流服务器,专为…...
别再只用DS18B20了!用51单片机+ADC0804做个PT100温度计,从硬件接线到代码调试保姆级教程
从DS18B20到PT100:51单片机高精度温度检测系统实战指南 1. 为什么选择PT100而非DS18B20? 在嵌入式温度检测领域,DS18B20确实因其即插即用的特性广受欢迎。但当我们面对工业级应用时,PT100铂电阻温度传感器展现出了不可替代的优势。…...
5个PoE Overlay技巧:从新手到交易专家的快速升级指南
5个PoE Overlay技巧:从新手到交易专家的快速升级指南 【免费下载链接】PoE-Overlay An Overlay for Path of Exile. Built with Overwolf and Angular. 项目地址: https://gitcode.com/gh_mirrors/po/PoE-Overlay 你是否曾在《流放之路》中为装备价值判断而困…...
天地协同:卫星如何成为5G物联网“组合拳”的关键一环
未来的物联网连接格局并非“卫星取代地面”或“地面压制卫星”的零和博弈,而是一个基于场景需求、优势互补的“组合式”解决方案。卫星连接的价值在于补充和增强更广泛的连接组合,与5G等地面蜂窝网络协同工作,共同构建一张无处不在、经济高效…...
物业临时工排班管理的技术破局:栎偲考勤神器的AI与离线方案详解
物业行业临时工排班管理长期面临三大技术痛点:人员流动性大导致班制匹配混乱、多场景打卡数据碎片化、中小企业部署成本高。作为专注考勤工具实测的博主,今天拆解栎偲考勤神器如何通过AI算法与轻量化技术,针对性解决物业临时工排班管理的核心…...
AI编程提示工程实战:从AwesomeCursorPrompt看高效开发与社区协作
1. 项目概述:从“Awesome”前缀看提示工程的社区实践在AI应用开发,特别是大语言模型(LLM)和AI助手交互的领域,一个清晰、结构化的提示(Prompt)往往决定了最终输出质量的80%。很多开发者都有过这…...
Verilog时钟分频:从原理到工程实践,避坑指南与最佳方案
1. 项目概述:为什么时钟分频是数字设计的基石在数字电路和FPGA设计里,时钟信号就像是整个系统的心跳。它驱动着寄存器、状态机和数据流,确保所有操作在正确的节拍下同步进行。但现实情况是,我们手头的时钟源往往只有一个固定的频率…...
ElevenLabs老年语音情感衰减难题破解(附可复用的Prosody增强JSON Schema与实测MOS提升2.1分)
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs老年男性语音情感衰减现象的本质剖析 ElevenLabs 的老年男性语音模型(如 “Antoni” 或 “Josh”)在高语速、长句或情绪密集场景下,常出现语调扁平化、微停…...
