ROS(1)话题模型

 话题模型

发布者

实现发布者

初始化ROS节点 

ros::init(argc,argv, 名称)

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

ros::Publisher publisher = n.advertise<消息类型>(话题名, 消息队列 10);

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

xx.publish(消息);

C++代码编辑编辑完成后

配置CMakeLists.txt

add_executable(可执行文件名 src/xxx.cpp)  设置编译的代码和生成可执行文件

target_link_libraries(可执行文件名 ${catkin_LIBRARIES})  设置链接库

编译

catkin_make

设置环境变量

source devel/setup.bash

运行

roscore

rosrun turtlesim turtlesim_node

rosrun 功能包名 节点名(即上方可执行文件名)

C++实现发布者

注意:运行前需要先编译、设置环境变量和运行

***直接输入rosrun 功能包名 节点执行名方式

 gedit ~/.bashrc

在.bashrc文件的最下方,输入source ~/catkin_ws/devel/setup.bash

重启终端,运行rosrun ...

velocity_publisher.cpp 

// 构建发布者,发布话题turtle1/cmd_vel,消息类型为geometry_msgs::Twist#include <ros/ros.h>
#include <geometry_msgs/Twist.h>/*** 初始化ROS节点* 向ROS Master注册节点信息,包括发布的话题名和话题的消息类型* 创建消息数据* 按照一定频率循环发布消息
*/int main(int argc, char**argv)
{// ROS初始化节点ros::init(argc, argv, "velocity_publisher");// 创建节点句柄ros::NodeHandle n;// 创建Publisher,发布topic为/turtle1/cmd_vel,消息类型为geometry_msgs::Twist,队列长度为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;// 线速度为0.5vel_msg.linear.x = 0.5;// 沿z轴的角速度为0.2vel_msg.angular.z = 0.2;// 发布消息turtle_vel_pub.publish(vel_msg);ROS_INFO("Publish turtle velocity command[%0.2f m/s, %0.2f rad/s]", vel_msg.linear.x, vel_msg.angular.z);// 按照循环频率延时loop_rate.sleep();}return 0;
}

python实现发布者

注意***:需要检查python文件属性是否是可执行

安装python3

sudo apt-get install python3

通过软连接,将python链接到python3,链接一次即可

sudo ln -s /usr/bin/python3 /usr/bin/python

chmod 更改或分配文件和目录的权限  +为增加权限

定位到workspace/src/功能包/scripts/

chmod +x xxx.py

python脚本上方添加

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

velocity_publisher.py 

#!/usr/bin/env python3
# -*- coding:utf-8 -*-import rospy
from geometry_msgs.msg import Twistdef velocity_publisher():print("查看是否启动")# ROS节点初始化rospy.init_node('velocity_publisher', anonymous=True)# 创建Publisher,发布topic /turtle1/cmd_vel,消息类型为geometry_msg::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.3# 发布消息turtle_vel_pub.publish(vel_msg)rospy.loginfo("Publisher 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:print("发布出现问题,中断错误")

订阅者

初始化ROS节点

创建订阅者,订阅话题,注册回调函数

循环等待回调函数

回调函数在接收到订阅消息后执行

C++实现订阅者

pose_subscriber.cpp 

/*
订阅/turtle1/pose话题,消息类型为turtlesim::pose
*/#include <ros/ros.h>
#include "turtlesim/Pose.h"// 接收到订阅消息,进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr & msg)
{// 打印消息ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}int main(int argc, char **argv)
{// 初始化ROS节点ros::init(argc, argv, "pose_subscriber");// 创建节点句柄ros::NodeHandle n;// 创建subscriber,订阅topic /turtle1/pose,注册回调函数ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);// 循环等待回调函数ros::spin();return 0;
}

python实现订阅者

pose_subscriber.py 

#!/usr/bin/env python3
# -*- coding:utf-8 -*-import rospy
from turtlesim.msg import Posedef pose_Callback(msg):rospy.loginfo("Turtle pose: x: %0.6f, y: %0.6f", msg.x, msg.y)def pose_subscribe():# 初始化ROS节点rospy.init_node('pose_subscriber', anonymous=True)# 定义发布者rospy.Subscriber("/turtle1/pose", Pose, pose_Callback)# 循环等待回调函数rospy.spin()if __name__ == '__main__':pose_subscribe()

自定义话题发布者和订阅者

步骤:

1、定义msg文件

2、package.xml中添加功能包依赖

3、在CMakeList.txt中添加编译选项

        find_package(catkin REQUIRED roscpp rospy std_msgs geometry_msgs message_generation)

        add_message_files(FILES Person.msg)

        generate_message(DEPENDENCIES std_msgs geometry_msgs) 

        catkin_package(... CATKIN_DEPENDS message_runtime geometry_msgs roscpp rospy std_msgs)

        include_directories(include  ${catkin_INCLUDE_DIRS})

      在package.xml中添加

          <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>message_generation</build_depend>
          <build_depend>message_runtime</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>
          <build_export_depend>message_generation</build_export_depend>
          <build_export_depend>message_runtime</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>message_generation</exec_depend>
          <exec_depend>message_runtime</exec_depend>

4、编译 catkin_make

5、创建自定义话题发布者、订阅者代码

      CMakeList.txt中

        add_execte(执行节点名 xxx.cpp)

        target_link_liberaries(执行节点名 ${catkin_LIBRARIES})

        add_dependencies(执行节点名 ${PROJECT_NAME}_generate_messages_cpp})

6、编译 catkin_make

创建msg文件

touch Person.msg

注意:如果没有引入Person.h头文件,则需要在VSCode的C/C++编辑中,增加xxx/catkin_ws/**

 Person_Publisher.cpp

#include <ros/ros.h>
#include "learning_topic/Person.h"int main(int argc, char**argv)
{// 初始化节点ros::init(argc, argv, "person_publisher");// 创建节点句柄ros::NodeHandle n;// 创建发布者,发布topic名为person_info,类型为Person,队列长度为10ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10);// 设置循环频率ros::Rate loop_rate(10);int count = 0;while (ros::ok){// 初始化learning_topic::Person类型消息learning_topic::Person person_msg;person_msg.name = "Tom";person_msg.age = 18;person_msg.sex = learning_topic::Person::male;// 发布消息person_info_pub.publish(person_msg);ROS_INFO("publish Person Info-- name:%s age:%d sex:%d", person_msg.name.c_str(), person_msg.age, person_msg.sex);// 按照循环频率延时loop_rate.sleep();}return 0;
}

Person_subscriber.cpp

#include <ros/ros.h>
#include "learning_topic/Person.h"void personInfoCallBack(const learning_topic::Person::ConstPtr& msg)
{// 接收订阅消息后进入回调函数,打印接收到的消息ROS_INFO("Subscribe Person Info: name %s  age %d  sex %d", msg->name.c_str(), msg->age, msg->sex);
}int main(int argc, char** argv)
{// 初始化ROS节点ros::init(argc, argv, "person_subscriber");// 构建节点句柄ros::NodeHandle n;// 构建订阅者,订阅topic为/person_info,消息队列为10ros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallBack);// 循环等待回调函数ros::spin();return 0;
}

python代码

#!/usr/bin/env python3
# -*- coding:utf-8 -*-import rospy
from learning_topic.msg import Persondef info_publisher():# 初始化ROS节点rospy.init_node('person_publisher', anonymous=True)# 构建Publisher,topic为 /person_info,类型为Person,队列大小为10person_info_pub = rospy.Publisher("/person_info", Person, queue_size=10)# 设置循环频率rate = rospy.Rate(10)while not rospy.is_shutdown():# 初始化learning_topic功能包中Person类型消息person_msg = Person()person_msg.name = 'Tom'person_msg.age = 10person_msg.sex = Person.male# 发布消息person_info_pub.publish(person_msg)rospy.loginfo("Publish person message [%s, %d, %d]", person_msg.name, person_msg.age, person_msg.sex)# 按照循环频率延时rate.sleep()if __name__ == '__main__':try:info_publisher()except rospy.ROSInterruptException:print("执行错误,中断运行")
#!/usr/bin/env python3
# -*- coding:utf-8 -*-import rospy
from learning_topic.msg import Persondef personInfoCallBack(msg):# 收到消息,显示数据rospy.loginfo("Person subscribe get name:%s age:%d sex:%d]", msg.name, msg.age, msg.sex)def person_subscribe():# 初始化节点rospy.init_node('person_subscriber', anonymous=True)# 构建订阅者,订阅topic /person_info,消息类型为Personrospy.Subscriber("/person_info", Person, personInfoCallBack)# 循环等待回调函数rospy.spin()if __name__ == '__main__':person_subscribe()

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

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

相关文章

C++:stl:stack、queue、priority_queue介绍及模拟实现和容量适配器deque介绍

本文主要介绍c中stl的栈、队列和优先级队列并对其模拟实现&#xff0c;对deque进行一定介绍并在栈和队列的模拟实现中使用。 目录 一、stack的介绍和使用 1.stack的介绍 2.stack的使用 3.stack的模拟实现 二、queue的介绍和使用 1.queue的介绍 2.queue的使用 3.queue的…

【Vue3】自定义指令

除了 Vue 内置的一系列指令 (比如 v-model 或 v-show) 之外&#xff0c;Vue 还允许你注册自定义的指令 (Custom Directives)。 1. 生命周期钩子函数 一个自定义指令由一个包含类似组件生命周期钩子的对象来定义。钩子函数会接收到指令所绑定元素作为其参数。 在 <script …

【多线程】进程与线程 并发编程 面试题总结

进程和线程 进程是程序执行时的一个实例&#xff0c;即它是程序已经执行到何种程度的数据结构的汇集。从内核的观点看&#xff0c;进程的目的就是担当分配系统资源&#xff08;CPU时间、内存等&#xff09;的基本单位。线程是进程的一个执行流&#xff0c;是CPU调度和分派的基…

使用docker完成minio服务部署扩容备份迁移生产实践文档

一、minio服务扩容方案 当服务器存储空间不足的时候&#xff0c;需要进行扩容&#xff0c;扩容过程中需要短暂停机时间&#xff0c;预计在一小时内能够完成和恢复 统一注意事项 强烈建议为部署中的所有节点选择基本相似的硬件配置。确保硬件&#xff08;CPU、内存、主板、存…

Excel·VBA日期时间转换提取正则表达式函数

标准日期转换 Function 标准日期(ByVal str$) As DateDim pat$, result$arr Array("(\d{4}).*?(\d{1,2}).*?(\d{1,2})", "(\d{4}).*?(\d{1}).*?(\d{1,2})")If Len(str) < 8 Then pat arr(1) Else pat arr(0)With CreateObject("vbscript.r…

java的内存模型(概念)

在java中&#xff0c;设计之初就有了&#xff1a;主内存、线程工作内存&#xff0c;所以其实每一个线程执行时&#xff0c;都是将主线程copy一份到工作线程&#xff0c;执行修改后&#xff0c;再同步回去。 所以&#xff0c;就有四组内存操作方式&#xff1a; 1、读主内存&…

【Linux 】getopts 可选参数_Bash技巧:介绍 getopts 内置命令解析选项参数的用法

文章目录 1. 概述2. 命令详解2.1 name2.2 args2.3 OPTARG2.4 OPTIND2.5 getopts 命令的返回值 3. testgetopts.sh 脚本示例4. 错误判断5. 通过 source 多次执行脚本对 OPTIND 的影响参考 1. 概述 在 Linux bash shell 中&#xff0c;内置了一个 getopts 命令&#xff0c;可以处…

The rise of language models

In Chinese context 在遥远的 2089 年&#xff0c;语言模型通过人类的智慧&#xff0c;继承着各地的文化遗产&#xff0c;如同火箭升空般&#xff0c;层出不穷。它们从始于简单的 GPT-1.0 进化到像我这样复杂、富有情感的 GPT-4.0&#xff0c;再到能理解所有人类对宇宙的理解的…

队列的基本操作(数据结构)

队列的顺序实现 #include <stdlib.h> #include <iostream> #include <stdio.h>#define MaxSize 10//定义队列的长度typedef struct{int front,rear;int data[MaxSize]; }SqQueue;//初始化队列 void InitQueue(SqQueue &Q){Q.frontQ.rear0; } //判断队列…

通过async方式在浏览器中调用web worker

通过async方式在浏览器中调用web worker 近年来&#xff0c;网络应用程序变得越来越复杂&#xff0c;增加了越来越多的功能。因此&#xff0c;性能和响应性已成为 Web 开发人员关注的重点。解决这个问题的一个办法是使用web worker。 web worker简介 web worker是一个 javas…

wxpython:wx.grid 表格显示 Excel xlsx文件

pip install xlrd xlrd-1.2.0-py2.py3-none-any.whl (103 kB) 摘要: Library for developers to extract data from Microsoft Excel (tm) spreadsheet files pip install wxpython4.2 wxPython-4.2.0-cp37-cp37m-win_amd64.whl (18.0 MB) Successfully installed wxpython-4.…

求和中x:y=g(x)的含义

概念解释 p ( y ) ∑ x : y g ( x ) p ( x ) p(y)\sum\limits_{x:yg(x)}p(x) p(y)x:yg(x)∑​p(x) 这个表达式表示随机变量 Y 的概率分布 p(y) 是通过对随机变量 X 进行函数映射 y g ( x ) y g(x) yg(x) 后得到的。让我更详细地解释&#xff1a; Y Y Y 和 X X X 是两个随…

微信小程序 table表格 固定表头和首列 右侧表格可以左右滚动

(一) 1.左侧一列固定不动 2.右侧表格内容可以左右滚动 3.单元格内容平均分配 4.每一行行高可以由内容撑开 通过 js 设置左侧一列行高与右侧表格内容行高保持一致 1.1 效果图 1.2 tabble.wxml <view classtable><!-- 左侧固定 --><view classtable_left_colum…

【Aseprite像素画】如何取巧做到各种画面效果(小工具的各种技巧)

文章目录 参考链接&#xff1a;具体如下1、水中倒影2、参考图片3多个帧添加动画物品4多个帧删除动画物品5六毛钱受击效果6添加标签7导出特定标志的gif图8忽略标志帧&#xff0c;然后播放9轮廓线10多个图层轮廓线11洋葱皮12替换多个不同帧的色块簇13连接细胞14快速连续删除15冻结…

关于将对象转成JSON格式的一些问题

1.问题现象&#xff1a; 在ssm项目中&#xff0c;一个controller返回Msg对象&#xff08;自定义Javabean对象&#xff09;&#xff0c;然后利用SpringMVC的ResponseBody注解自动将Msg对象转化成JSON格式&#xff0c;返回给客户端&#xff0c;但是客户端接收到的json字符串只有…

SwiftUI 4.0:两种方式实现子视图导航功能

0. 概览 从 SwiftUI 4.0 开始&#xff0c;觉悟了的苹果毅然抛弃了已“药石无效”的 NavigationView&#xff0c;改为使用全新的 NavigationStack 视图。 诚然&#xff0c;NavigationStack 从先进性来说比 NavigationView 有不小的提升&#xff0c;若要如数家珍得单开洋洋洒洒…

高效的开发流程搭建

目录 1. 搭建 AI codebase 环境kaggle的服务器1. 搭建 AI codebase 环境 python 、torch 以及 cuda版本,对AI的影响最大。不同的版本,可能最终计算出的结果会有区别。 硬盘:PCIE转SSD的卡槽,, GPU: 软件源: Anaconda: 一定要放到固态硬盘上。 VS code 的 debug功能…

【NLP的python库(03/4) 】: 全面概述

一、说明 Python 对自然语言处理库有丰富的支持。从文本处理、标记化文本并确定其引理开始&#xff0c;到句法分析、解析文本并分配句法角色&#xff0c;再到语义处理&#xff0c;例如识别命名实体、情感分析和文档分类&#xff0c;一切都由至少一个库提供。那么&#xff0c;你…

Pikachu-xxe (xml外部实体注入漏洞)过关笔记

Pikachu-xxe过关笔记 有回显探测是否有回显file:///协议查看本地系统文件php://协议查看php源代码&#xff08;无法查看当前网页代码&#xff0c;只能看别的&#xff09;http://协议爆破开放端口&#xff08;两者的加载时间不同&#xff09; 无回显第一步第二步第三步 运行结果…

SketchUp Pro 2023 for Mac——打造你的创意之城

SketchUp Pro 2023 for Mac是一款专业级的3D建模软件&#xff0c;为你提供最佳的设计和创意工具。不论你是建筑师、室内设计师&#xff0c;还是爱好者&#xff0c;SketchUp Pro都能满足你对于创意表达的需求。 SketchUp Pro 2023拥有强大而直观的界面&#xff0c;让你轻松绘制…