ROS入门-第 1 章 ROS概述与环境搭建
目录
第 1 章 ROS概述与环境搭建
1.1 ROS简介
1.1.1 ROS概念
1.1.2 ROS设计目标
1.1.3 ROS发展历程
1.3 ROS快速体验
1.3.1 HelloWorld实现简介
1.3.2 HelloWorld(C++版)
步骤 1:创建工作空间
步骤 2:创建发布者节点
步骤 3:创建订阅者节点
步骤4:C++版CMakeLists.txt配置
步骤 5:编译和运行
1.3.3 HelloWorld(Python版)
步骤 1:创建工作空间
步骤 2:创建发布者节点
步骤 3:创建订阅者节点
步骤4:Python版CMakeLists.txt配置
步骤 5:编译和运行
第 1 章 ROS概述与环境搭建
1.1 ROS简介
ROS(Robot Operating System)是一个开源的机器人操作系统,旨在为机器人开发提供一套强大的工具和框架。它采用分布式计算模型,允许开发者构建复杂的机器人应用程序。ROS提供了一系列的库、工具和约定,用于简化机器人软件的开发、测试和部署。
1.1.1 ROS概念
- 节点(Nodes):ROS中的基本执行单元,每个节点都是一个独立的进程,可以执行特定的任务。
- 话题(Topics):节点通过话题进行异步通信,一个节点可以发布消息到话题,其他节点可以订阅来接收消息。
- 服务(Services):节点可以提供服务,并在其他节点请求时响应特定的任务。
- 参数(Parameters):ROS节点可以使用参数来存储配置信息,这些参数可以在运行时进行修改。
1.1.2 ROS设计目标
ROS的设计目标着重于以下几点:
- 模块化:ROS鼓励开发者将系统拆分为多个模块,每个模块都是一个独立的节点,可以并行开发和测试。
- 重用性:ROS支持代码和功能的重用,这有助于加快开发速度。
- 工具丰富:ROS提供了一系列的工具,包括可视化工具、调试工具、仿真工具等,用于开发和调试机器人应用程序。
- 分布式计算:ROS采用分布式计算模型,允许节点在不同的计算机上运行,通过网络通信进行交互。
1.1.3 ROS发展历程
ROS从最初的构想逐步发展为一个广泛应用的机器人操作系统:
- 初期阶段:ROS最早由斯坦福大学的人工智能实验室开发,作为一个实验性项目。
- 开源发布:2007年,ROS作为开源项目发布,逐渐吸引了全球的机器人开发者和研究人员。
- 发展壮大:随着时间的推移,ROS不断增加了新的功能、库和工具,广泛应用于各种机器人领域,如工业、服务、农业等。
- 版本迭代:ROS的不同版本(如Kinetic、Melodic、Noetic等)推出,不断引入新特性,改进性能,提高稳定性。
1.3 ROS快速体验
在本章中,我们将通过一个简单的HelloWorld例子来体验ROS的基本功能和流程。我们将分别使用C++和Python来实现HelloWorld示例,以展示ROS在不同编程语言下的使用方法。
1.3.1 HelloWorld实现简介
HelloWorld示例是一个经典的起始点,它帮助我们了解如何创建ROS节点、发布消息到话题以及订阅话题来接收消息。我们将创建两个节点,一个发布者节点负责发布消息,一个订阅者节点负责接收消息。
1.3.2 HelloWorld(C++版)
步骤 1:创建工作空间
首先,在您的工作目录中创建一个新的ROS工作空间:
mkdir -p ~/ros_hello_world_ws/src
cd ~/ros_hello_world_ws/src
catkin_init_workspace
cd ..
catkin_make
步骤 2:创建发布者节点
在src文件夹下创建一个新的包并切换到该包:
cd ~/ros_hello_world_ws/src
catkin_create_pkg hello_world_cpp roscpp std_msgs
在src文件夹中创建一个新的C++文件,例如publisher.cpp,并编写发布者节点的代码:
#include <ros/ros.h>
#include <std_msgs/String.h>int main(int argc, char **argv) {ros::init(argc, argv, "hello_world_cpp_publisher");ros::NodeHandle nh;ros::Publisher pub = nh.advertise<std_msgs::String>("hello_topic", 10);ros::Rate rate(1);while (ros::ok()) {std_msgs::String msg;msg.data = "Hello, ROS from C++!";pub.publish(msg);ros::spinOnce();rate.sleep();}return 0;
}
步骤 3:创建订阅者节点
在同一包中创建另一个C++文件,例如subscriber.cpp,并编写订阅者节点的代码:
#include <ros/ros.h>
#include <std_msgs/String.h>void messageCallback(const std_msgs::String::ConstPtr &msg) {ROS_INFO("Received: %s", msg->data.c_str());
}int main(int argc, char **argv) {ros::init(argc, argv, "hello_world_cpp_subscriber");ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe("hello_topic", 10, messageCallback);ros::spin();return 0;
}
步骤4:C++版CMakeLists.txt配置
在C++版的示例中,假设您的工作空间位于~/ros_hello_world_ws,ROS软件包的名称是hello_world_cpp。以下是CMakeLists.txt文件的配置:
cmake_minimum_required(VERSION 2.8.3)
project(hello_world_cpp)find_package(catkin REQUIRED COMPONENTSroscppstd_msgs
)catkin_package(CATKIN_DEPENDS roscpp std_msgs
)include_directories(include${catkin_INCLUDE_DIRS}
)add_executable(publisher_node src/publisher.cpp)
target_link_libraries(publisher_node ${catkin_LIBRARIES})add_executable(subscriber_node src/subscriber.cpp)
target_link_libraries(subscriber_node ${catkin_LIBRARIES})
步骤 5:编译和运行
回到工作空间的根目录,编译工作空间并运行发布者和订阅者节点:
cd ~/ros_hello_world_ws
catkin_make
source devel/setup.bash# 启动发布者节点
rosrun hello_world_cpp publisher# 在新的终端中启动订阅者节点
rosrun hello_world_cpp subscriber
1.3.3 HelloWorld(Python版)
步骤 1:创建工作空间
同样,在您的工作目录中创建一个新的ROS工作空间(如果您之前没有创建):
mkdir -p ~/ros_hello_world_ws/src
cd ~/ros_hello_world_ws/src
catkin_init_workspace
cd ..
catkin_make
步骤 2:创建发布者节点
在src文件夹下创建一个新的包并切换到该包:
cd ~/ros_hello_world_ws/src
catkin_create_pkg hello_world_py rospy std_msgs
在src文件夹中创建一个新的Python文件,例如publisher.py,并编写发布者节点的代码:
#!/usr/bin/env pythonimport rospy
from std_msgs.msg import Stringdef publisher():pub = rospy.Publisher('hello_topic', String, queue_size=10)rospy.init_node('hello_world_py_publisher', anonymous=True)rate = rospy.Rate(1)while not rospy.is_shutdown():msg = "Hello, ROS from Python!"rospy.loginfo(msg)pub.publish(msg)rate.sleep()if __name__ == '__main__':try:publisher()except rospy.ROSInterruptException:pass
步骤 3:创建订阅者节点
在同一包中创建另一个Python文件,例如subscriber.py,并编写订阅者节点的代码:
#!/usr/bin/env pythonimport rospy
from std_msgs.msg import Stringdef callback(data):rospy.loginfo("Received: %s", data.data)def subscriber():rospy.init_node('hello_world_py_subscriber', anonymous=True)rospy.Subscriber('hello_topic', String, callback)rospy.spin()if __name__ == '__main__':subscriber()
步骤4:Python版CMakeLists.txt配置
在Python版的示例中,假设您的工作空间位于~/ros_hello_world_ws,ROS软件包的名称是hello_world_py。以下是CMakeLists.txt文件的配置:
cmake_minimum_required(VERSION 2.8.3)
project(hello_world_py)find_package(catkin REQUIRED COMPONENTSrospystd_msgs
)catkin_package(CATKIN_DEPENDS rospy std_msgs
)include_directories(include${catkin_INCLUDE_DIRS}
)catkin_install_python(PROGRAMSscripts/publisher.pyscripts/subscriber.pyDESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
步骤 5:编译和运行
回到工作空间的根目录,编译工作空间并运行发布者和订阅者节点:
cd ~/ros_hello_world_ws
catkin_make
source devel/setup.bash# 启动发布者节点
rosrun hello_world_py publisher.py# 在新的终端中启动订阅者节点
rosrun hello_world_py subscriber.py

相关文章:
ROS入门-第 1 章 ROS概述与环境搭建
目录 第 1 章 ROS概述与环境搭建 1.1 ROS简介 1.1.1 ROS概念 1.1.2 ROS设计目标 1.1.3 ROS发展历程 1.3 ROS快速体验 1.3.1 HelloWorld实现简介 1.3.2 HelloWorld(C版) 步骤 1:创建工作空间 步骤 2:创建发布者节点 步骤…...
spring之AOP简单介绍
1.AOP的概念 AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个 事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,…...
使用Spark ALS模型 + Faiss向量检索实现用户扩量实例
1、通过ALS模型实现用户/商品Embedding的效果,获得其向量表示 准备训练数据, M (U , I, R) 即 用户集U、商品集I、及评分数据R。 (1)商品集I的选择:可以根据业务目标确定商品候选集,比如TopK热度召回、或…...
Jmeter入门之digest函数 jmeter字符串连接与登录串加密应用
登录请求中加密串是由多个子串连接,再加密之后传输。 参数连接:${var1}${var2}${var3} 加密函数:__digest (函数助手里如果没有该函数,请下载最新版本的jmeter5.0) 函数助手:Options > …...
uni-app实现图片上传功能
效果 代码 <uni-forms-item name"ViolationImg" label"三违照片 :"><uni-file-picker ref"image" limit"1" title"" fileMediatype"image" :listStyles"listStyles" :value"filePathsL…...
golang协程池库tunny实践
前言 线程池大家都听过,其主要解决的是线程频繁创建销毁带来的性能影响,控制线程数量。 go协程理论上支持百万协程并发,协程创建调度的消耗极低,但毕竟也是消耗对吧。 而且协程池可以做一些额外的功能,比如限制并发&…...
Android性能优化—数据结构优化
优化数据结构是提高Android应用性能的重要一环。在Android开发中,ArrayList、LinkedList和HashMap等常用的数据结构的正确使用对APP性能的提升有着重大的影响。 一、ArrayList ArrayList内部使用的是数组,默认大小10,当数组长度不足时&…...
STL模板——vector详解
一、vector对象的定义和初始化方式 vector 中的数据类型 T 可以代表任何数据类型,如 int、string、class、vector(构建多维数组) 等,就像一个可以放下任何东西的容器,因此 vector 也常被称作容器。字符串类型 string …...
国际顶级学术会议ISSTA召开,中山大学与微众银行联合发表区块链最新研究成果
美国当地时间7月17日,软件工程领域顶级会议ISSTA 2023在西雅图正式召开。ISSTA (The 32nd ACM SIGSOFT International Symposium on Software Testing and Analysis )是软件测试与分析方面最著名的国际会议之一,也是中国计算机学会…...
Android开发从0开始(图形与按钮)
Drawable: drawable是抽象类。包括图片,色块,画板,背景。 drawable-ldpi 存放低分辨率图片。drawable-hdpi 高分辨率。drawable-xxhdpi 超高分辨率。 Android:src”drawable/image” 即可使用 Shape: 形状图形。圆角,矩形等常见几…...
Git入门到精通——保姆级教程(涵盖GitHub、Gitee、GitLab)
文章目录 前言一、Git1.Git-概述1.1.Git-概述-版本控制介绍1.2.Git-概述-分布式版本控制VS集中式版本控制1.3.Git-概述-代码托管中心1.4.Git-概述-安装和客户端的使用 2.Git-命令(常用命令)2.1.Git-命令-设置用户签名2.2.Git-命令-初始化本地库2.3.Git-命令-查看本地库状态2.4.…...
题解 | #J.Permutation and Primes# 2023牛客暑期多校8
J.Permutation and Primes 构造 题目大意 给定一个正整数 n n n ,构造一个 n n n 的排列,使得每对相邻元素的和或差的绝对值为一奇素数 解题思路 两个数的和或差是奇数,那么它们的奇偶性一定是不同的,因此所求排列中&#…...
用vim打开后中文乱码怎么办
Vim中打开文件乱码主要是文件编码问题。用户可以参考如下解决方法。 1、用vim打开.vimrc配置文件 vim ~/.vimrc**注意:**如果用户根目录下没有.vimrc文件就把/etc/vim/vimrc文件复制过来直接用 cp /etc/vim/vimrc ~/.vimrc2、在.vimrc中加入如下内容 set termen…...
自然语言处理: 第六章Transformer- 现代大模型的基石
理论基础 Transformer(来自2017年google发表的Attention Is All You Need (arxiv.org) ),接上面一篇attention之后,transformer是基于自注意力基础上引申出来的结构,其主要解决了seq2seq的两个问题: 考虑了原序列和目…...
01-Hadoop集群部署(普通用户)
Hadoop集群部署(普通用户) 环境准备 1)准备3台客户机(关闭防火墙、静态IP、主机名称) 如果这一步已经配置过了,可以忽略 # 1 关闭防火墙 systemctl stop firewalld.service # 关闭当前防火墙 systemctl…...
DC电源模块关于的电路布局设计
BOSHIDA DC电源模块关于的电路布局设计 DC电源模块是现代电子设备中常用的电源模块之一,其功能是将市电或其他输入电源转换成定电压、定电流的直流电源输出,以满足电子设备的供电需求。电路布局的设计是DC电源模块的重要组成部分,它直接影响…...
MATLAB实现免疫优化算法(附上多个完整仿真源码)
免疫优化算法是一种基于免疫学原理的优化算法。该算法的基本思想是通过模拟人类免疫系统的功能,来寻找最优解。 MATLAB是一种专门用于数学计算和数据处理的软件工具,它具有强大的数学计算和数据分析能力,可以方便地实现各种优化算法。 本文…...
登录界面中图片验证码的生成和校验
一、用pillpw生成图片验证码 1、安装pillow pip install pip install pillow2、下载字体 比如:Monaco.ttf 3、实现生成验证码的方法 该方法返回一个img ,可以把这个img图片保存到内存中,也可以以文件形式保存到磁盘,还返回了验证码的文字…...
go的make使用
在 Go 语言中,make 是一个用于创建切片、映射(map)和通道(channel)的内建函数。它提供了一种初始化和分配内存的方式,用于创建具有特定长度和容量的数据结构。下面将详细介绍 make 函数的使用方法和各种情况…...
竞赛项目 深度学习实现语义分割算法系统 - 机器视觉
文章目录 1 前言2 概念介绍2.1 什么是图像语义分割 3 条件随机场的深度学习模型3\. 1 多尺度特征融合 4 语义分割开发过程4.1 建立4.2 下载CamVid数据集4.3 加载CamVid图像4.4 加载CamVid像素标签图像 5 PyTorch 实现语义分割5.1 数据集准备5.2 训练基准模型5.3 损失函数5.4 归…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
