ROS2简记一:第一个ros2程序,海龟模拟与C++和python的《你好,世界!》

目录

引言

一、控制小海龟

二、键盘控制海龟

三、控制海龟案例的简单分析

四、ROS2之linux基础

4.1 linux终端命令

4.1.1 查看当前终端所在目录 pwd

4.1.2 切换终端所在目录 cd

4.1.3 查看当前目录下的文件 ls

4.1.4 主目录 ~

4.1.5 文件的操作

4.1.6 命令使用帮助 --help

4.1.7 软件安装常用命令

4.2 linux中编写程序

4.2.1 首个python程序

4.2.2 首个C++程序

4.2.2.1 初识g++编译工具

4.2.2.2 初识cmake编译工具

4.3 Linux的环境变量


引言

操作环境:

VMWare17.6,虚拟机ubuntu22.04

在虚拟机ubuntu22.04操作系统中安装好ros2环境后,进行第一个小demo——海龟模拟器,同时了解需要了解的几个linux命令,在ros2中使用C++和python编写hello,world,一起走进ros2的机器人的世界。

一、控制小海龟

进入ubuntu22.04,同时按下Ctrl+Alt+T快速启动一个新的终端,接着输入ros2,验证ros2环境是否安装成功:

若输入ros2回车后终端输出如上图所示内容,说明ros2安装成功。上图内容展示了ros2后面可以接的内容和使用方法等。

接着进入正题,在终端中输入ros2 run turtlesim turtlesim_node后回车,即可运行海龟模拟器节点,终端中呈现内容如下:

然后,会弹出如下图所示的一个有颜色背景的窗口,同时里面会有一只小海龟。其中海龟的形态是随机的,这是由其实现逻辑决定,这里可不必深究。

提示:输入一行命令时,通过单击键盘上的tab键,可将输入的不完整内容自动补全,节省时间,减少命令不熟悉带来的不便。如终端输入ros2 r时单击tab即可补全为ros2 run.

接下来,简单分析这段海龟模拟器的控制命令。

该指令由四部分组成:

1、ros2 和 run 表示该命令式用于运行ros2程序;

2、turtlesim 表示一个程序包名称,程序包可用于存放众多可执行程序;

3、turtlesim_node 表示可执行程序的名称,是前面输入的程序包中的其中一个。

即:该指令是使用ros2运行一个turtlesim程序包下的turtlesim_node可执行文件

二、键盘控制海龟

在不关闭上面海龟模拟器程序的前提下,再开一个新的终端,输入ros2 run turtlesim turtle_teleop_key并回车执行:

依据前面的描述,可见该命令是用在使用ros2运行一个turtlesim程序包中的turtle_teleop_key可执行文件。运行之后,将鼠标停留在该终端后,即可捕获电脑键盘的输入,接下来就可以使用键盘控制前面打开的海龟在其窗口中随意运动了。

三、控制海龟案例的简单分析

接下来我们借助ros2提供的一个节点关系图工具分析这两个命令程序之间的联系,解开为什么键盘能够控制小海龟运动的疑惑。

不要结束前面执行的命令,再开启一个新的终端,输入rqt并回车,可以看见弹出一个默认的rqt窗口,如下图所示

四、ROS2之linux基础

4.1 linux终端命令

4.1.1 查看当前终端所在目录 pwd

ctrl+Alt+T开启一个新终端,输入pwd回车,可以看见下面输出了一个目录路径,该路径表示当前终端所在路径,也就是使用快捷键开启终端所在的默认路径主目录。

注:linux中,斜杠 “ / ” 表示整个文件系统的根目录,这是与日常使用的windows系统的一个显著区别,其他目录和文件位置均是相对这个根目录而言。

4.1.2 切换终端所在目录 cd

在终端中输入 cd / 回车,进入根目录下。然后输入pwd回车看看当前终端所在的目录已经变成了 / 根目录。

4.1.3 查看当前目录下的文件 ls

在终端输入ls回车,可以查看当前终端所在目录下包含的文件。

4.1.4 主目录 ~

前面说到,快捷键进入终端时,会默认进入主目录下。本例的用户名为zzl,因此主目录就是/home/zzl。因为linux中主目录经常用到,所以使用 ~ 表示。

当想回到主目录时,终端输入 cd ~ 回车即可。

4.1.5 文件的操作

进入主目录,来进行几个文件的基本操作。

1、创建文件夹 mkdir <文件夹名>

终端中输入mkidr chapt并回车,即可在住目录下创建一个叫做 chapt 的文件夹

然后,输入 cd chapt 进入该文件夹

2、创建空白文件 touch <文件名.后缀名>

进入chapt文件夹后,输入 touch hello_world.txt回车,即可在该文件夹下创建一个空白的hello_world.txt文本文件,然后我们查看当前终端所在的目录,以及该目录下存在的文件

3、文件的编辑 nano <文件名.后缀名>

nano是安装ubuntu时自带的文本编辑工具,终端中输入nano hello_world.txt回车,即可进入该文件的编辑模式,然后我们输入 hello ros2 !,按 ctrl + O后再回车,即可将内容写入该文件中,最后按ctrl + X即可退出对该文件的编辑。

4、文件的查看 cat <文件名.后缀名>

终端输入 cat hello_world.txt回车,即可看见上一步向该文件中写入的内容。

5、文件的删除 rm <文件名.后缀名>

终端输入 rm hello_world.txt回车,即可删除该文件

4.1.6 命令使用帮助 --help

Linux中的命令远比这些丰富,碰到某些命令的不记得是正常的事情,我们可以使用命令 --help 来查看命令的使用帮助,如输入 rm --help 可以查看 rm命令使用帮助

亦或是输入 ros2 run --help 查看ros2 run的使用方式

4.1.7 软件安装常用命令

1、 包管理工具 dpkg

在linux中,我们可以使用 dpkg 相关命令来进行软件的安装,如 sudo dpkg -i <软件包名.deb>

1. sudo,表示以管理员权限执行后面的命令;

2. dpkg,ubuntu中的包管理工具,可用于安装、查看和卸载软件包;

3. -i,代表安装的意思。

默认情况下,我们从官网下载的软件包会存放在 ~/下载 或者 ~/Downloads 目录下,ubuntu中下载的软件包后缀名一般为 .deb 

2、 更高级的包管理工具 apt

使用dpkg可以直接安装下载好的deb格式的安装包,另外还可以使用 apt 命令,直接通过软件名自动下载后进行安装。

如版本管理工具git的安装:

终端输入git命令,若ubuntu中没有安装,则会显示找不到该命令,并提示你使用apt命令安装它

因此,输入sudo apt install git并回车,就会开始下载和安装。

因为我这里已经安装过,所以输入的内容比较简洁。

安装完成后,输入git进行测试,当终端输出类似如下内容时,说明git已经安装成功

4.2 linux中编写程序

我们在linux中使用VSCode进行代码编写和运行,关于vscode的下载安装和配置(需要的插件安装)这里不再赘述,比较简单,不会可自行搜索或者合理运用AI。

4.2.1 首个python程序

快捷键Ctrl+Alt+T快速开启一个新终端,在终端输入code并回车,打开vscode进入主界面。

首次使用vscode时,显示都是英文,大家可以点击左边竖栏中从上至下数第五个图标,然后在搜索框搜索 chinese,然后安装插件,接着重启即可显示中文。

然后我们打开前面创建的chapt文件夹,然后新建python文件,命名为 hello_world.py回车,即可创建成功。

接着,在新建的python文件中编写第一段程序,输出一句 'Hello, World!',然后ctrl+s保存。

最后,在vscode的终端中,输入 python3 hello_world.py回车即可执行程序,运行成功。

4.2.2 首个C++程序

与前面python程序创建同理,这里不再赘述。然后同样编写一个经典的“Hello, World!”,然后记得保存。

4.2.2.1 初识g++编译工具

ubuntu22.04中含C++编译工具g++,所以我们可以在终端中输入 g++ hello_world.cpp,对该C++文件进行编译

编译后,使用ls命令可以看到目录下生成了一个绿色的a,out文件,绿色代表该文件是一个可执行文件。终端输入 ./a.out 回车即可执行程序,输出打印的 Hello, World!

4.2.2.2 初识cmake编译工具

使用g++可以方便地编译一些较为简单的代码,对于功能复杂、需要较多依赖的复杂代码的编译,我们常使用CMake更为方便。

首先,在chapt目录下,我们新建一个文件CMakeLists.txt,然后编辑该文件,在文件中写入如下图所示三行内容,具体操作参照前面叙述的文件的创建、编辑操作即可,这里不再赘述。

三条代码具体含义

    1. cmake_minimum_required (VERSION 3.8),表示用于构建当前文件的CMake版本最低为3.8;

    2. project (HelloWorld),用于声明当前工程名;

    3. add_executable(learn_cmake hello_world.cpp),用于添加一个可执行文件,learn_cmake表示可执行文件的名字,hello_world.cpp是可执行文件相对CMakeLists.txt文件的路径。

编写后保存,终端进入chapt目录,输入 cmake . 命令,然后回车即可将编写的CMakeLists.txt文件转换成CMakeFiles。

cmake . 命令的具体含义:用于构建CMakeLists.txt,参数 . 代表在当前终端所在的同级目录搜索CMakeLists.txt文件。

构建完成后,会在当前目录生成结果文件,其中Makefile文件使用make读取并进行代码编译

编译后如上图,使用make命令可以调用编译器将代码文件转换成可执行文件。使用ls查看当前文件,可以看出新产生可一个绿色的可执行文件learn_cmake,这就是我们在CMakeLists.txt中设置的可执行文件名。

同样地,在终端进入chapt目录,输入 ./learn_make 后回车,即可看见C++代码运行的结果了。

4.3 Linux的环境变量

linux的环境变量,是一种全局变量,用于存储系统和用户级别的配置信息。

打开一个新的终端,输入 echo $ROS_DISTRO ,然后回车

可以看见终端输出了ROS2的版本信息humble。


以上内容可能存在不足和纰漏,仅供参考,各位阅读时请带着批判性思维学习,遇到问题多查查,谢谢。

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

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

相关文章

监控的基本理论和prometheus安装

监控的基本理论和prometheus安装 前言 这篇博客主要讲的是关于理论的知识&#xff0c;大家尽可能的消化和吸收&#xff0c;也能扩展大家的知识面 监控的基本概念 监控俗称为运维的第三只眼。没有了监控&#xff0c;业务运维都是“瞎子”。所以说监控室运维这个职业的根本&…

互联网生态下赢家群体的崛起与“开源AI智能名片链动2+1模式S2B2C商城小程序“的赋能效应

摘要&#xff1a;本文聚焦未来互联网赢家群体的构成特征&#xff0c;剖析网红经济与专业主播的差异化发展路径&#xff0c;结合开源AI智能名片链动21模式与S2B2C商城小程序的融合创新&#xff0c;提出技术赋能下互联网商业生态的重构路径。研究表明&#xff0c;开源AI技术通过智…

OneCode 图表组件核心优势解析

一、全方位的可视化能力 OneCode 图表组件提供了15种专业图表类型&#xff0c;覆盖从基础到高级的数据可视化需求&#xff1a; 基础图表&#xff1a;柱状图、折线图、饼图、面积图等高级图表&#xff1a;金字塔图、雷达图、仪表盘、LED图表等实时图表&#xff1a;实时折线图、实…

【Linux】RHCE中ansible的配置

1.安装并配置ansible 第一步先安装ansible所需软件 #安装ansible所需软件 [devopsworkstation ~]$ sudo dnf install ansible ansible-navigator rhel-system-roles -y 第二步登录镜像仓库&#xff0c;在镜像仓库下载镜像容器来运行ansible 由于ansible-navigator 知ansible…

ubuntu server系统 安装宝塔

更新系统软件包sudo apt update && sudo apt upgrade -y提示&#xff0c;如果想博主这样是存绿色liunx系统&#xff0c;要先安装python3脚本才可以python3 --version有pyhton版本号就是安装了&#xff0c;没有的话就要安装安装 Pythonsudo apt update sudo apt install…

用C++实现五子棋游戏

#include <iostream> #include <vector> #include <string> #include <iomanip> // 用于控制输出格式 #include <limits> // 用于numeric_limitsusing namespace std;// 游戏常量定义 const int BOARD_SIZE 15; // 定义棋盘大小为15x15// 棋…

【LeetCode 热题 100】73. 矩阵置零——(解法一)空间复杂度 O(M + N)

Problem: 73. 矩阵置零 题目&#xff1a;给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 文章目录整体思路完整代码时空复杂度时间复杂度&#xff1a;O(M * N)空间复杂度&#xff1a;O(M N)整体思路…

【深度学习新浪潮】国内零样本抗体设计的科研进展如何?

什么是AI零样本抗体设计? AI零样本抗体设计(Zero-shot AI Antibody Design)是指不依赖任何已知抗体序列或结构数据,仅根据靶点抗原信息,通过人工智能直接生成具有高亲和力、高特异性的全新抗体序列的技术。其核心在于突破传统抗体研发的“数据依赖瓶颈”,实现真正的“从…

【论文阅读】A Diffusion model for POI recommendation

论文出处&#xff1a;ACM Transactions on Information Systems (TOIS) SCI一区 CCF-A期刊 论文地址&#xff1a;[2304.07041] A Diffusion model for POI recommendation 论文代码&#xff1a;Yifang-Qin/Diff-POI: The official PyTorch implementation of Diff-POI. 目…

Rust实现FasterR-CNN目标检测全流程

使用 Rust 和 FasterR-CNN 进行目标检测 FasterR-CNN 是目标检测领域广泛使用的深度学习模型。Rust 生态中可以通过 tch-rs(Torch 绑定)调用预训练的 PyTorch 模型实现。以下为完整实现步骤: 环境准备 安装 Rust 和必要的依赖: cargo add tch cargo add anyhow # 错误…

Github 2025-07-03Go开源项目日报Top10

根据Github Trendings的统计,今日(2025-07-03统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10JavaScript项目2Go编程语言:构建简单、可靠和高效的软件 创建周期:3474 天开发语言:Go协议类型:BSD 3-Clause “New” or “Revise…

XML Schema 安装使用教程

一、XML Schema 简介 XML Schema&#xff08;XSD&#xff0c;全称 XML Schema Definition&#xff09;是用于定义 XML 文档结构、数据类型和数据约束的标准方式。它比 DTD 更加强大&#xff0c;支持数据类型、默认值、命名空间等&#xff0c;是企业级 XML 应用推荐的验证方式。…

【字节跳动】数据挖掘面试题0008:计算西瓜视频内容好评率

文章大纲题目描述题目描述 西瓜视频近期开展了”2020百大人气创作者”优质内容扶持项目&#xff0c;鼓励用户产出优质的视频内容。 现需要统计2020年11月01日至2020年11月30日期间创作的视频中&#xff0c; “科技”大类下“数码测评"子类的视频好评率&#xff08;好评率好…

Linux 进程控制:全面深入剖析进程创建、终止、替换与等待

文章目录引言一、进程创建&#xff1a;fork()系统调用的奥秘1.1 fork()的基本原理1.2 代码示例与解读1.3 写时复制&#xff08;COW&#xff09;优化二、进程终止&#xff1a;exit()与_exit()的抉择2.1 exit()和_exit()的区别2.2 代码示例与分析三、进程替换&#xff1a;exec()函…

PJSIP 中的 TCP 传输配置指南

PJSIP 支持通过 TCP 传输 SIP 消息&#xff0c;相比 UDP 提供了更可靠的传输机制。以下是关于在 PJSIP 中使用 TCP 的详细指南。1. 创建 TCP 传输基本 TCP 传输配置cpjsua_transport_config tcp_cfg; pjsua_transport_config_default(&tcp_cfg); tcp_cfg.port 5060; // SI…

小菜狗的云计算之旅,今天学习MySQL数据库基础知识及操作

目录 一、概述 数据库概念 数据库的类型 关系型数据库模型 关系数据库相关概念 二、安装 1、mariadb安装 2、mysql安装 3、启动并开机自启 4、本地连接&#xff08;本地登录&#xff09; 三、mysql数据库配置与命令 yum安装后生成的目录 mysql服务器的启动脚本 数…

为什么是直接在**原型(prototype)上**添加函数

这是一个非常经典、核心的 JavaScript 面向对象编程问题&#xff1a;> 为什么是直接在**原型&#xff08;prototype&#xff09;上**添加函数&#xff0c;而不是在类/构造函数内部直接添加&#xff1f;你提到的代码中&#xff1a;javascript function TopSearchComponent() …

深入理解 classnames:React 动态类名管理的最佳实践

在现代前端开发中&#xff0c;我们经常需要根据组件的状态、属性或用户交互来动态切换 CSS 类名。虽然 JavaScript 提供了多种方式来处理字符串拼接&#xff0c;但随着应用复杂性的增加&#xff0c;传统的类名管理方式很快就会变得混乱不堪。这时&#xff0c;classnames 库就像…

C++系列(七):深度探索C++内存 --- 分区、堆栈、new/delete与高效编程实践

引言 程序运行的本质是对数据的处理&#xff0c;而内存则是程序执行的核心舞台。理解内存的物理与逻辑分区&#xff0c;是掌握程序底层行为、编写高效可靠代码的关键基石。内存并非混沌一片&#xff0c;而是被严格划分为代码区、全局区、栈区和堆区。每个区域拥有独特的生命周…

微信小程序71~80

1.总结小程序生命周期 小程序冷启动&#xff0c;钩子函数执行的顺序保留当前页面&#xff0c;进入下一个页面&#xff0c;钩子函数执行的顺序销毁当前页面&#xff0c;进入下一个页面&#xff0c;钩子函数执行的顺序小程序热启动&#xff0c;钩子函数执行的顺序 2.使用Componen…