【RK3399Pro学习笔记】八、ROS话题消息的定义与使用

目录

  • 自定义话题消息
    • 定义msg文件
    • 在package.xml中添加功能包依赖
    • 在CMakeLists.txt添加编译选项
    • 编译
    • 结果
  • 使用
    • C++
      • 编写程序
        • person_publisher.cpp
        • person_subscriber.cpp
      • 配置CMakeLists.txt
      • 编译并运行
    • python
      • 编写程序
        • person_publisher.py
      • 运行

平台:华硕 Thinker Edge R 瑞芯微 RK3399Pro
固件版本:Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615


记录自【古月居】古月·ROS入门21讲 | 一学就会的ROS机器人入门教程 —— 古月居GYH P12 12.话题消息的定义与使用

自定义话题消息

定义msg文件

cd ~/catkin_workspace/src/learning_topic
mkdir msg
nano ~/catkin_workspace/src/learning_topic/msg/Person.msg
string name
uint8  age
uint8  sexuint8 unknown = 0
uint8 male    = 1
uint8 female  = 2

在package.xml中添加功能包依赖

nano ~/catkin_workspace/src/learning_topic/package.xml
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

在这里插入图片描述

在CMakeLists.txt添加编译选项

...
find_package(... message_generation) 
...
add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)
...
catkin_package(... message_runtime)
...
nano ~/catkin_workspace/src/learning_topic/CMakeLists.txt

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

编译

cd ~/catkin_workspace
catkin_make

结果

可在~/catkin_workspace/devel/include/learning_topic下看到生成的Person.h

使用

C++

编写程序

person_publisher.cpp

nano ~/catkin_workspace/src/learning_topic/src/person_publisher.cpp
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程将发布/person_info话题,自定义消息类型learning_topic::Person*/#include <ros/ros.h>
#include "learning_topic/Person.h"int main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, "person_publisher");// 创建节点句柄ros::NodeHandle n;// 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10);// 设置循环的频率ros::Rate loop_rate(1);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

nano ~/catkin_workspace/src/learning_topic/src/person_subscriber.cpp
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程将订阅/person_info话题,自定义消息类型learning_topic::Person*/#include <ros/ros.h>
#include "learning_topic/Person.h"// 接收到订阅的消息后,会进入消息回调函数
void personInfoCallback(const learning_topic::Person::ConstPtr& msg)
{// 将接收到的消息打印出来ROS_INFO("Subcribe 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;// 创建一个Subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallbackros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);// 循环等待回调函数ros::spin();return 0;
}

配置CMakeLists.txt

nano ~/catkin_workspace/src/learning_topic/CMakeLists.txt

添加

add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)
  1. 设置需要编译的代码和生成的可执行文件;
  2. 设置链接库;
  3. 添加依赖项。
    在这里插入图片描述

编译并运行

cd ~/catkin_workspace
catkin_make# 新建一个终端
source ~/catkin_workspace/devel/setup.bash
roscore
# 新建一个终端
source ~/catkin_workspace/devel/setup.bash
rosrun learning_topic person_publisher
# 新建一个终端
source ~/catkin_workspace/devel/setup.bash
rosrun learning_topic person_subscriber# 新建一个终端
source ~/catkin_workspace/devel/setup.bash
rqt_graph

在这里插入图片描述
在这里插入图片描述

python

编写程序

person_publisher.py

nano ~/catkin_workspace/src/learning_topic/scripts/person_publisher.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-########################################################################
####          Copyright 2020 GuYueHome (www.guyuehome.com).          ###
######################################################################### 该例程将发布/person_info话题,自定义消息类型learning_topic::Personimport rospy
from learning_topic.msg import Persondef velocity_publisher():# ROS节点初始化rospy.init_node('person_publisher', anonymous=True)# 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::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  = 18;person_msg.sex  = Person.male;# 发布消息person_info_pub.publish(person_msg)rospy.loginfo("Publsh person message[%s, %d, %d]", person_msg.name, person_msg.age, person_msg.sex)# 按照循环频率延时rate.sleep()if __name__ == '__main__':try:velocity_publisher()except rospy.ROSInterruptException:pass
nano ~/catkin_workspace/src/learning_topic/scripts/person_subscriber.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-########################################################################
####          Copyright 2020 GuYueHome (www.guyuehome.com).          ###
######################################################################### 该例程将订阅/person_info话题,自定义消息类型learning_topic::Personimport rospy
from learning_topic.msg import Persondef personInfoCallback(msg):rospy.loginfo("Subcribe Person Info: name:%s  age:%d  sex:%d", msg.name, msg.age, msg.sex)def person_subscriber():# ROS节点初始化rospy.init_node('person_subscriber', anonymous=True)# 创建一个Subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallbackrospy.Subscriber("/person_info", Person, personInfoCallback)# 循环等待回调函数rospy.spin()if __name__ == '__main__':person_subscriber()

运行

sudo chmod +x ~/catkin_workspace/src/learning_topic/scripts/person_publisher.py
sudo chmod +x ~/catkin_workspace/src/learning_topic/scripts/person_subscriber.py# 新建一个终端
source ~/catkin_workspace/devel/setup.bash
roscore
# 新建一个终端
source ~/catkin_workspace/devel/setup.bash
rosrun learning_topic person_publisher.py
# 新建一个终端
source ~/catkin_workspace/devel/setup.bash
rosrun learning_topic person_subscriber.py# 新建一个终端
source ~/catkin_workspace/devel/setup.bash
rqt_graph

在这里插入图片描述

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

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

相关文章

ios 打电话结束返回到应用中

在我们做打电话这个功能时&#xff0c;我们常常是调用这个方法&#xff1a; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:"tel://xxxxx"]]; 然而&#xff0c;这样实现了功能后&#xff0c;结束通话后&#xff0c;确不能回到自己的应用中来。最…

php 字符符转整数

intval() $my_month intval($my_format_date[1]);

C语言及程序设计进阶例程-17 认识链表

贺老师教学链接 C语言及程序设计进阶 本课讲解 例 建立并输出一个简单链表 #include <stdio.h> struct Student {int num;float score;struct Student *next; }; int main( ) {struct Student a,b,c,*head,*p;a. num31001;a.score89.5;b. num31003;b.score90;c. num3100…

【RK3399Pro学习笔记】九、ROS客户端Client的编程实现

目录如何实现一个客户端C创建功能包编写程序配置CMakeLists.txt编译并运行python创建并编写脚本运行平台&#xff1a;华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件版本&#xff1a;Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615 记录自【古月居】古月ROS入门21讲 | 一学就会的…

(原创)UML要点总结

今天我们总结要点&#xff1a; 我们就从这张图慢慢讲。 一。类图部分 基础&#xff1a; 类图→长方形表示。类名在最上栏&#xff0c;下面是数据&#xff0c;第三栏是方法。其存在两种关系&#xff1a;关联和泛化 属性&#xff1a; 全形&#xff1a; 可见性 名&#xff1a;类…

Android - Okhttp拦截器

Okhttp-wiki 之 Interceptors 拦截器转载于:https://www.cnblogs.com/qlky/p/7298470.html

PHP 函数 - 返回值

<?php function sum($x,$y) {$z$x$y;return $z; }echo "5 10 " . sum(5,10) . "<br>"; echo "7 13 " . sum(7,13) . "<br>"; echo "2 4 " . sum(2,4); ?> http://www.w3school.com.cn/php/php_f…

Docker解析及轻量级PaaS平台演练(一)--Docker简介与安装

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/46290985 Container技术&#xff1a; 传统的虚拟化技术&#xff1a; 通过对硬件层模拟&#xff0c;从而实现了能够在一套硬件上面运行多个操作…

杭电4639

居然在最后的输出形式那里卡了很久&#xff0c;忘记除10007&#xff0c;忘记输出Case 希望下次不要犯这种错误 #include "iostream" #include "string.h" using namespace std; int f[10100][100],maxb0; char list[110][10100]; int max(int a,int b){ret…

【RK3399Pro学习笔记】十、ROS服务端Server的编程实现

目录如何实现一个服务器C编写程序配置CMakeLists.txt编译并运行python创建并编写脚本运行平台&#xff1a;华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件版本&#xff1a;Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615 记录自【古月居】古月ROS入门21讲 | 一学就会的ROS机器人入…

通过WordPress内置函数批量添加文章

http://www.php.cn/blog/detail/2482.html 最近业务需要在网站上批量添加大量的文章。一篇一篇地手动添加绝对会搞死我&#xff0c;所以&#xff0c;我就开始寻找批量添加的方法。其实&#xff0c;文章的相关内容都已经在本地的数据库里了。我最先想到的方法是通过sql语句直接…

关于Unity3D中函数说明

Camera.SetReplacementShader(Shader shader , String replacementTag); 说明&#xff1a; 根据replacementTag设置以后的相机渲染用哪个shader Camera.RenderWithShader(Shader shader , String replacementTag); 说明: 根据replacementTag设置立即使用shader渲染&#xff0…

团队作业-第二周-测试计划

第1章引言 1.1目的 本测试计划文档作为指导此测试项目循序渐进的基础&#xff0c;帮助我们安排合适的资源和进度&#xff0c;避免可能的风险。本文档有助于实现以下目标&#xff1a; 1) 确定现有项目的信息和应测试的软件结构。 2) 列出推荐的测试需求 3) 推荐可采用的测试策略…

【RK3399Pro学习笔记】十一、ROS服务数据的定义与使用

目录自定义服务数据定义srv文件在package.xml中添加功能包依赖在CMakeLists.txt添加编译选项编译生成语言相关文件使用C编写程序person_server.cppperson_client.cpp配置CMakeLists.txt编译并运行python编写程序person_server.pyperson_client.py运行平台&#xff1a;华硕 Thin…

iBATIS存储过程

使用iBATIS配置来调用存储过程。为了理解这一章&#xff0c;首先需要了解我们是如何在MySQL中创建一个存储过程。 在继续对本章学习之前&#xff0c;可以通过MySQL存储过程。 我们已经在MySQL下有EMPLOYEE表&#xff1a; 123456CREATE TABLE EMPLOYEE (id INT NOT NULL auto_i…

WordPress 如何通过ID获取文章标题、内容等信息

原文链接&#xff1a;http://www.isyeo.com/wordpress/wordpress-getpost.html# 在非single.php页面中我们有时候想要调用当前文章的标题、内容等信息&#xff0c;而Wordpress在生成文章页的时候在各个页面中唯一不变的只有当前的文章ID&#xff0c;那么如何这个ID获取到当前文…

Windows server 2012 之路由功能

今天给大家介绍的是Windows服务器的软路由功能&#xff0c;那么什么事软路由呢&#xff1f;软路由&#xff1a;就是将Windows 系统配置成一个路由器下面我们通过一个示例来给大家介绍软路由先说一下实验环境&#xff0c;三台服务器&#xff0c;server02&#xff08;ip地址为192…

【51单片机快速入门指南】8:看门狗定时器(WDT)

目录硬知识测试程序main.c现象普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 摘自《STC89C52系列单片机器件手册》 适用型号: STC89C51,STC89C52,STC89C53,STC89C14,STC89LE51,STC89LE52,STC89LE53,STC89LE14,STC89C54,…

java 的 == 和equals()区别

先看一个列子&#xff1a; public class Equivalence {public static void main(String[] args) {Integer n1 new Integer(47);Integer n2 new Integer(47);System.out.println(n1 n2);System.out.println(n1 ! n2);} } 通常我们都以为结果是 第一个true第二个false&#xf…

wordpress 文章页面 (single.php)

<?php $id get_the_ID();// 文章当前的 id $title get_post($id)->post_title; $my_data get_the_time(Y-m-d);$my_content get_post($id)->post_content;?>