ROS 自定义消息发布器和订阅器测试 +代码详解(入门级)

既对ros tutorial 上的例子有了一定的了解之后,今天对发布器和订阅器代码(http://wiki.ros.org/cn/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29)进行了研究,同时稍作改动进行了验证,

发布器--------------------------------------------------------------------------------------------------------------------------------------------

#include "ros/ros.h"
#include "std_msgs/String.h"
#include "std_msgs/Int16.h"//因为后面我要用到整形的msg,此处要加上Int的头文件,不加后面会报错
#include <sstream>
int main (int argc,char ** argv)

{ros::init(argc,argv,"input");//初始化ROS,
是确切说明节点名字的地方, 节点的名字必须唯一,

//它允许ROS通过命令行重新命名

ros::NodeHandlen;//创建了该节点的一个句柄

ros::Publisherinput_pub
= n.advertise<std_msgs::String>("chatter1",1000);

ros::Publisherinput_pub
= n.advertise<std_msgs::String>("chatter2",1000);

//尖括号里为发布的数据类型(调试的时候第一个就忘了改),
即消息Message ,我再这里想要在一个节点(node)上发布两个话题(topic)

//圆括号中”chatter1”&”chatter2”为发布的话题的名称,
即Topic

//也可以写成ros::Publisher chatter_pub; chatter_pub= n.advertise<...>...(引自ROS 代码解析)

ros::Rateloop_rate(10);//一个ros::Rate对象允许user制定循环的频率

//它将会记录从上次调用Rate::sleep()到现在为止的时间, 并且休眠正确的时

//intcount
= 0;
我的代码里没有用到计数,值得注意的是源代码的count 变量一定程度上反应了代码的执行过程(通过观察输出结果可以明白)

int a b,c;

while
(ros::ok())//默认情况下,roscpp将会安装一个SIGINT监听,

//它使当Ctrl-C按下时,ros::ok()将会返回
0

{

std_msgs::Int16msg1;

std_msgs::Stringmsg2;
//此处定义msg1 和msg2,注意类型不一致

    msg2.data="hello!I am Baymax!";
    std::cin>>a>>b; //获取键盘的输入值,经过我的验证,如果不输入数据,程序会在这里等待
    c=a+b;
    msg1.data=c;
//    ROS_INFO("%s", msg.data.c_str());  此处可以百度c_str的含义做更深入了解
  ROS_INFO("%s", msg2.data.c_str()); //输出 msg2的信息

input_pub.publish(msg1);

    input_pub.publish(msg2); //发布信息
    ros::spinOnce();  // 可以查询spinOnce做进一步了解,此处为调用一次回调函数,关于回调函数可以从订阅节点处做直观了解
    loop_rate.sleep(); //休眠一下, 使程序满足前面所设置的 10Hz的要求
  }
  return 0;
}

-----------------------------------------------------------------------------------------------------

订阅器----------------------------------------------------------------------------
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "std_msgs/Int16.h"//因为后面我要用到整形的msg,此处要加上Int的头文件,不加后面会报错
void chatterCb1(const std_msgs::Int16::ConstPtr& msg1) // 此处我设定了两个回调函数
{   ROS_INFO("I heard you said answer is : [%s]", msg1->data);  } 
void chatterCb2(const std_msgs::String::ConstPtr& msg2)
{   ROS_INFO("I heard: [%s]", msg->data.c_str());  } 
int main(int argc, char **argv)
{
 ros::init(argc, argv, "output");// 初始化节点(node)
  ros::NodeHandle n;
ros::Subscriber sub1 = n.subscribe("chatter1", 1000, chatterCb1);
ros::Subscriber sub2 = n.subscribe("chatter2", 1000, chatterCb2); //订阅节点,触发回调
ros::spin();
return 0;
}
--------------------------------------------------------------------------------------------------

此为进一步了解发布和订阅的机制和格式,为后面编写更为复杂的订阅节点和发布节点打下基础 (如有不妥之处,恳请您批评指正)

时间: 2024-11-10 02:16:46

ROS 自定义消息发布器和订阅器测试 +代码详解(入门级)的相关文章

关于Linux的字符测试的详解和相关bash脚本的练习

关于Linux的字符测试的详解和相关bash脚本的练习 一.字符测试选项         == : 测试两个字符串是否相等,相等为真,不等为假.         != : 测试两个字符串是否不等,不等为真,相等为假.         -n string : 测试指定的字符串是否为空,空为真,不空为假.         -z string :测试指定的字符串是否为不空,不空为真,空为假. 二. 完成下面的bash脚本练习         练习:写一个脚本 传递一个参数(单字符就行)给脚本,如参数为

ROS学习(十二)—— 编写简单的消息发布器和订阅器(C++)

一.创建发布器节点 1 节点功能: 不断的在ROS网络中广播消息 2 创建节点 (1)打开工作空间目录 cd ~/catkin_ws/src/beginner_tutorials p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 创建一个发布器节点("talker"),它将不断的在ROS网络中广播消息. --> { } (2)创建src文件夹 mkdir -p ~/catkin_ws/src/beginner_tu

Android命令Monkey压力测试,详解

一.Monkey 是什么?Monkey 就是SDK中附带的一个工具. 二.Monkey 测试的目的?:该工具用于进行压力测试. 然后开发人员结合monkey 打印的日志 和系统打印的日志,结局测试中出现的问题. 三.Monkey 测试的特点?Monkey 测试,所有的事件都是随机产生的,不带任何人的主观性. 四.Monkey 命令详解 1).标准的monkey 命令[adb shell] monkey [options] <eventcount> , 例如:adb shell monkey -

SpringMvc测试框架详解----服务端测试

随着RESTful Web Service的流行,测试对外的Service是否满足期望也变的必要的.从Spring 3.2开始Spring了Spring Web测试框架,如果版本低于3.2,请使用spring-test-mvc项目(合并到spring3.2中了). Spring MVC测试框架提供了对服务器端和客户端(基于RestTemplate的客户端)提供了支持. 对于服务器端:在Spring 3.2之前,我们测试时一般都是直接new控制器,注入依赖,然后判断返回值.但是我们无法连同Spri

Apache之ab测试工具详解

ab是apachebench命令的缩写. ab的原理:ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问.它的测试目标是基于URL的,因此,它既可以用来测试apache的负载压力,也可以测试nginx.lighthttp.tomcat.IIS等其它Web服务器的压力. ab命令对发出负载的计算机要求很低,它既不会占用很高CPU,也不会占用很多内存.但却会给目标服务器造成巨大的负载,其原理类似CC攻击.自己测试使用也需要注意,否则一次上太多的负载.可能造成目标服务器资源耗完

APP自动化框架LazyAndroid使用手册(4)--测试模板工程详解

概述 前面的3篇博文分别对lazyAndroid的框架简介.元素抓取和核心API进行了说明,本文将基于框架给出的测试模板工程,详细阐述下使用该框架进行安卓UI自动化测试的步骤. 模板工程 先来看一下模板工程中包含哪些东西: 图中标注说明: 1是bean层,是lazy-uiautomaterviewer自动生成的java代码,是基于目标控件xpath自动定义的变量. 2是page层,是基于bean层代码封装的基本操作,一般以页面为单位. 3是test层代码,是基于page层操作写的测试case.

ROS教程2 编写简单的消息发布器和订阅器 (C++ catkin)

创建工作环境 创建文件夹,创建包 mkdir -p ~/catkin_arduino_ros/src catkin_create_pkg test1_pub_sub std_msgs rospy roscpp 在桌面打开终端,添加工作路径 echo "source /home/dongdong/catkin_arduino_ros/devel/setup.bash" >> ~/.bashrc source ~/.bashrc 创建项目文件 1创建src/talker.cpp

植物大战僵尸修改器DIY(二)CD详解[转]

前言 之前做星际的时候,就有兄弟们说,为啥不做一个原子弹无CD呀.好像大家对CD这个东西挺感兴趣,那我们这一篇就来研究一下,做无CD的思路吧. 这个植物大战僵尸系列呢,目前暂定想法就是3-4集的样子.主要就是针对于各种不同的功能,进行一个思路的引导和分析.最后一集的时候,会介绍如果使用易语言和AA引擎,将他直接制作成一个真正的修改器,尽情期待. PS:我讲的是思路,植物大战僵尸,只是一个例子,大家可以把思路拓展到别的方面去,注重思维灵活. 欢迎文明转载,请注明出处  丸子de爸爸 本文所有技术资

iOS:图像选取器控制器控件UIImagePickerController的详解

图像选择控制器:UIImagePickerController 功能:用于选取相册或相机等里面的照片. @interface UIImagePickerController : UINavigationController 枚举: //图片资源来源类型 typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) { UIImagePickerControllerSourceTypePhotoLibrary,          //图