ROS2入门学习——ROS在机器人中的运行
一、入门级基础平台TurtleBot
TurtleBot 是 ROS 中重要且资源丰富的机器人之一,特别适合入门级机器人爱好者提供基础平台。用户可以直接利用其自带的软硬件,专注于应用程序的开发。TurtleBot 随着 ROS 的发展,一直处于开发前沿。
TurtleBot相关机器人示例
二、通用的机器人控制结构
这张图展示了一个基于ROS(Robot Operating System)构建的机器人系统架构。以下是主要组件和它们之间的关系的分析:
1. 远程监控计算机(PC):
主要工具包括 Rviz、Rqt 和 Gazebo,用于可视化、数据监控和仿真。
通过 Wi-Fi 实现与应用计算机的通信,使用 Topic 和 Service 进行信息交换。
2. 应用计算机(如 JetNano 和 PC):
实现了 ROS Master,负责管理 ROS 网络中的所有节点。
包含多个功能模块,如 SLAM(同步定位与地图构建)、图像处理、导航和人工智能等。
通过 UART、TCP 和 USB 与控制器进行数据交换。
3. 控制器(如 STM32、Arduino):
负责低层次的控制,执行 PID 控制、定时器管理、PWM 输出、AD/DA 转换等功能。
可以通过 UART、I2C 和 SPI 与传感器和执行器(如电机、编码器、IMU、声纳和伺服电机)进行通信。
4. 传感器和执行器:
包括麦克风、激光、摄像头等传感器,用于环境感知。
执行器如电机和伺服电机用于实现机器人的运动。
这个架构设计强调了模块化和灵活性,允许各个部分独立开发和集成。
三、ROS\ROS2是什么?
3.1 智能机器人时代
3.2 为什么学习ROS?
学习ROS(Robot Operating System)有许多重要的理由,尤其是对机器人和自动化领域的研究与开发。
首先,ROS已经成为机器人研究和开发领域的事实标准,许多学术研究、商业项目和开源项目都基于ROS,学习它可以使你在这些领域更具竞争力。
其次,作为一个开源项目,ROS拥有一个活跃的社区,提供了大量的文档、教程和示例代码。社区的支持使得解决问题变得更加容易,也增加了项目的可持续性。
第三,ROS的模块化设计允许复杂的机器人系统被分解成多个独立的模块。这不仅简化了开发过程,还使得代码更容易维护和重用。
此外,ROS支持多个操作系统(如Linux、Windows和MacOS)和编程语言(如Python和C++),这使得开发者可以在他们熟悉的环境和语言中进行工作。
再者,ROS提供了丰富的库和工具,例如仿真工具(如Gazebo)、可视化工具(如Rviz)以及各种传感器和算法的驱动程序,这些工具能够极大地加速开发过程并提升开发效率。
最后,学习ROS可以为你的职业发展提供更多机会,尤其是在机器人技术和自动化领域,许多公司和研究机构都在使用ROS进行开发和研究。
3.3 ROS的诞生:
ROS,全称为机器人操作系统(Robot Operating System),是一个开源的机器人软件平台,旨在为机器人软件开发提供框架和工具。
在2000年代初,随着机器人技术的发展,研究人员和工程师们面临着如何更高效地开发、测试和部署机器人软件的问题。由于当时缺乏标准化的工具和框架,每个机器人项目通常都是从头开始创建软件,这导致了资源的浪费和开发效率的低下。
2007年:ROS 的初始版本是在斯坦福大学的人工智能实验室(SAIL)中开发的,最初是为了一款名为 "Stanford Autonomous Helicopter" 的无人机项目而创建的。
2008年:ROS 正式发布,并开始被更广泛的研究社区所接受。其设计目标是提供一个模块化的框架,使得不同的机器人系统可以共享代码和算法。
3.4 ROS的发展历程:
1. 初始阶段(2007-2010年)
- 2007年:ROS的最初版本在斯坦福大学的人工智能实验室(SAIL)中被开发,目的是支持“斯坦福自主直升机”项目。此时,ROS主要用于实验和研究。
- 2008年:ROS的第一个正式版本发布,标志着ROS向更广泛的社区开放。
2. 社区成长(2010-2013年)
- 2010年:ROS的第一个大型版本“Electric”发布,带来了许多新的功能和包,社区开始慢慢壮大。
- 2011年:ROS的“Fuerte”版本发布,进一步加强了用户社区的支持和文档的丰富性。
- 2012年:ROS的“Groovy”版本发布,引入了更强大的工具和库,推动了更多外部开发者的参与。
- 2013年:ROS的“Hydro”版本发布,增加了对传感器和控制的支持,同时为复杂的机器人系统提供了更好的功能。
3. 标准化与成熟(2013-2018年)
- 2013年:ROS正式成为开源软件项目,得到更多研究机构和公司的支持和参与。
- 2014年:ROS的“Indigo”版本发布,成为一个长期支持(LTS)版本,受到广泛应用。
- 2016年:ROS的“Kinetic”版本发布,进一步提升了稳定性和用户体验,成为另一个LTS版本。
- 2017年:ROS 2 的开发开始,旨在克服ROS 1的一些局限性,如实时支持和多平台兼容性。
4. ROS 2的推出(2018年至今)
- 2019年:ROS 2的“Dashing Diademata”版本发布,标志着ROS 2的正式推出。ROS 2引入了新的架构,支持实时操作和更强的安全性。
- 2020年:ROS 2的“Eloquent Elusor”版本发布,增加了对更多功能和工具的支持。
- 2021年:ROS 2的“Foxy Fitzroy”版本发布,成为另一个长期支持版本,受到广泛应用。
5. 当前与未来
- 2022年:ROS 2的“Galactic Geochelone”版本发布,继续增强功能和用户体验。
- 2023年:ROS 2的“Humble Hawksbill”版本发布,进一步提升稳定性和开发者工具。
影响与展望
- ROS的发展改变了机器人软件的开发方式,促进了代码的共享与重用,并推动了机器人技术的进步。
- 未来,ROS将继续发展,适应不断变化的技术需求,尤其是在人工智能、自动化和工业4.0等领域的广泛应用。
四、Linux系统介绍及安装
5.1 操作系统是什么?
操作系统是一种用于管理和控制计算机硬件与软件资源的核心程序。
它作为计算机最基础的系统软件,直接在没有任何其他软件支持的情况下运行在物理硬件上。
所有其他应用程序和软件都依赖于操作系统提供的服务和支持才能正常运行。
简而言之,操作系统是计算机系统的基础构件,负责协调所有计算任务和资源。
5.2 Linux是什么?
类Linux系统:类Linux系统是一种自由且开源的操作系统,它在设计和功能上类似于Unix。
Linux内核:严格来说,“Linux”这个词指的是Linux内核,它是操作系统的核心部分,负责管理硬件资源和系统进程。
历史背景:Linux内核是由芬兰赫尔辛基大学的学生林纳斯·托瓦兹(Linus Torvalds)于1991年编写的。
GNU计划:这个内核后来被整合进了自由软件基金会的GNU计划中(GNU是“GNU's Not Unix”的递归缩写),这个项目旨在创建一个完全自由的操作系统。
标志和象征:Linux的标志是一只可爱的企鹅,这只企鹅象征着勇于创新和热爱生活的精神。
5.3 Linux发行版是什么?
Linux内核:这是操作系统的核心组件,负责管理硬件资源和系统进程。
安装工具:这是一套用于将整个操作系统和相关软件安装到计算机上的工具。
GNU软件:各种由GNU项目开发的自由软件,这些软件为系统提供了许多基础功能和工具。
其他自由软件:除了GNU软件之外,发行版还包含许多其他开源软件,用于丰富系统功能和用户体验。
专有软件:在一些特定的Linux发行版中,也包含了一些专有软件,以满足特定的用户需求或提供额外的功能。
5.4 Ubuntu安装方法
虚拟机中安装教程:
镜像下载地址:https://ubuntu.com/download/desktop
五、Linux系统基础知识
5.1 Ubuntu界面设置
文件管理器:
软件中心与配置系统软件源:
应用程序列表:
终端界面(Ctrl+Ail+t快捷打开):
5.2 命令行基础语法
命令行对于熟练操作Linux/Unix系统的用户来说是不可或缺的。
与Windows的“一键操作”相比,命令行应用的可扩展性和灵活性更强。
这种操作方式超越了单纯的鼠标点击,赋予用户更多的灵活性和创造空间。
命令行已经成为Linux/Unix系统的典型特征,也是其独特魅力的源泉。
1. 文件和目录操作
(1)ls列出目录内容。
ls
(2)cd改变当前工作目录。
cd /path/to/directory
(3)pwd 显示当前工作目录的路径。
pwd
(4)mkdir创建新目录。
mkdir new_directory
(5)rmdir 删除空目录。
rmdir directory_name
(6)cp复制文件或目录。
cp source_file destination_file
(7)mv
移动或重命名文件或目录。
mv old_name new_name
(8)rm
删除文件或目录。
rm file_name
2. 文件内容查看和编辑
(1)
cat
连接文件并打印到标准输出。
cat file_name
(2)more
分页查看文件内容。
more file_name
(3)less
分页查看文件内容,支持向前翻页。
less file_name
(4)head
显示文件的前几行。
head file_name
(5)tail
显示文件的最后几行。
tail file_name
(6)nano
简单的文本编辑器。
nano file_name
(7)vi
或 vim
功能强大的文本编辑器。
vi file_name
3. 权限管理
(1)
chmod
更改文件或目录的权限。
chmod 755 file_name
(2)chown
更改文件或目录的所有者。
chown user:group file_name
4. 系统信息
(1)uname
显示系统信息。
uname -a
(2)top
实时显示系统性能信息。
top
(3)ps
显示当前进程列表。
ps aux
(4)df
显示文件系统磁盘空间使用情况。
df -h
(5)du
显示目录或文件的磁盘使用情况。
du -sh directory_name
5.网络操作
(1)ping
测试网络连接。
ping example.com
(2)ifconfig
显示或配置网络接口(在较新的系统中使用 ip
命令)。
ifconfig
(3)wget
从网络下载文件。
wget http://example.com/file
(4)curl
从网络获取或发送数据。
curl http://example.com
6. 管道和重定向
(1)|
管道,将一个命令的输出作为另一个命令的输入。
ls | grep keyword
(2)>
重定向输出到文件(覆盖)。
ls > output.txt
(3)>>
重定向输出到文件(追加)。
ls >> output.txt
(4)<
从文件中读取输入。
command < input.txt
这些命令只是Linux命令行的冰山一角。通过实践和探索,您会发现更多有用的命令和用法。
六、 C++&Python极简基础
6.1 C++&Python对比:
机器人操作系统(ROS,Robot Operating System)是一种用于编写机器人软件的灵活框架。ROS支持多种编程语言,其中C++和Python是最常用的两种。
1. 性能和效率
C++:
性能:C++是一种编译型语言,具有高性能和低延迟的特点。在需要实时响应和高效处理的机器人应用中,C++的性能优势明显。
效率:C++允许精细的内存管理和硬件控制,使其非常适合对资源要求高的机器人任务。
Python:
性能:作为一种解释型语言,Python在性能上不如C++,但通过使用C/C++扩展模块,可以提高某些计算密集型任务的性能。
效率:Python擅长快速开发、原型设计和脚本编写。对于不需要实时性能的任务,Python是一个高效的选择。
2. 开发速度和易用性
C++:
开发速度:由于其复杂的语法和内存管理,C++的开发速度相对较慢。
易用性:C++有较高的学习曲线,需要掌握指针、内存管理、多线程编程等高级概念。
Python:
开发速度:Python的简洁语法和动态类型系统使得开发速度较快,适合快速迭代和原型开发。
易用性:Python的语法简洁明了,容易上手,非常适合初学者和快速开发。
3. 库和工具支持
C++:
库支持:C++在ROS中有广泛的库支持,包括ROS的核心库和许多第三方库。
工具支持:C++在ROS开发中的工具链较为完善,支持调试、性能分析和内存管理等。
Python:
库支持:Python也有丰富的库支持,特别是在数据处理、机器学习和AI领域。
工具支持:Python的开发工具和调试器也相当丰富,虽然不如C++在实时调试和性能分析方面强大,但足以满足大多数ROS开发需求。
4. 社区和文档
C++:
ROS的C++社区活跃,有大量的资源、教程、示例代码和文档,可以帮助开发者解决问题。
Python:
Python的ROS社区也非常活跃,尤其适合新手和快速开发者。Python在ROS中的文档、教程和示例代码同样丰富。
5. 应用场景
C++:
适合高性能、实时性要求高的机器人应用,如控制系统、传感器处理和嵌入式系统。
通常用于生产环境和需要长期维护的项目。
Python:
适合开发原型、测试和数据处理任务,如图像处理、机器学习和机器人行为编程。
非常适合快速迭代和开发周期短的项目。
6.2 for循环
C++:
#include <iostream>
using namespace std;
int main() {
int a = 5; // 初始化变量 a
for (a; a < 10; a++) { // 循环条件,确保 a 小于 10
cout << "a=" << a << endl; // 输出 a 的值
}
return 0; // 结束程序
}
Python:
for a in range(5, 10): # 从 5 到 9
if a < 10:
print(a) # 打印 a 的值
else:
break # 如果 a >= 10,退出循环
6.3 while循环
C++:
#include <iostream> // 包含输入输出流库
using namespace std;
int main() {
int a = 5; // 初始化变量 a
while (a < 10) { // 当 a 小于 10 时循环
cout << a << endl; // 输出 a 的值
a++; // 将 a 增加 1
}
return 0; // 程序结束
}
Python:
a = 5 # 初始化变量 a
while a < 10: # 当 a 小于 10 时循环
print(a) # 输出 a 的值
a += 1 # 将 a 增加 1
6.4 面向对象
C++:
#include <iostream> // 正确包含输入输出流库
class A {
public: // 访问修饰符 public 应该是 public
int i; // 成员变量 i
void test() { // test 函数的定义
std::cout << i << std::endl; // 正确输出 i 的值
}
};
int main() {
A a; // 创建 A 类的实例 a
a.i = 10; // 为成员变量 i 赋值
a.test(); // 调用 test 函数
return 0; // 程序结束
}
Python:
class A:
i = 10 # 类变量 i
def test(self):
print(self.i) # 输出类变量 i
a = A() # 创建 A 类的实例 a
a.test() # 调用 test 方法