四、创建工作空间与功能包

1、工作空间

工作空间(workspace):是一个存放工程开发相关文件的文件夹(相当于在IDE中创建的工程文件)。

包含:

  src:代码空间(Source Space),放置功能包的源码

  build:编译空间(Build Space),编译过程中生成的一些中间文件,一般用不到

  devel:开发空间(Development Space),放置开发中生成的可执行文件以及一些库

  install:安装空间(Install Space),放置最终生成(开发后)的可执行文件

1.1创建工作空间

(1)创建工作空间:

  $ mkdir -p ~/catkin_ws/src  

  $ cd ~/catkin_ws/src

  $ catkin_init_workspace

注意:mkdir -p是递归创建目录;初始化之后会显示一个CMakeLists.txt的文件。

(2)编译工作空间

  $ cd ~/catkin_ws/

  $ catkin_make

注意:此时会产生build、devel以及我们自己创建的src文件,还缺少install的文件

  $ catkin_make install

(3)设置环境变量

  $ source devel/setup.bash

注意:设置环境变量的原因是为了让系统找到我们的工作空间,并且找到对应的功能包。

(4)检查环境变量

  $echo $ROS_PACKAGE_PATH

图示:

1.2创建功能包

命令: $ catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

(1)创建功能包

  $ cd ~/catkin_ws/src

  $ catkin_create_pkg test_pkg std_msgs rospy roscpp

说明:创建一个测试包,std_msgs是一个标准库,rospy是py依赖包,roscpp是C++依赖包。

(2)编译功能包

  $ cd ~/catkin_ws

  $ catkin_make

注意:同一个工作空间下,不允许存在同名功能包;不同工作空间下,允许存在同名功能包。

test_pkg测试包包含下面四个文件:

  include:头文件

  src:源码存放处

  CMakeLists.txt:描述功能包里面的编译规则,CMake是个编译器

  package.xml:用xml语言描述的功能包的相关信息。

五、发布者Publisher的编程实现

1、话题模型

2、创建功能包

命令:

  $ cd ~/catkin_ws/src

  $ catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim

3、创建发布者代码

如何实现一个发布者?

① 初始化ROS节点;

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

③创建消息数据;

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

C++代码如下:

 1 /**
2 * 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
3 */
4
5 #include <ros/ros.h>
6 #include <geometry_msgs/Twist.h>
7
8 int main(int argc, char **argv)
9 {
10 // ROS节点初始化
11 ros::init(argc, argv, "velocity_publisher");
12
13 // 创建节点句柄
14 ros::NodeHandle n;
15
16 // 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
17 ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
18
19 // 设置循环的频率
20 ros::Rate loop_rate(10);
21
22 int count = 0;
23 while (ros::ok())
24 {
25 // 初始化geometry_msgs::Twist类型的消息
26 geometry_msgs::Twist vel_msg;
27 vel_msg.linear.x = 0.5;
28 vel_msg.angular.z = 0.2;
29
30 // 发布消息
31 turtle_vel_pub.publish(vel_msg);
32 ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]",
33 vel_msg.linear.x, vel_msg.angular.z);
34
35 // 按照循环频率延时
36 loop_rate.sleep();
37 }
38
39 return 0;
40 }

python代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*- ########################################################################
#### Copyright 2020 GuYueHome (www.guyuehome.com). ###
######################################################################## # 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist import rospy
from geometry_msgs.msg import Twist def velocity_publisher():
# ROS节点初始化
rospy.init_node('velocity_publisher', anonymous=True) # 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
turtle_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.5
vel_msg.angular.z = 0.2 # 发布消息
turtle_vel_pub.publish(vel_msg)
rospy.loginfo("Publsh 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:
pass

注意:在python文件中一定要注意它的权限,在属性里面找权限

4、配置发布者代码编译规则

如何配置CMakeLists.txt中的编译规则?

  ①设置需要编译的代码和生成的可执行文件;

  ②设置链接库;

在 CMakeLists.txt的文件添加以下代码:

add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})

注意:add_executable是为了描述把哪一个程序编译成可执行文件的;add_executable(A B.cpp)是把B.cpp编译成A这个可执行文件的

target_link_libraries是将可执行文件与ROS的一些库做链接的

注意:

①配置环境变量步骤:

  回到主文件夹,Ctrl+H将隐藏的.bashrc文件打开,在最后一行将工作空间的环境变量设置进去(注意路径)

source /home/gy/catkin_ws/devel/setup.bash

这样输入完就不用每次在终端里输入source命令了,但需要重新启动终端才生效

②编译后的路径在devel/liblearning_topic

5、编译并运行发布者

命令:

  $ cd ~/catkin_ws

  $ catkin_make

  $ source devle/setup.bash

  $ roscore

  $ rosrun turtlesim turtlesim_node

  $ rosrun learning_topic velocity_publisher

六、订阅者Subscriber 的编程实现

1、话题模型

如何实现一个订阅者?

① 初始化ROS节点

② 订阅需要的话题

③ 循环等待话题消息,接收到消息后进入回调函数

④ 在回调函数中完成消息处理

2、创建订阅者代码

C++代码如下:

 1 /**
2 * 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
3 */
4
5 #include <ros/ros.h>
6 #include "turtlesim/Pose.h"
7
8 // 接收到订阅的消息后,会进入消息回调函数
9 void poseCallback(const turtlesim::Pose::ConstPtr& msg)
10 {
11 // 将接收到的消息打印出来
12 ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
13 }
14
15 int main(int argc, char **argv)
16 {
17 // 初始化ROS节点
18 ros::init(argc, argv, "pose_subscriber");
19
20 // 创建节点句柄
21 ros::NodeHandle n;
22
23 // 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
24 ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);
25
26 // 循环等待回调函数
27 ros::spin();
28
29 return 0;
30 }

python代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*- ########################################################################
#### Copyright 2020 GuYueHome (www.guyuehome.com). ###
######################################################################## # 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose import rospy
from turtlesim.msg import Pose def poseCallback(msg):
rospy.loginfo("Turtle pose: x:%0.6f, y:%0.6f", msg.x, msg.y) def pose_subscriber():
# ROS节点初始化
rospy.init_node('pose_subscriber', anonymous=True) # 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
rospy.Subscriber("/turtle1/pose", Pose, poseCallback) # 循环等待回调函数
rospy.spin() if __name__ == '__main__':
pose_subscriber()

3、配置订阅者代码编译规则

如何配置CMakeLists.txt中的编译规则?

  ①设置需要编译的代码和生成的可执行文件;

  ②设置链接库;

在 CMakeLists.txt的文件添加以下代码:

add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})

4、编译并运行订阅者

命令:

  $ cd ~/catkin_ws

  $ catkin_make

  $ source devle/setup.bash

  $ roscore

  $ rosrun turtlesim turtlesim_node

  $ rosrun learning_topic pose_subscriber

图示:

ROS入门21讲(2)的更多相关文章

  1. Ros入门21讲

    一.ROS是什么? ROS=通信机制+开发工具+应用功能+生态系统 目的:提高机器人研发中的软件复用率. 1.ROS中的通信机制 松耦合分布式通信: 注意:什么是耦合.紧耦合.松耦合? 1.1 耦合 ...

  2. ros系统21讲—前六讲

    课程介绍(第一讲) linux介绍安装(第二讲) linux的基础操作(第三讲) ROS中语言c++与python介绍(第四讲) 安装ROS系统(第五讲) 第一个: sudo sh -c echo d ...

  3. SLAM+语音机器人DIY系列:(二)ROS入门——5.编写简单的消息发布器和订阅器

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  4. SLAM+语音机器人DIY系列:(二)ROS入门——6.编写简单的service和client

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  5. SLAM+语音机器人DIY系列:(二)ROS入门——10.在实际机器人上运行ROS高级功能预览

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  6. ROS入门学习

    ROS学习笔记 ROS入门网站; ROS入门书籍 ROS主要包含包括功能包.节点.话题.消息类型和服务; ROS功能包/软件包(Packages) ROS软件包是一组用于实现特定功能的相关文件的集合, ...

  7. 《VC++ 6简明教程》即VC++ 6.0入门精讲 学习进度及笔记

    VC++6.0入门→精讲 2013.06.09,目前,每一章的“自测题”和“小结”三个板块还没有看(备注:第一章的“实验”已经看完). 2013.06.16 第三章的“实验”.“自测题”.“小结”和“ ...

  8. c#委托事件入门--第二讲:事件入门

    上文 c#委托事件入门--第一讲:委托入门 中和大家介绍了委托,学习委托必不可少的就要说下事件.以下思明仍然从事件是什么.为什么用事件.怎么实现事件和总结介绍一下事件 1.事件是什么:. 1.1 NE ...

  9. ROS_Kinetic_03 ROS入门向导

    ROS_Kinetic_03 ROS入门向导 每个人都有不同的学习习惯和爱好并针对不同的应用进行ROS相关设计与开发, 没有固定不变的学习模式,但以下的内容是通常都会用到的. 1. ROS基础教程 1 ...

  10. SLAM+语音机器人DIY系列:(二)ROS入门——1.ROS是什么

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

随机推荐

  1. 在vscode中通过修改launch.json文件为项目添加环境变量——在launch.json文件中修改env变量

    在vscode中launch.json文件具有十分重要的作用,在vscode中可以通过修改launch.json文件修改调试和运行代码时的设置. 本文假设已对vscode有初步了解,已可以创建laun ...

  2. 哈希基础知识学习-python版

    哈希 哈希表 根据key直接进行访问的无序数据结构,复杂度为O(1) 哈希表的实现---字典 初始化 d1 = dict() 查找 #使用中括号[]进行查找,括号内为特定的键, 键-值 dic = { ...

  3. 七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)

    教程简介 EasySQLite是一个七天.NET 8操作SQLite入门到实战详细教程(包含选型.开发.发布.部署)! 什么是SQLite? SQLite 是一个软件库,实现了自给自足的.无服务器的. ...

  4. CF1730G

    CF1703G 链接: Problem - 1703G - Codeforces 题目大意: 你有 \(n\) 个箱子.第 \(i\) 个箱子中有 \(a_i\) 个硬币.你需要按照从箱子 \(1\) ...

  5. 使用Ollama本地离线体验SimpleRAG(手把手教程)

    Ollama介绍 Ollama是一个开源项目,专注于开发和部署大语言模型,特别是像LLaMA这样的模型,用于生成高质量的文本和进行复杂的自然语言处理任务.Ollama的目标是让大语言模型的运行和使用变 ...

  6. unity学习笔记(一)

    组件的概念 组件:一个或多个功能的容器,类似模块,插上去就有这个功能,不查没有 存在意义: 如果太依赖继承,继承树将会特别复杂 组件化设计思想有利于维护拓展 unity内任何游戏物体必须有Transf ...

  7. 六,Spring Boot 容器中 Lombok 插件的详细使用,简化配置,提高开发效率

    六,Spring Boot 容器中 Lombok 插件的详细使用,简化配置,提高开发效率 @ 目录 六,Spring Boot 容器中 Lombok 插件的详细使用,简化配置,提高开发效率 1. Lo ...

  8. Java基础 韩顺平老师的 泛型 的部分笔记

    553,泛型引入 package com.hspedu.list_; import java.util.*; import java.util.concurrent.CompletionService ...

  9. Coursera, Big Data 5, Graph Analytics for Big Data, Week 1/2

    Graph表示 1. adjacency matrix最简单的一种表示:行是From 列是To, 这种表示是稀疏矩阵 2. 另一种表示,如下图,很多graph数据库用这种,是的数据库操作更有效率 us ...

  10. Kubernetes Pod生命周期(十七)

    前面我们已经了解了 Pod 的设计原理,接下来我们来了解下 Pod 的生命周期.下图展示了一个 Pod 的完整生命周期过程,其中包含 Init Container.Pod Hook.健康检查 三个主要 ...