【古月居《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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/205104.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE初阶】 HTTP 请求 (Request)详解

文章目录 &#x1f340;序言&#x1f384;认识URL&#x1f6a9;URL 基本格式&#x1f6a9;query string&#x1f6a9;关于 URL encode &#x1f334;认识 "方法" (method)&#x1f6a9;GET方法&#x1f6a9;POST 方法&#x1f6a9; GET 和 POST 的区别 &#x1f38b;…

云服务器-从零搭建前后端服务(自动化部署、数据库)

云服务器-从零搭建前后端服务&#xff08;自动化部署、数据库&#xff09; 免密登陆 第一步就是能免密快速登录到服务器 可以直接使用 FinalShell、MobaXterm 或 XShell 等进行连接 如下方法是直接用命令行操作 安装 Remote - SSH 插件&#xff0c;即可在 VSCode 中进行配置…

小辰的智慧树(差分+前缀和)

登录—专业IT笔试面试备考平台_牛客网 1.考虑总长度之和不能超过m&#xff0c;2考虑限制每棵树高度不能低于ci&#xff0c;如果用二分最短输能截到的高度&#xff0c;还要另外去判断&#xff0c;是否每棵树mid都能严格大于ci &#xff0c;这样容易超时&#xff0c;换个角度&…

设计一个算法,将链表中所有结点的链接方向“原地”逆转,即要求仅利用原表的存储空间,换句话说,要求算法的空间复杂度为O(1)

设计一个算法&#xff0c;将链表中所有结点的链接方向“原地”逆转&#xff0c;即要求仅利用原表的存储空间&#xff0c;换句话说&#xff0c;要求算法的空间复杂度为O&#xff08;1&#xff09; 代码思路&#xff1a; 这里要求不用额外空间&#xff0c;那么就要考虑链表自身的…

西工大网络空间安全学院计算机系统基础实验一(45678)

接着来看第4个函数&#xff0c;int replaceByte(int x, int n, int c)&#xff0c;看题目给出的例子&#xff0c;replaceByte(0x12345678,1,0xab) 0x1234ab78。我们可以多写几个例子&#xff0c;进而找出规律&#xff0c;比如&#xff1a; replaceByte(0x12345678,2,0xab) 0…

SASS的导入文件详细教程

文章目录 前言导入SASS文件使用SASS部分文件默认变量值嵌套导入原生的CSS导入后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Sass和Less &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努…

使用Terraform创建Docker镜像和容器

为了实现自动化操作&#xff0c;Terraform需要明确指定所使用的提供者。因此&#xff0c;在主要的main.tf文件中&#xff0c;需要提供提供者的名称、源和版本信息。对于Docker&#xff0c;可以在main.tf中使用以下代码块。 1 Terraform配置模块 使用块和资源创建Terraform脚本…

每日一题:LeetCode-202.面试题 08.06. 汉诺塔问题

每日一题系列&#xff08;day 07&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

QT搭建的Ros/librviz的GUI软件

1.前言 开发初期学习了下面博主的文章&#xff0c;也报了他在古月局的课&#xff0c;相当于感谢吧。 ROS Qt5 librviz人机交互界面开发一&#xff08;配置QT环境&#xff09;-CSDN博客​​​​​​​r 软件前期也是参考他的开源项目 GitHub - chengyangkj/Ros_Qt5_Gui_App …

Java核心知识点整理大全22-笔记

目录 19.1.14. CAP 一致性&#xff08;C&#xff09;&#xff1a; 可用性&#xff08;A&#xff09;&#xff1a; 分区容忍性&#xff08;P&#xff09;&#xff1a; 20. 一致性算法 20.1.1. Paxos Paxos 三种角色&#xff1a;Proposer&#xff0c;Acceptor&#xff0c;L…

【SpringBoot3+Vue3】五【完】【实战篇】-前端(配合后端)

目录 一、环境准备 1、创建Vue工程 2、安装依赖 2.1 安装项目所需要的vue依赖 2.2 安装element-plus依赖 2.2.1 安装 2.2.2 项目导入element-plus 2.3 安装axios依赖 2.4 安装sass依赖 3、目录调整 3.1 删除部分默认目录下文件 3.1.1 src/components下自动生成的…

GO 集成Prometheus

一、Prometheus介绍 Prometheus&#xff08;普罗米修斯&#xff09;是一套开源的监控&报警&时间序列数据库的组合&#xff0c;起始是由SoundCloud公司开发的。随着发展&#xff0c;越来越多公司和组织接受采用Prometheus&#xff0c;社会也十分活跃&#xff0c;他们便…

re:Invent 2023:PingCAP 荣获亚马逊云科技 2023 年度合作伙伴奖项

2023 年 11 月 27 日 – 12 月 1 日&#xff0c; 2023 亚马逊云科技 re:Invent 在拉斯维加斯举办&#xff0c;亚马逊云科技合作伙伴奖项在合作伙伴颁奖晚会上颁布&#xff0c; PingCAP 荣获亚马逊云科技大中华区 “2023 年度 ISV 合作伙伴” 和 “2023 年度亚马逊云科技 Market…

离散时间信号的分析(数字信号处理实验1-2)

前言&#xff1a;该系列实验均使用matlab完成&#xff0c;实验课程为《数字信号处理》 文章目录 一.题目二.实验目的三.实验仪器四.实验原理实验所用的matlab函数解析离散时间信号实验原理&#xff1a; 五.实验步骤六.实验代码及实验结果完整代码1.线性卷积代码2.循环卷积运算…

WordPress 外链跳转插件

WordPress 外链跳转插件是本站开发的一款WordPress插件&#xff0c;能对文中外链添加一层过滤&#xff0c;有效防止追踪&#xff0c;以及提醒用户。 类似于知乎、CSDN打开其他链接的提示。 后台可以设置白名单 学习资料源代码&#xff1a;百度网盘 密码&#xff1a;123

前端已死?看看我的秋招上岸历程

背景 求职方向&#xff1a;web前端 技术栈&#xff1a;vue2、springboot&#xff08;学校开过课&#xff0c;简单的学习过&#xff09; 实习经历&#xff1a;两段&#xff0c;但都是实训类的&#xff0c;说白了就是类似培训&#xff0c;每次面试官问起时我也会坦诚交代&…

蓝桥杯每日一题2023.11.28

题目描述 三羊献瑞 - 蓝桥云课 (lanqiao.cn) 题目分析 本题首先进行观察可以确定 1.“三”为 1 &#xff08;十进制数字要进位进一位&#xff09; 2.“祥”一定不为 0 &#xff08;有前导0就不能算为 4 位数&#xff09; 使用搜索时将其特判 #include<bits/stdc.h> …

SparkRDD及算子-python版

RDD相关知识 RDD介绍 RDD 是Spark的核心抽象&#xff0c;即 弹性分布式数据集&#xff08;residenta distributed dataset&#xff09;。代表一个不可变&#xff0c;可分区&#xff0c;里面元素可并行计算的集合。其具有数据流模型的特点&#xff1a;自动容错&#xff0c;位置…

蓝桥杯day02——移动机器人

1.题目 有一些机器人分布在一条无限长的数轴上&#xff0c;他们初始坐标用一个下标从 0 开始的整数数组 nums 表示。当你给机器人下达命令时&#xff0c;它们以每秒钟一单位的速度开始移动。 给你一个字符串 s &#xff0c;每个字符按顺序分别表示每个机器人移动的方向。L 表…

《opencv实用探索·四》Mat图像数据类型转换和归一化显示

一种数据类型转为另一种数据类型&#xff0c;不改变图像大小&#xff0c;但每个像素值可能会变 src.convertTo(dst, type, scale, shift);Scale和shitf默认为0&#xff08;这两个参数也相当于对比度和亮度&#xff09; 现在有个8位图像&#xff0c;把8位转成32位 可以看到像素…