当前位置: 首页 > news >正文

挑战一周学会ROS(第二天)

以小海龟为例

查看话题列表

rosnode list

发布话题消息

rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist"linear:

x:1.0

y:0.0

z:0.0

angular:

x:0.0

y:0.0

z:0.0"

发布服务请求

rosservice call /spawn :x:5.0

y:5.0

theta:0.0

name:'turtle2'"

话题记录rosbag record -a-O cmd_record

话题复现rosbag play cmd_record.bag

工作空间是一个存放工程开发相关文件的文件夹

src:代码空间

build:编译空间

devel:开发空间

install:安装空间

创建工作空间:

mkdir -p ~/catkin_ws/src

cd ~/catkin_ws/src

catkin_init_workspace

cd ~/catkin_ws/

catkin_make

source devel/setup.bash

echo $ROS_PACKAGE_PATH

如何实现一个发布者

初始化ROS节点

向ROS Master注册节点信息,包括发布的话题名还有话题中的消息类型

创建消息数据

按照一定频率循环发布消息

如何实现一个订阅者

初始化ROS节点

订阅需要的话题

循环等待话题消息,接收到消息后进入回调函数

在回调函数中完成消息处理

如何实现一个客户端

初始化ROS节点

创建一个Client实例

发布服务请求数据

等待Server处理之后的应答结果

角色通信模式适用场景是否需要回复
Publisher 发布者话题、持续流式广播传感器高频数据(激光、图像、里程计)、持续速度指令无回复,单向发送
Client 客户端服务、单次请求响应单次指令、状态查询、开关控制、带反馈操作必须等待服务端返回结果

当你需要主动发起一次性任务、查询数据,并且需要获取执行结果反馈时,必须创建客户端Client

虽然只会用到一个软件包里面的某个节点但是下载时候还是会把整个包都下载下来,节点不能脱离包而单独存在

创建Package软件包

创建在~/catkin_ws/src文件夹里面

catkin_create_pkg<包名><依赖项名> 用catkin工具创建一个Package软件包

rospy roscpp std_msgs 这三个为依赖包,即通用项

指令

roscd 在终端中进入指定软件包的文件地址

这个地址里面存放的全是ROS的Package包

这些包的来源

/opt/ros/<ROS版本>/share 软件包来源

sudo apt-get install ros-<ROS版本>-desktop-full 基础包

sudo apt-get install ros-<ROS版本>-xxx 独立扩展包

而这些通过apt下载的这些软件包都是现成的可执行文件,可以直接运行,而catkin工作空间的软件包都是源码文件,需要编译成可执行文件才能运行

像这样成功编译

下面运行第一个ros节点

先启动roscore

确定ROS核心处于运行状态

终端执行 rosrun <包名> <节点文件名>

恭喜你!第一个node程序成功出现

ctrl shift +w 可以强制终止该终端

欧克终于结束一个简单的Package 和node

步骤大致如下:

1、使用catkin_create_pkg创建一个软件包

2、在软件包的src文件夹下创建一个cpp源码文件

3、在节点的源码文件中include包含ros的头文件

4、构建一个main函数,并在函数的开头执行ros::init()初始化

5、构建while循环,循环的条件为ros::ok()

6、在CMakeLists.txt中设置节点源码的编译规则

7、编译运行

下面开始Topic话题还有Message消息(ROS的主要通信方式)

在ROS中的众多节点是如何通讯的

1、话题Topic是节点之间进行持续通讯(消息在一直不停的发送接收)的一种形式

2、话题通讯的两个节点通过话题的名称建立起话题通讯连接

3、话题中通讯的数据,叫消息(message)

4、消息message通常会按照一定的频率持续不断的发送,以保证消息数据的实时性

5、消息的发送方叫做话题的发布者Publisher

6、消息的接收方叫做话题的订阅者Subsciber

补充:

一个ROS节点网络中,可以同时存在多个话题

一个话题可以多个发布者,也可以有多个订阅者

一个节点可以对多个话题进行订阅,也可由发布多个话题

不同的传感器消息通常会拥有各自独立话题名称每个话题只有一个发布者

机器人速度指令话题通常会有多个发布者,但是同一时间只能有一个发言人

我们在生成消息包的时候通常有不同的类型

调整发送频率

发布一个话题和发送消息的操作

小结:

1、确定话题名称和消息类型(话题名称不能使用中文字符,否则会报错)

2、在代码文件中include消息类型对应的头文件

3、在mian函数中通过Nodehandler大管家发布一个话题并得到消息发送对象

4、生成要发送的消息包并进行发送数据的赋值

5、调用消息发送对象的publish()函数将消息包发送到话题当中

常用指令

rostopic list 列出当前系统中所有活跃着的话题

rostopic echo 主题名称 显示指定话题中发送的消息包内容

rostopic hz 主题名称 统计指定话题中消息包的发送频率(检测一个话题是否有消息在发送,以及发送的频率是否符合需求)

这样的话两者之间的话题通讯就算完成了

话题订阅

1、确定话题的名称和消息类型

2、在代码文件中include<ros.h>和消息类型对应的头文件

3、在main函数中通过NodeHandler大管家订阅一个话题并设置消息接收回调函数

4、定义一个回调函数,对接收到的消息包进行处理

5、main函数中需要执行ros::spinOnce(),让回调函数能够响应接收到的消息包

常用工具

rqt_graph

图形化显示当前系统活跃的节点以及节点之间的话题通讯关系

使用launch文件一次启动多个节点

xml语法:

<标记名称 属性名1="属性值1" ...>内容</标记名称>

http://www.cnnetsun.cn/news/3359387.html

相关文章:

  • 从让 AI 写代码到让 AI 按规则工作:嵌入式工程师的实践思考
  • 基于XGBoost+LSTM双模型的股票预测系统——“智语析金”智能投研平台
  • VC++机器视觉实战:从OpenCV集成到工业级算法优化
  • 【提示词工程 03 对话模型对齐】从基础模型到可用助手的演进
  • 21-缓存越用越脏-给本地数据加版本过期和重建策略
  • AI Token工厂爆发:清华师生创业半年融资10亿,背后是门什么生意
  • 现代C++软件架构设计:从核心原则到工程实践
  • AI 前沿日报 | 2026年7月13日
  • RAG中PDF文档的处理和存储(二):Markdown文档的分块处理与入库
  • 运算符与表达式
  • 工业信号采集:FOD4216光耦与PIC18F25J11的抗干扰方案
  • HybridCLR热更新开发中UnityLinker.exe报错的系统性排查与解决方案
  • 施工企业合同管控工具测评:蓝燕云全生命周期管理能力
  • Visual C++控制台编程实战:CmdTool工具包设计与实现
  • C#贪吃蛇实战:从零到8KB的零分配与Native AOT优化
  • 爬虫监控与告警系统——成功率/延迟/异常监控与Prometheus+Grafana实战
  • Helloagent chapter8 ragmemory
  • gdb调试基础
  • C++封装libpng与SDL2实现轻量PNG图像处理类
  • C盘清理全攻略:从基础操作到进阶技巧,安全释放30G+空间
  • 项目实战:从零构建Java+MySQL图书借阅系统(Swing版)
  • 智能代理技能(Agent Skills)开发指南与技术解析
  • 企业级AI Agent落地:从模型能力到工程体系的跨越
  • 单片机DAY_2
  • L9958与TM4C1294NCZAD电机控制方案解析
  • Chapter 2 The Well: Navigating Parasitics and Performance in CMOS Fabrication
  • Lua C接口封装设计:构建安全高效的C/C++与Lua双向通信桥梁
  • RoPE旋转位置编码原理与工程实践:从数学本质到CUDA优化
  • 本地AI音乐生成实战:为游戏开发打造史诗级战斗配乐
  • Mythos:AI原生安全时代的数字安全分析师