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

【古月居《ros入门21讲》学习笔记】08_发布者Publisher的编程实现

目录

说明:

1. 话题模型

图示

说明

2. 实现过程(C++)

创建功能包

创建发布者代码(C++)

配置发布者代码编译规则

编译并运行

编译

运行

3. 实现过程(Python)

创建发布者代码(Python版本)

运行velocity_publisher.py文件

运行效果


说明:

1. 本系列学习笔记基于B站:古月居《ROS入门21讲》课程,且使用的Ubuntu与ROS系统版本与课程完全一致;

虚拟机版本Linux系统版本ROS系统版本
VMware WorkStation Pro 16Ubuntu18.04Melodic

2. 课程中的所有示例代码均已跑通,且对Pyhon版本的代码也都做了运行验证,并附带验证过程(错误均已修正);

3. 本节是整个笔记的第8节,对应视频课程的第10节,请自行对应学习;

4. 整个系列笔记基本已经完结,但部分章节仍需润色修改 ,后面会陆续发布,请大家持续关注,      创作不易,感谢支持!

1. 话题模型

图示

image-20230523133716960

说明

ROS Master:管理所有节点

主要节点:

Publisher(Turtle Velocity): 消息的发布者,后面会通过程序(c++,py)实现发布者发布一个速度消息数据;

Message(geometry_msgs::Twist): 发布者发布的消息数据,Twist会分为线速度和角速度;

Topic(/turtle1/cmd_vel): 消息传输管道,将发布者发布的消息数据传输给订阅者,

让Subscriber(turtlesim)订阅者得到这个消息数据;

Subscriber(turtlesim): 消息的订阅者(海龟仿真器),Subscriber(turtlesim)接收到通过

Topic(/turtle1/cmd_vel)传输来的消息数据Message(geometry_msgs::Twist),

控制海龟的运动。

2. 实现过程(C++)

创建功能包

cd ~/catkin_ws/src
catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim

image-20230522155047806

创建发布者代码(C++)

cd ~/catkin_ws/src/learning_topic/src   
touch velocity_publisher.cpp

  • 初始化ROS节点;

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

  • 创建消息数据;

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

/*** 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist*/#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
​
int main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, "velocity_publisher");
​// 创建节点句柄ros::NodeHandle n;
​// 定义一个名为turtle_vel_pub的发布者,发布的消息类型为geometry_msgs::Twist,订阅名为/turtle1/cmd_vel的话题,// 队列长度10ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
​// 设置循环的频率ros::Rate loop_rate(10);
​int count = 0;while (ros::ok()){// 初始化geometry_msgs::Twist类型的消息geometry_msgs::Twist vel_msg;vel_msg.linear.x = 0.5;vel_msg.angular.z = 0.2;
​// 发布消息turtle_vel_pub.publish(vel_msg);ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", vel_msg.linear.x, vel_msg.angular.z);
​// 按照循环频率延时loop_rate.sleep();}
​return 0;
}
​

  • 切换工作路径到~/catkin_ws/src/learning_topic/src目录下;

  • 创建代码文件velocity_publisher.cpp;

  • 复制代码到文件中并保存

image-20230523145339517

配置发布者代码编译规则

将下面两行代码复制到CMakeLists.txt文件中,

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

上面两行代码的作用:

add_executable: 将src/velocity_publisher.cpp代码文件编译成velocity_publisher可执行文件;

target_link_libraries:把编译生成的可执行文件velocity_publisher跟ROS相关的一些库做连接的,比如调用的C++的接口。

代码要复制到CMakeLists.txt文件中的位置如下:

image-20230523154744467

编译并运行

编译
cd ~/catkin_ws
catkin_make
source devel/setup.bash

  • 先把工作路径切换到catkin_ws工作空间目录下;

  • 在catkin_ws工作空间目录下catkin_make编译代码文件;

  • source devel/setup.bash 设置环境变量(此步骤很重要,不设置找不到工作空间下功能包的路径);

如果不想每次运行程序时都要执行setup.bash文件或怕忘记此步骤,可以把source devel/setup.bash添加到 .bashrc文件中,

.bashrc文件是一个隐藏文件,回到home目录下,ctrl + h,会显示所有的隐藏文件,

注意修改路径,修改路径后具体添加的内容:source /home/自己的用户名/catkin_ws/devel/setup.bash,

添加位置在 .bashrc文件最下面,添加后记得保存,再ctrl + h,恢复隐藏文件,最后要重新启动终端,修改才能生效。

image-20230524090852062

image-20230524104903343

运行
roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic velocity_publisher

经过上述对.bashrc文件的修改,我们可以在任意的路径下运行我们编译出来的结果文件:过程如下:

  • 打开任意终端输入:roscore;

  • 运行海龟仿真器,再打开一个新终端输入:rosrun turtlesim turtlesim_node;

  • 运行我们编译好的可执行文件,再打开一个新终端输入:rosrun learning_topic velocity_publisher,

这个程序会发布速度指令(包括线速度0.5m/s 和 角速度0.2m/s),使海龟按圆周运动转起来。

image-20230524111932663

我们上面运行的可执行文件的位置在 home/catkin_ws/devel/lib/learning_topic 目录下

image-20230524112734939

3. 实现过程(Python)

创建发布者代码(Python版本)

cd ~/catkin_ws/src/learning_topic
mkdir scripts
cd ~/catkin_ws/src/learning_topic/scripts
touch velocity_publisher.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twistimport rospy
from geometry_msgs.msg import Twistdef velocity_publisher():# ROS节点初始化rospy.init_node('velocity_publisher', anonymous=True)# 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10turtle_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)#设置循环的频率rate = rospy.Rate(10) while not rospy.is_shutdown():# 初始化geometry_msgs::Twist类型的消息vel_msg = Twist()vel_msg.linear.x = 0.5vel_msg.angular.z = 0.2# 发布消息turtle_vel_pub.publish(vel_msg)rospy.loginfo("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", vel_msg.linear.x, vel_msg.angular.z)# 按照循环频率延时rate.sleep()if __name__ == '__main__':try:velocity_publisher()except rospy.ROSInterruptException:pass

  • 先把工作路径切换到~/catkin_ws/src/learning_topic目录下;

  • 创建放置Python代码版本发布者的代码文件的文件夹scripts;

image-20230524125421990

  • 进入scripts文件夹下并创建velocity_publisher.py文件;

  • 双击打开velocity_publisher.py文件,复制代码到里面并保存

image-20230524125514700

注意:在ROS中运行python文件,要使其有作为程序文件执行的权限,

点击velocity_publisher.py文件,右键,属性,权限,勾选(允许作为程序文件执行),

python文件不需要编译,直接运行即可。

image-20230524125621567

运行velocity_publisher.py文件

roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic velocity_publisher.py

运行流程和上面c++一样, 只不过把第三步的命令velocity_publisher文件名加上.py后缀

rosrun learning_topic velocity_publisher.py

运行效果

image-20230524130005724


相关文章:

【古月居《ros入门21讲》学习笔记】08_发布者Publisher的编程实现

目录 说明&#xff1a; 1. 话题模型 图示 说明 2. 实现过程&#xff08;C&#xff09; 创建功能包 创建发布者代码&#xff08;C&#xff09; 配置发布者代码编译规则 编译并运行 编译 运行 3. 实现过程&#xff08;Python&#xff09; 创建发布者代码&#xff08;…...

沿着马可·波罗的足迹,看数字云南

刚入行的时候&#xff0c;有位前辈跟我说过一句话&#xff1a;去现场“要像外国人一样去看”&#xff0c;重新审视那些自己可能早已“熟视无睹”的事物。 前不久&#xff0c;我跟随“看见数字云南——云南数字经济媒体探营活动”&#xff0c;奔赴昆明、大理、西双版纳等地&…...

记录问题-使用@Validated报错Validation failed for argument [0]

类字段 NotNull(message "双坐标不能为空", groups {Insert.class, Update.class})private Integer yAxisType;接口 /*** 添加** return*/RequestMapping(value "/add", method RequestMethod.POST)public Result add(Validated(Insert.class) Request…...

three.js--立方体

作者&#xff1a;baekpcyyy&#x1f41f; 使用three.js渲染出可以调节大小的立方体 1.搭建开发环境 1.首先新建文件夹用vsc打开项目终端 2.执行npm init -y 创建配置文件夹 3.执行npm i three0.152 安装three.js依赖 4.执行npm I vite -D 安装 Vite 作为开发依赖 5.根…...

App的测试,和传统软件测试有哪些区别?应该增加哪些方面的测试用例?

从上图可知&#xff0c;测试人员所测项目占比中&#xff0c;App测试占比是最高的。 这就意味着学习期间&#xff0c;我们要花最多的精力去学App的各类测试。也意味着我们找工作前&#xff0c;就得知道&#xff0c;App的测试点是什么&#xff0c;App功能我们得会测试&#xff0…...

改进LiteOS中物理内存分配算法(详细实验步骤+相关源码解读)

一、实验要求 优化TLSF算法&#xff0c;将Best-fit策略优化为Good-fit策略&#xff0c;进一步降低时间复杂度至O(1)。 优化思路&#xff1a; 1.初始化时预先为每个索引中的内存块挂上若干空闲块&#xff0c;在实际分配时避免分割&#xff08;split&#xff09;操作&#xff…...

洛谷100题DAY8

36.P1416 攻击火星 此题找出规律即可 #include<bits/stdc.h> using namespace std; int n; int main() {cin >> n;cout << max(0, n - 2);return 0; } 37.P1551 亲戚 并查集模板题目 两个人如果使亲戚就合并建立联系&#xff0c;最后进行查找即可 #incl…...

2. OpenHarmony源码下载

OpenHarmony源码下载(windows, ubuntu) 现在的 OpenHarmony 4.0 源码已经有了&#xff0c;在 https://gitee.com/openharmony 地址中&#xff0c;描述了源码获取的方式。下来先写下 windows 的获取方式&#xff0c;再写 ubuntu 的获取方式。 获取源码前&#xff0c;还需要的准…...

flask app.config 用法

flask app.config flask app.config 是 Flask 应用程序的配置对象。它包含了 Flask 应用程序的所有配置信息&#xff0c;如数据库连接、密钥、调试模式等。 常用的 app.config 配置项如下&#xff1a; DEBUG&#xff1a;调试模式&#xff0c;默认为 False。 SECRET_KEY&…...

【Vue】【uni-app】实现工单列表项详情页面

这次主要实现的是一个工单详情页面 从工单列表项中点击详情 跳转到工单详情页面&#xff0c;这个详情页面就是这次我们要实现的页面&#xff0c;并可以通过点击这个关闭按钮返回到工单列表页面 首先是在我们原有的工单列表页面的按钮增加一个点击跳转 <button size"m…...

安装vmware_esxi 超详细

安装vmware_esxi 超详细 </h2><div id"cnblogs_post_body" class"blogpost-body blogpost-body-html">esxi安装手册 1、esxi介绍 ESXI原生架构模式的虚拟化技术&#xff0c;是不需要宿主操作系统的&#xff0c;它自己本身就是操作系统。因此…...

Spring-Mybatis源码解析--手写代码实现Spring整合Mybatis

文章目录 前言一、引入&#xff1a;二、准备工作&#xff1a;2.1 引入依赖2.2 数据源的文件&#xff1a;2.1 数据源&#xff1a; 2.3 业务文件&#xff1a; 三、整合的实现&#xff1a;3.1 xxxMapper 接口的扫描&#xff1a;3.2 xxxMapper 接口代理对象的生成&#xff1a;3.2 S…...

5.2 Windows驱动开发:内核取KERNEL模块基址

模块是程序加载时被动态装载的&#xff0c;模块在装载后其存在于内存中同样存在一个内存基址&#xff0c;当我们需要操作这个模块时&#xff0c;通常第一步就是要得到该模块的内存基址&#xff0c;模块分为用户模块和内核模块&#xff0c;这里的用户模块指的是应用层进程运行后…...

聊聊Go语言的注释

文章目录 聊聊Go语言的注释一、注释的格式1.1 块注释1.2 行注释 二、包注释三、命令注释四、类型注释4.1 实例注释4.2 并发安全注释4.3 零值注释4.4 导出字段注释 五、函数注释5.1 参数/返回值/函数作用注释5.2 bool返回值函数注释5.3 形参/返回值名称注释5.4 并发安全注释5.5 …...

皮肤警告,羊大师讲解身体与环境的默契

皮肤警告&#xff0c;羊大师讲解身体与环境的默契 我们常常忽视身体皮肤所承受的压力和警告信号。皮肤是身体的第一道屏障&#xff0c;也是与外界环境直接接触的组织。我们的皮肤通过各种方式向我们传达信息&#xff0c;警告我们关于身体健康的重要问题。本文小编羊大师将带大…...

使用NVM管理多个Nodejs版同时支持vue2、vue3

1.安装nvm,下载地址&#xff1a; https://github.com/coreybutler/nvm-windows/releases/tag/1.1.12 2.nvm常用命令 Usage:nvm arch : Show if node is running in 32 or 64 bit mode.nvm current : Display active version.nvm debug …...

Android帝国之进程杀手--lmkd

本文概要 这是Android系统启动的第三篇文章&#xff0c;本文以自述的方式来讲解lmkd进程&#xff0c;通过本文您将了解到lmkd进程在安卓系统中存在的意义&#xff0c;以及它是如何杀进程的。&#xff08;文中的代码是基于android13&#xff09; 我是谁 init&#xff1a;“大…...

堆栈_队列实现栈

//请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 // // 实现 MyStack 类&#xff1a; // // // void push(int x) 将元素 x 压入栈顶。 // int pop() 移除…...

好用的json处理工具He3 JSON

官网地址&#xff1a;https://he3app.com/zh/ json格式化 https://portal.he3app.com/home/extension/json-to-pretty 其他 https://portal.he3app.com/home/category...

RabbitMQ消息模型之Routing-Direct

Routing Direct 在Fanout模式中&#xff0c;一条消息&#xff0c;会被所有订阅的队列都消费。但是在某些场景下&#xff0c;我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 在Direct模型下&#xff1a; 队列与交换机的绑定&#xff0c;不能是任意…...

Go语言竞态检测:race条件

Go语言竞态检测&#xff1a;race条件 1. race检测 go test -race ./...2. 总结 -race检测器可以发现代码中的数据竞争。...

Keil µVision许可证失效问题解析与解决方案

1. 问题现象与背景解析最近遇到一个挺有意思的案例&#xff1a;一位工程师在安装了Windows Media Center后&#xff0c;突然发现Keil Vision IDE变成了评估版模式。这种情况其实在嵌入式开发领域并不罕见&#xff0c;但很多开发者第一次遇到时都会感到困惑。本质上&#xff0c;…...

WPF工业上位机开发:高DPI、多线程与MVVM在产线抽奖系统中的实战

1. 这不是玩具&#xff0c;是真实产线里跑过的抽奖系统——WPF上位机开发的底层逻辑“抽奖软件”四个字听起来轻飘飘的&#xff0c;像年会抽个iPad、团建转个幸运大转盘。但如果你真在工厂自动化产线上干过&#xff0c;就会明白&#xff1a;所谓“抽奖”&#xff0c;本质是一套…...

WSL2开发环境部署

系统要求 安装前需要确保设备满足以下条件: 操作系统: Windows 10版本2004(内部版本19041)或Windows 11(按Win R输入winver查看版本)。硬件: 64 位处理器(需要在BIOS中启用虚拟化,Intel VT-x/AMD-V) 至少4GB内存(推荐8GB)。 20GB以上存储空间(建议SSD)。 启用必要功能 …...

告别高分屏适配烦恼:从开发者视角详解Win10/Win11程序属性中的DPI设置原理

告别高分屏适配烦恼&#xff1a;从开发者视角详解Win10/Win11程序属性中的DPI设置原理在4K/5K显示器逐渐成为主流的今天&#xff0c;Windows开发者面临着一个看似简单却暗藏玄机的问题&#xff1a;为什么同一个应用在不同分辨率的屏幕上显示效果天差地别&#xff1f;更令人困惑…...

Codex入门17-上下文管理(高手秘技:如何让AI精准理解你的百万行大型项目)

Codex入门17-上下文管理(高手秘技:如何让AI精准理解你的百万行大型项目) 📌 文章简介:上下文窗口是 AI 编程的"生命线"——它决定了 AI 能"看到"多少代码、"理解"多少架构。本文深入解析上下文窗口的本质,详解 Codex 如何自动收集项目信息…...

GCN vs MLP:在Cora数据集上,图神经网络到底强在哪?(附可视化对比)

GCN与MLP在Cora数据集上的本质差异&#xff1a;从特征聚合到空间重构的认知升级当我们面对学术文献分类任务时&#xff0c;传统机器学习方法往往将每篇文献视为独立个体进行处理。这种处理方式在Cora数据集上通常只能获得约50%的分类准确率&#xff0c;而图卷积网络(GCN)却能轻…...

避坑指南:在openEuler 22.03上配置vsftpd虚拟用户,解决PAM认证和SELinux权限问题

深度实战&#xff1a;openEuler 22.03中vsftpd虚拟用户配置全流程与疑难解析 在服务器运维领域&#xff0c;FTP服务作为经典的文件传输方案&#xff0c;其安全配置一直是系统管理员的核心技能。本文将聚焦openEuler 22.03操作系统环境&#xff0c;深入剖析vsftpd虚拟用户模式的…...

[SpringBoot 对象存储实战]:预签名 URL 直传 OSS 全流程设计与实现

&#x1f525;你好我是fengxin_rou这是我的个人主页fengxin_rou的主页 ❄️欢迎查看我的专栏我的专栏 《Java后端学习》、《JAVASE基础》、《JUC并发》、《redis》、《JVM虚拟机》、《MYSQL》、《黑马点评》、《rabbitmq》、《JavaWebAI的talis学习系统》、《苍穹外卖》 目录…...

【ChatGPT小红书爆款文案公式】:20年AI内容专家亲授3步生成高互动率文案(附17个真实转化数据)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;ChatGPT小红书爆款文案的核心认知 小红书平台的内容生态高度依赖「真实感」「强共鸣」与「高信息密度」三重底层逻辑。ChatGPT生成的文案若直接照搬通用模板&#xff0c;极易因缺乏人设锚点、场景细节和情绪节…...