ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行

ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行

一、自定义消息:

1.新建msg文件夹,创建定义Person.msg 文件

mkdir -p ~/catkin_ws/src/mypackage/msg
cd ~/catkin_ws/src/mypackage/msg
touch Person.msg 

打开 Person.msg 文件,添加内容( std_msgs/Header header 是一个标准格式的头信息(也可以不加))

std_msgs/Header header
string name
uint8 sex
uint8 age

2.修改添加~/catkin_ws/src/mypackage/package.xml 文件中内容

...<build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>
...

3.修改添加~/catkin_ws/src/mypackage/CMakeList.txt 文件中内容

// 添加生成依赖的功能包
find_package(catkin REQUIRED COMPONENTS
...  
message_generation
)// 添加 catkin 依赖
catkin_package( 
...
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime 
)// 添加需要编译的.msg文件
add_message_files( 
FILES 
Person.msg 
)generate_messages( 
DEPENDENCIES  
std_msgs )

4.查看msg

cd ~/catkin_ws
rosmsg show Person

显示:

[mypackage/Person]:
string name
uint8 sex
uint8 age

二、Publisher+Subscriber 示例:

1,~/catkin_ws/mypackage/src 目录中,编写俩个源文件talker.cpp和listener.cpp
(编译器编写或文本编写)

talker.cpp 源码:

#include "ros/ros.h"
#include "std_msgs/  "
#include "mypackage/Person.h" // 包含自定义信息头文件
#include <sstream>
#include <string.h>int main(int argc, char** argv)
{//ROS 节点初始化//创建节点句柄ros::init(argc, argv, "talker");  // 节点名称ros::NodeHandle n;// 话题topic的名称:chatterros::Publisher chatter_pub = n.advertise<mypackage::Person>("chatter", 1000);ros::Rate loop_rate(10); // 话题发布循环时间int count = 0; // 计数std::string name("Allison");while( ros::ok() ){mypackage::Person msg;msg.header.seq = count;// 顺序标识msg.header.stamp = ros::Time::now();// 时间戳msg.header.frame_id = "t_d_m";// IDmsg.sex = 1;msg.age = 12;msg.name = name;// 终端显示自己发布的消息(可以不加)ROS_INFO("Publish/\n");ROS_INFO("Header/\n");ROS_INFO("	seq [%d]\n", msg.header.seq);ROS_INFO("	frame_id [%s]\n", msg.header.frame_id.c_str() );ROS_INFO("	name [%s]\n", msg.name.c_str() );ROS_INFO("	sex [%d]\n", msg.sex);ROS_INFO("	age [%d]\n", msg.age);// Publisher对象 chatter_pub 消息发布chatter_pub.publish(msg);ros::spinOnce();// 发布一次loop_rate.sleep();++count;// 计数}return 0;
}

listener.cpp 源码:

#include <ros/ros.h>
#include "std_msgs/String.h"
#include "mypackage/Person.h"// 建立回调函数,当ros::spin()被触发时,该函数被激活,处理接收到的消息
void chatterCalllback(const msg_json::json msg)
{// 显示订阅的话题 "chatter" 发布的信息ROS_INFO("Header/\n");ROS_INFO("	seq [%d]\n", msg.header.seq);ROS_INFO("	frame_id [%s]\n", msg.header.frame_id.c_str() );ROS_INFO("	name [%s]\n", msg.name.c_str() );ROS_INFO("	sex [%d]\n", msg.sex);ROS_INFO("	age [%d]\n", msg.age);
}int main(int argc, char** argv)
{//ROS 节点初始化//创建节点句柄ros::init(argc, argv, "listener");ros::NodeHandle n;  // 创建 publisherros::Subscriber sub = n.subscribe( "chatter", 1000, chatterCalllback );// 触发回调函数,并循环处理,若处理一次则使用ros::spinOnce()ros::spin();return 0;
}

2 编译功能包源码(catkin_make方式编译)
打开 CMakeList.txt 文件:
1)设置头文件相对位置,默认为功能包的所在目录
2)生成可执行文件 talker 和 listener
3)设置链接库(系统或第三方库函数)此处并没有使用其他库
4)设置依赖
5) 生成talker和listener 两个可执行文件于 ~/catkin_ws/devel/lib/mypackage 中

CMakeList.txt 添加代码如下:

## Build talker and listener
include_directories(include ${catkin_INCLUDE_DIRS})add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(talker ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

3.终端工作空间根目录 ~/catkin_ws 开始编译

cd ~/catkin_ws
catkin_make
source devel/setup.bash // 已在于终端环境变量文件中设置的无需重新设置

三、运行 talker listener

运行ros master

cd ~/catkin_ws
roscore

运行talker

rosrun mypackage talker 

运行listenter

rosrun mypackage listener 

四、创建launch 启动文件

4.创建launch文件夹,创建启动文件 mypackage.launch

cd catkin_ws/src/mypackage/
mkdir launch
cd launch/
touch mypackage.launch

mypackage.launch文件内容,设置同时启动两个节点:

<launch><node pkg="mypackage" type="talker" name="talker"/><node pkg="mypackage" type="listener" name="listener" output="screen"/>
</launch>

5.运行launch文件并查看消息(默认会运行roscore)

roslaunch mypackage mypackage.launch  

五、其他指令

1.显示活动中的话题列表:

rostopic list 

2.显示话题消息内容:(不运行 listener)

rostopic echo /chatter 

3.发布话题内容:(不运行 talker)

rostopic pub /chatter

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

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

相关文章

latex中手动输入每一条参考文献

一般模板都会给出参考文献的格式&#xff0c;如果用latex的bib方法不能生成模板所需的格式&#xff0c;那么就需要自己手动输入每一条参考文献。其实这也不难&#xff0c;问题主要在期刊的缩写&#xff0c;查找某一篇文献期刊名缩写的一种方法是在谷歌学术搜索该文献&#xff0…

网址学习

http://aspnet.codeplex.com 转载于:https://www.cnblogs.com/ChineseMoonGod/p/5135376.html

美国反垄断调查背后,硅谷科技巨头不为人知的“阴暗面”

来源&#xff1a;军工圈6月4日&#xff0c;美国众议院司法机构小组委员会负责人向媒体证实&#xff0c;美国政府准备对亚马逊、苹果、Facebook和谷歌4大科技巨头进行反垄断调查。据称&#xff0c;执行反垄断法的美国联邦贸易委员会&#xff08;以下简称FTC&#xff09;和美国司…

ROS 学习笔记(三):自定义服务数据srv+server+client 示例运行

ROS 学习笔记&#xff08;三&#xff09;&#xff1a;自定义服务数据srvServerClient 示例运行 一、自定义服务数据&#xff1a; 1.向功能包添加自定义服务文件(AddTwoInts.srv) cd ~/catkin_ws/src/mypackage mkdir srv cd srv2.生成并编辑自定义服务文件&#xff1a; ge…

第十一章 AtomicInteger源码解析

1、原子类 可以实现一些原子操作基于CAS下面就以AtomicInteger为例。 2、AtomicInteger 在没有AtomicInteger之前&#xff0c;对于一个Integer的线程安全操作&#xff0c;是需要使用同步锁来实现的&#xff0c;当然现在也可以通过ReentrantLock来实现&#xff0c;但是最好最方便…

np.random.choice用法

numpy.random.choice(a, sizeNone, replaceTrue, pNone) 返回&#xff1a;从[0,a)中以概率p采样size个数&#xff0c;replacement 代表的意思是抽样之后还放不放回去 如&#xff1a; >>> np.random.choice(5, 3) array([0, 3, 4]) >>> np.random.choice…

趋势 | 2019年人工智能行业的25大趋势

来源&#xff1a;网易智能知名创投研究机构CB Insights调研了25种最大的AI趋势&#xff0c;以确定2019年该技术的下一步趋势&#xff0c;他们根据行业采用率和市场优势评估了每种趋势&#xff0c;并将其归类为必要、实验性、威胁性、暂时的。1胶囊网络将挑战最先进的图像识别算…

ubuntu18.04 Qt Creator 安装+ROS Qt Creator Plug-in 插件安装笔记

ubuntu18.04 Qt Creator 安装ROS Qt Creator Plug-in 插件安装笔记&#xff1a; 一、Qt Creator 5.10安装 官网下载地址&#xff1a; http://download.qt.io/archive/qt/ 参考博客&#xff1a; https://blog.csdn.net/wuweifeng_2017/article/details/78322249 QT 安装包下…

.NET通过NavisWorks API将.nwc文件在窗口中打开及交互

[ 本文原创发表于cnblogs ] NavisWorks API的内容大部分为二次开发&#xff0c;在NavisWorks软件中增加所需要的功能。 而我所接到的工作任务是&#xff0c;将.nwc等格式的文件通过窗口打开并且可交互。也就是说&#xff0c;需要有一个程序去调用API&#xff0c;从而打开NavisW…

工业视觉系统相关知识和选型介绍(一):相机篇

工业视觉系统相关知识和选型介绍&#xff08;一&#xff09;&#xff1a;相机篇一、工业视觉系统二、工业相机三、关键名词解释四、工业相机选型五、工业相机品牌六、相机选型实例一、工业视觉系统 1.机器视觉就是用机器代替人眼来做测量和判断。机器视觉系统是指通过机器视觉…

天冷了思绪也飞远了

近日天冷&#xff0c;扎了有些时日的马尾&#xff0c;我的内心开始犹豫&#xff0c;要不要把它披散下来后稍作修剪&#xff0c;然后做成天然的围脖来保暖呢&#xff1f;不由得回想起多年的理发经历&#xff0c;其中中学的那一次理发仍然记忆犹新...... 常 言道&#xff0c;身体…

终于看见光的速度了:每秒一万亿帧的相机,拍摄到光的运行状态!

来源&#xff1a;机械发明爱好者我是谁&#xff0c;我在哪&#xff0c;我看到了什么&#xff0c;不会是手电筒照射的吧&#xff08;光移动的时候是在标签里面的&#xff0c;所以不可能是手电筒照射的&#xff09;。这个就是传说的中的飞秒拍摄技术飞秒&#xff08;femtosecond&…

win10下TensorFlow-GPU安装(GTX1660+CUDA10+CUDNN7.4)

首先安装anaconda Anaconda下载地址&#xff1a;https://www.anaconda.com/download/ 注意在安装时勾上第一项&#xff1a; 安装CUDA10.0&#xff1a; CUDA下载地址&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive 安装CUDA前会先运行一个系统检查&#xff…

工业视觉系统相关知识和选型介绍(二):镜头篇

工业视觉系统相关知识和选型介绍&#xff08;二&#xff09;&#xff1a;镜头篇一、工业镜头介绍二、 关键名词解释二、图解镜头基本参数三、镜头选型四、常用工业镜头品牌一、工业镜头介绍 镜头的基本功能就是实现光束变换&#xff08;调制&#xff09;&#xff0c;在机器视觉…

《科学美国人》评出2019年十大突破性技术

来源&#xff1a;科技日报日前&#xff0c;著名科普杂志《科学美国人》公布了2019年十大突破性技术榜单。榜上有名的既有“高深莫测”的新型核反应堆和DNA存储&#xff0c;也有“平易近人”的新型肥料和食品包装。科技日报记者梳理后发现&#xff0c;这十大技术可分为清洁环境、…

破解百度云

BaiduPCS-Go 打开登录即可使用&#xff0c;这个是论坛大神基于BaiduPCS-Go制作的web版。 这是原贴地址https://www.52pojie.cn/thread-808876-1-1.html 谢谢大神将复杂简单化。&#xff08;不清楚360有没有报毒&#xff0c;有需要的自行测试。&#xff09;下载地址&#xff1a…

浅谈Tuple之C#4.0新特性

一、4.0新特性中的Tuple 大家可以回顾一下c#4.0中增加的一个新特性&#xff0c;元组Tuple&#xff0c;它是一种固定成员的泛型集合: 下面先看看官方的一个使用例子&#xff1a; 创建一个包含7个元素的Tuple数组 // Create a 7-tuple. var population new Tuple<string, int…

MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结

MFC 学习笔记&#xff08;一&#xff09;&#xff1a;MFC单文档程序运行流程梳理与总结 1.MFC单文档程序运行流程 1.首先利用全局变量对象 theApp 启动应用程序 &#xff08;这是因为这个全局对象&#xff0c;基类CWinApp中 this 的指针才能指向这个对象。&#xff09; 2.调…

对话清华教授孙茂松:第三代人工智能要处理“可解释性”问题

来源&#xff1a;澎湃新闻正如人类会综合利用视觉、听觉、触觉、语言等信息&#xff0c;让人工智能&#xff08;AI&#xff09;从多角度、多模态、多学科学习自然语言也是清华大学人工智能研究院的目标与任务。2019年7月1日&#xff0c;清华大学人工智能研究院第八个研究中心&a…