【古月居《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.hqwc.cn/news/227713.html

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

相关文章

Mysql更新Blob存储的Josn数据

Mysql更新blob存储的Josn数据 记录一次mysql操作blob格式存储的json字符串数据 1、检查版本 -- 版本5.7以上才可以能执行json操作 select version(); 2、创建测试数据 -- 创建测试表及测试数据 CREATE TABLE test_json_table AS SELECT UUID(), {"test1": {"…

LLM大语言模型

大语言模型的定义 大语言模型&#xff08;英文&#xff1a;Large Language Model&#xff0c;缩写LLM&#xff09;&#xff0c;也称大型语言模型&#xff0c;是一种人工智能模型&#xff0c;旨在理解和生成人类语言。它们在大量的文本数据上进行训练&#xff0c;可以执行广泛的…

使用std::mutext与std::condition_variables实现信号量

1. 信号量的定义 2. 使用std::mutext与std::condition_variables实现信号量 代码来自&#xff1a;https://zhuanlan.zhihu.com/p/462668211 #ifndef _SEMAPHORE_H #define _SEMAPHORE_H #include <mutex> #include <condition_variable> using namespace std;cla…

编写安全 JavaScript 代码的最佳实践

编写安全 JavaScript 代码的最佳实践 JavaScript 的动态特性使其成为事实上的浏览器语言和世界上最流行的编程语言。 JS 最受欢迎的有用功能之一是即时分析。这意味着浏览器在下载内容的同时执行代码&#xff0c;这显然有其优势。然而&#xff0c;这种程度的自由也伴随着问题…

04_Flutter自定义Slider滑块

04_Flutter自定义Slider滑块 一.Slider控件基本用法 Column(mainAxisAlignment: MainAxisAlignment.start,children: <Widget>[Text("sliderValue: ${_sliderValue.toInt()}"),Slider(value: _sliderValue,min: 0,max: 100,divisions: 10,thumbColor: Colors.…

3种在ArcGIS Pro中制作山体阴影的方法

山体阴影可以更直观的展现地貌特点&#xff0c;表达真实的地形&#xff0c;这里为大家介绍一下在ArcGIS Pro中制作山体阴影的方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的DEM数据&#xff0c;除了DEM数据&#xff0c;常见的GIS数据…

在 Linux 中重命名文件和目录

目录 前言 使用 mv 命令重命名文件和目录 通过组合 mv、find 和 exec 命令重命名与某个模式匹配的多个文件 使用 rename 命令轻松重命名多个文件 总结 前言 在这篇基本命令行教程中&#xff0c;你将学习在 Linux 终端重命名文件和目录的各种方法。 如何在 Linux 终端中重命…

springcloud==openfeign

单独使用 创建一个服务端 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.Path…

小功能实现(十九)生成shp文件

引入依赖 <!--shp文件相关工具--><dependency><groupId>org.geotools</groupId><artifactId>gt-shapefile</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>org.geo…

C语言进阶指南(12)(数组指针与二维数组)

欢迎来到博主的专栏——C语言进阶指南 博主的id&#xff1a;reverie_ly 数组指针 数组指针的标准声明如下 type &#xff08;*parr&#xff09;[num] type是指针指向的数组的类型&#xff0c;[num]是指针指向的数组的元素大小。 顾名思义&#xff0c;数组指针就是用来指向数组…

Python的换行和转义:深入理解代码排版与字符串处理

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python的换行和转义&#xff1a;深入理解代码排版与字符串处理&#xff0c;全文2700字&#xff0c;阅读大约8分钟。 在Python编程中&#xff0c;正确使用换行和转义字符是保…

MySQL- CRUD

一、INSERT 添加 公式 INSERT INTO table_name [(column [, column...])] VALUES (value [, value...]); 示例&#xff1a; CREATE TABLE goods (id INT ,good_name VARCHAR(10),price DOUBLE ); #添加数据 INSERT INTO goods (id,good_name,price ) VALUES (20,华为手机,…