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

 

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

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

相关文章

8.10 用redis实现缓存功能和Spring Cache

什么是缓存? 缓存(Cache), 就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码。 通过Redis来缓存数据&#xff0c;减少数据库查询操作; 逻辑 每个分类的菜品保存一份缓存数据 数据库菜品数据有变更时清理缓存数据 如何将商品数据缓存起…

DAY21

题目一 给定三个字符串str1、str2和aim&#xff0c; 如果aim包含且仅包含来自str1和str2的所有字符&#xff0c;而且在aim中属于str1的字符 之间保持原来在str1中的顺序&#xff0c;属于str2的字符之间保持原来在str2中的顺序&#xff0c;那么称aim是str1和str2的交错组成。实…

适配器模式:将不兼容的接口转换为可兼容的接口

适配器模式&#xff1a;将不兼容的接口转换为可兼容的接口 什么是适配器模式&#xff1f; 适配器模式是一种结构型设计模式&#xff0c;用于将一个类的接口转换为客户端所期望的另一个接口。它允许不兼容的类能够合作&#xff0c;使得原本由于接口不匹配而无法工作的类能够一…

IDEA常用设置与maven项目部署

目录 前言 一、Idea是什么 二、Idea的优点 三、Idea的常用设置 主题设置 设置鼠标悬浮提示 忽略大小写提示 自动导包 取消单行显示Tabs 设置字体 配置类文档注释信息模版 设置文件编码 设置自动编译 水平或者垂直显示代码 快捷方式改成eclipse 设置默认浏览器…

SCSS的基本用法

1、声明变量 $ 声明变量的符号 $ 下面这张图左半部分是scss的语法&#xff0c;右半部分是编译后的css。&#xff08;整篇文章皆是如此&#xff09; 2、默认变量 !default sass 的默认变量仅需要在值后面加上 !default 即可。 如果分配给变量的值后面添加了 !default 标志…

HDMI接口的PCB布局布线要求

高清多媒体接口&#xff08;High Definition Multimedia Interface&#xff09;&#xff0c;简称&#xff1a;HDMI&#xff0c;是一种全数字化视频和声音发送接口&#xff0c;可以发送未压缩的音频及视频信号。随着技术的不断提升&#xff0c;HDMI的传输速率也不断的提升&#…

Qt5开发视频播放器

一、播放器界面UI设计 控件对象名位置&#xff08;坐标点&#xff09;对象名称组件名称备注Widget(0, 0, 809, 572)WidgetQWidgetlabellabelQLabel播放窗口label_2label_2QLabelvoice_controlvoice_controlQSlider音量滑动条btn_openbtn_openQPushButton打开文件按钮label_4la…

CSDN热榜分析:来看看热榜都在写什么

文章目录 数据爬取词云制作滤除停用词 数据爬取 热榜地址是https://blog.csdn.net/rank/list&#xff0c;先进去再说 from selenium import webdriver from selenium.webdriver.common.by import By url https://blog.csdn.net/rank/list driver webdriver.Edge() driver.g…

Python批量给excel文件加密

有时候我们需要定期给公司外部发邮件&#xff0c;在自动化发邮件的时候需要对文件进行加密传输。本文和你一起来探索用python给单个文件和批量文件加密。    python自动化发邮件可参考【干货】用Python每天定时发送监控邮件。 文章目录 一、安装pypiwin32包二、定义给excel加…

SQL | 汇总数据

9-汇总数据 9.1-聚集函数 在实际开发过程中&#xff0c;可能会遇到下面这些情况&#xff1a; 确定大于某个值的有多少行数据&#xff0c;比如游戏排行榜&#xff0c;查询玩家排行多少名。 获取表中某些行的和&#xff0c;比如双十一当天&#xff0c;某个用户总订单价格是多少…

开源,微信小程序 美食便签地图(FoodNoteMap)的设计与开发

目录 0 前言 1 美食便签地图简介 2 美食便签地图小程序端开发 2.1技术选型 2.2前端UI设计 2.3主页界面 2.4个人信息界面 2.5 添加美食界面 2.6美食便签界面 2.8 美食好友界面 2.9 美食圈子界面 2.10 子页面-店铺详情界面 2.11 后台数据缓存 2.12 订阅消息通知 2.1…

SpringBoot第36讲:SpringBoot集成连接池 - 集成数据库Druid连接池

SpringBoot第36讲&#xff1a;SpringBoot集成连接池 - 集成数据库Druid连接池 上文介绍默认数据库连接池HikariCP&#xff0c;本文是SpringBoot第36讲&#xff0c;主要介绍SpringBoot集成阿里开源的Druid连接池的实践; 客观的来说&#xff0c;阿里Druid只能说是中文开源中 功能…

excel填数据转json格式

定制化比较严重&#xff0c;按需更改 excel文件如下 代码 # -*- coding: utf-8 -*- import oss2 import shutil import sys import xlwt import xlrd import json from datetime import datetime, timedeltafile1 "C:\\Users\\cxy\\Desktop\\generate.xls" #打开表…

OCP China Day 2023:五大社区齐聚,加速开源开放创新与落地

8月10日&#xff0c;2023年开放计算中国社区技术峰会&#xff08;OCP China Day 2023&#xff09;在北京举行。智慧时代&#xff0c;计算多元化、应用多样化、技术复杂化正驱动数据中心新一轮变革&#xff0c;开源开放社区已成为推动数据中心持续创新的重要力量&#xff0c;通过…

多线程与高并发--------线程池

线程池 一、什么是线程池 在开发中&#xff0c;为了提升效率的操作&#xff0c;我们需要将一些业务采用多线程的方式去执行。 比如有一个比较大的任务&#xff0c;可以将任务分成几块&#xff0c;分别交给几个线程去执行&#xff0c;最终做一个汇总就可以了。 比如做业务操…

Maven进阶2 -- 私服(Nexus)、私服仓库分类、资源上传和下载

目录 私服是一台独立的服务器&#xff0c;用于解决团队内部的资源共享与资源同步问题。 1.Nexus Nexus是sonatype公司的一款maven私服产品。 下载地址 启动 nexus.exe /run nexus 访问 & 登录 2.私服仓库分类 3.资源上传和下载 本地仓库上传和访问资源需要进行配置。…

SpingBoot-Vue前后端——实现CRUD

目录​​​​​​​ 一、实例需求 ⚽ 二、代码实现 &#x1f3cc; 数据库 &#x1f440; 后端实现 &#x1f4eb; 前端实现 &#x1f331; 三、源码下载 &#x1f44b; 一、实例需求 ⚽ 实现一个简单的CRUD&#xff0c;包含前后端交互。 二、代码实现 &#x1f3cc; 数…

Java SPI机制

Java SPI机制 java的spi就是一种服务提供发现机制&#xff0c;在一方制定好接口规范后&#xff0c;通过spi的机制可以它的子实现类进行服务发现&#xff0c;以及加载它的子实现类&#xff0c;通过这种机制&#xff0c;让我们在引入第三方库时&#xff0c;不用讲第三方库中的类…

管易云和金蝶云星空接口打通对接实战

管易云和金蝶云星空接口打通对接实战 对接系统管易云 管易云是上海管易云计算软件有限公司旗下的专注提供电商企业管理软件服务的品牌&#xff0c;总部位于中国上海张江高科技产业园区。管易云旗下拥有管易云C-ERP、EC-OMS、EC-WMS、B2C/B2B/BBC/微商城开发、PDA无纸化仓储解决…

TypeScript项目中Axios的封装

目录 前言 一、axios中的常见类型 1. AxiosInstance 2. AxiosRequestConfig 3. AxiosResponse 4. AxiosError 二、axios封装步骤 三、封装后的完整代码 1. 基础封装 2. 高级封装 前言 为了实现统一的网络请求处理和管理&#xff0c;在日常开发中我们常常封装 axios&…