ROS学习笔记四:用C++编写ROS发布与订阅

一、创建并编译功能包

1.1 创建功能包

在工作空间的 src 目录下创建功能包:

$ cd ~/dev/catkin_ws/src
$ catkin_create_pkg chapter2_tutorials std_msgs roscpp


1.2 编译功能包

进入工作目录下编译全部功能包:

$ cd ~/dev/catkin_ws/
$ catkin_make

如果到达100%,表示一切顺利,否则会报错停止编译。


二、创建并编译节点

2.1 创建节点

进入功能包的 src 目录下,在这个文件夹中,创建两个新文件:example1_a.cppexample1_b.cpp

example1_a.cpp(发布节点):

#include "ros/ros.h"                     //"ros/ros.h"包含ROS节点所有节点的必要文件
#include "std_msgs/String.h"             //"std_msgs/String.h"包含消息类型
#include <sstream>int main(int argc, char **argv)
{ros::init(argc, argv, "example1_a"); //启动该节点并设置其名称(example1_a),该名称是唯一的ros::NodeHandle n;                   //设置节点进程的句柄ros::Publisher chatter_pub = n.advertise<std_msgs::String>("message", 1000); //把这个节点设置成发布者,并把发布主题的类型告诉节点管理器。第一个参数是消息名称“message”,第二个参数将缓冲区设置为1000个消息ros::Rate loop_rate(10);             //设置频率10Hzwhile (ros::ok())                    //一直运行,直到CTRL+C停止运行{std_msgs::String msg;            //创建消息变量,变量类型必须符合发送的要求std::stringstream ss;ss << " I am the example1_a node "; //要发布的消息内容msg.data = ss.str();chatter_pub.publish(msg);        //发布消息ros::spinOnce();                 //如果出现订阅者,ROS会更新和读取所有主题loop_rate.sleep();               //按频率挂起}return 0;
}


example1_b.cpp(订阅节点):

#include "ros/ros.h"
#include "std_msgs/String.h"/*接收消息然后发布*/
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{ROS_INFO("I heard: [%s]", msg->data.c_str());  //在命令行窗口显示消息内容
}int main(int argc, char **argv)
{ros::init(argc, argv, "example1_b");ros::NodeHandle n;ros::Subscriber sub = n.subscribe("message", 1000, chatterCallback); //创建一个订阅者,从主题获取以“message”为名称的消息,缓冲区为1000,处理消息句柄的回调函数chatterCallbackros::spin();  //ros::spin()库是响应循环,消息到达时调用函数chatterCallback,CTRL+C结束循环return 0;
}


2.2 编译节点

将下列几行代码添加到CMakeLists.txt文件中include_directories(include ${catkin_INCLUDE_DIRS})之后:

add_executable(chap2_example1_a src/example1_a.cpp)
add_executable(chap2_example1_b src/example1_b.cpp)
add_dependencies(chap2_example1_a chapter2_tutorials_generate_messages_cpp)
add_dependencies(chap2_example1_b chapter2_tutorials_generate_messages_cpp)
target_link_libraries(chap2_example1_a ${catkin_LIBRARIES})
target_link_libraries(chap2_example1_b ${catkin_LIBRARIES})

回到工作目录下,编译功能包:

$ cd ~/dev/catkin_ws/
$ catkin_make chapter2_tutorials

如果顺利编译的话,将会生成两个可执行程序 example1_aexample1_b 文件,默认生成可执行文件的目录是catkin工作空间的devel目录下的lib目录。


3 检验编写的节点

首先要确认在carkin_make之后加载了工作空间的环境变量,然后分别在三个新的终端运行如下命令:

$ roscore
$ rosrun chapter2_tutorials chap2_example1_a
$ rosrun chapter2_tutorials chap2_example1_b

ROS_chap4_A.png


使用rqt_graph命令能够创建一个显示当前系统运行情况的动态图形,如下图所示。example1_a 节点发布 /message 主题,同时 example1_b 节点订阅了这个主题。

ROS_chap4_B.png


转载于:https://www.cnblogs.com/linuxAndMcu/p/10578837.html

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

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

相关文章

[Leetcode][第315题][JAVA][计算右侧小于当前元素的个数][暴力][归并排序+索引数组]

【问题描述】[中等] 【解答思路】 1. 暴力 &#xff08;超时&#xff09; 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(1) public List<Integer> countSmaller(int[] nums) {List<Integer> ans new ArrayList<Integer>();int n nums.length…

61setproperty对象

建立一个users类 package srever;public class Users {private String username;private String password;public Users() {}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword(…

关于sin的导数的证明

引自JetTangs的博客 几何证明: AC切圆O于C AO交圆O于B CD、OF为水平线 BF为垂直线 令∠EOF θ 求证sinθ的导数为cosθ 证: 设∠AOC的角度为x, 由弦切角定理可知∠ACB 12x 而且∠ECDθ 则∠BCD 90-θ-12x 于是 limx→0sin(90−θ−12x)cosθ意思就是 当x无限接近于…

62 getproperty对象

定义一个login的jsp <% page language"java" import"java.util.*" contentType"text/html; charsetutf-8"%><!DOCTYPE html> <html> <head> <meta charset"ISO-8859-1"> <title>Insert title he…

Python网络爬虫之图片懒加载技术、selenium和PhantomJS

引入 今日概要 图片懒加载seleniumphantomJs谷歌无头浏览器知识点回顾 验证码处理流程今日详情 动态数据加载处理 一.图片懒加载 什么是图片懒加载&#xff1f; 案例分析&#xff1a;抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 …

[Leetcode][第题][JAVA][两个数组的交集 II1][双指针][HashMap]

【问题描述】[中等] 【解答思路】 1. 哈希映射 复杂度分析 class Solution {public int[] intersect(int[] nums1, int[] nums2) {if (nums1.length > nums2.length) {return intersect(nums2, nums1);}Map<Integer, Integer> map new HashMap<Integer, Intege…

63 javabean的作用域范围

定义一个users类 package srever;public class Users {private String username;private String password;public Users() {}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword(…

【Immutable】拷贝与JSON.parse(JSON.stringify()),深度比较相等与underscore.isEqual(),性能比较...

样本&#xff1a;1MB的JSON文件&#xff0c;引入后生成500份的一个数组&#xff1b; 结果如下&#xff1a; 拷贝性能&#xff1a; JSON.parse(JSON.stringify()) 的方法&#xff1a;2523.55517578125ms immutable.fromJs: 1295.159912109375ms 快了一倍 深度比较性能&#xff1…

65 modol1用户登录

定义一个Users类 package srever;public class Users {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword() {return passwor…

[剑指offer]面试题第[58-2]题[JAVA][左旋转字符串][拼接]

【问题描述】[中等] 【解答思路】 1. 字符串切片 应用字符串切片函数&#xff0c;可方便实现左旋转字符串。 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) public String reverseLeftWords(String s, int n) {return s.substring(n, s.length()) s.substring(0,…

[剑指offer]面试题第[59-1]题[Leetcode][第239题][JAVA][滑动窗口的最大值][单调队列][优先队列]

【问题描述】[困难] 【解答思路】 1. 暴力 两层 for 循环&#xff0c;每次都从窗口中找最大值即可 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(N) public int[] maxSlidingWindow(int[] nums, int k) {int n nums.length;if (n 0) {return nums;}int result[]…

视图高级

目标 限制请求method页面重定向HttpRequest 对象HttpResponse 对象生产CVS 文件类视图错误处理一 限制请求method 1-1 常用的请求method 1. GET请求&#xff1a;GET请求一般用来向服务器索取数据&#xff0c;但不会向服务器提交数据&#xff0c;不会对服务器的状态进行更改。比…

68 cookie在登录中的作用

定义一个login.jsp页面 <% page language"java" import"java.util.*,java.net.*" contentType"text/html; charsetutf-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.…

69 session和cookie的区别

这些都是基础知识&#xff0c;不过有必要做深入了解。先简单介绍一下。 二者的定义&#xff1a; 当你在浏览网站的时候&#xff0c;WEB 服务器会先送一小小资料放在你的计算机上&#xff0c;Cookie 会帮你在网站上所打的文字或是一些选择&#xff0c;都纪录下来。当下次你再光…

[Leetcode][第120题][JAVA][三角形最小路径和][动态规划][递归]

【问题描述】[中等] 【解答思路】 1. 动态规划思路一 自上而下 第 1 步&#xff1a;设计状态 f[i][j] 表示从三角形顶部走到位置 (i,j) 的最小路径和 位置(i,j) 指的是三角形中第 i 行第 j 列&#xff08;均从 00 开始编号&#xff09;的位置 第 2 步&#xff1a;状态转移方程…

70 include指令

定义一个date的jsp <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <p>今天的日期是: <% (new java.util.Date()).toLocaleString()%> </p> 定义一个dateFile的jsp <% page …

71 include动作

定义一个date页面 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <p>今天的日期是: <% (new java.util.Date()).toLocaleString()%> </p> 定义一个dateFile <% page langua…