当前位置: 首页 > news >正文

ROS2入门到精通教程(三)快速体验

1 内容概览

通过编写ros2程序,在终端输出"hello world"

!!! 安装注意点;!!!
在Ubuntu下安装ROS2之后,再安装Anaconda!!!
Anaconda的base环境下的python将被作为默认python进行调用。当用户需要运行ROS2程序的时候,这种默认设置会导致报错。
安装conda并创建conda环境之后,ros2就会使用conda环境,就会造成报错,导致运行不了ros2的程序。
解决方案,可以参见:ref如何解决ros2与其他软件冲突的问题

2 相关操作

2.1 工作空间(目录)的创建与编译

在这里插入图片描述

mkdir -p helloworld/src  #创建工作空间以及子级目录 src,工作空间名称可以自定义
cd helloworld/ #进入工作空间
colcon build #编译

上述指令执行完毕,将创建ros2_helloworld 一级目录。该目录下包含build、install、log、src共四个子级目录,除了src,其他三个是build出来的。架构如下:
在这里插入图片描述

2.2 流程简介

在这里插入图片描述

2.2.1  cpp helloworld创建流程

(ROS2的功能包主要有两种,cpp功能包和python功能包)

终端下,进入 ros2_helloworld/src 目录,使用如下指令创建一个 C++功能包:

(1): 创建helloworld功能包
# 进入到src源文件中
cd helloworld/src
ros2 pkg create pkg01_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld 

创建功能包命令解析:

ros2 pkg create pkg01_helloworld_cpp //创建一个名为 pkg01_helloworld_cpp 的功能包
–build-type ament_cmake //根据功能包的语言 指定功能包的编译类型(如果是python,则为 ament_python)
–dependencies rclcpp //添加功能包依赖的库 rclcpp (缩写:ros2 client cpp)
–node-name helloworld //设置一个 源文件/可执行程序 名字

执行完毕,在src目录下将生成一个名为pkg01_helloworld_cpp的功能包目录,且目录中已经默认生成了一些子级文件与文件夹。

(2)编辑源文件

进入pkg01_helloworld_cpp/src目录,该目录下有一helloworld.cpp文件,原有的代码如下:

#include <cstdio>int main(int argc, char ** argv)
{(void) argc;(void) argv;printf("hello world pkg01_helloworld_cpp package\n");return 0;
}

修改文件内容如下:
可以看出,ros2的helloworld程序主要使用了 rclcpp库

#include "rclcpp/rclcpp.hpp"int main(int argc, char ** argv)
{// 初始化 ROS2 客户端资源rclcpp::init(argc,argv);// 创建节点。rclcpp::Node类里面有个 make_shared 函数auto node = rclcpp::Node::make_shared("helloworld_node");//helloworld_node是节点名// 输出文本RCLCPP_INFO(node->get_logger(),"hello world!");//输出一般消息日志的函数:RCLCPP_INFO(日志对象,日志信息)// 对应init,释放ROS2 客户端资源rclcpp::shutdown();return 0;
}
(3)编辑 编译配置文件(cmake、依赖库xml)

在步骤1创建功能包时所使用的指令已经默认生成且配置了配置文件,不过实际应用中经常需要自己编辑配置文件。所以在此对相关内容做简单介绍,所使用的配置文件主要有两个,分别是功能包下的package.xml与CMakeLists.txt。

1.package.xml
文件内容如下:

下面内容重点关注这部分:

<!-- 所需要依赖 --><depend>rclcpp</depend>
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3"><name>pkg01_helloworld_cpp</name><version>0.0.0</version><description>TODO: Package description</description><maintainer email="ros2@todo.todo">ros2</maintainer><license>TODO: License declaration</license><buildtool_depend>ament_cmake</buildtool_depend><!-- 所需要依赖 --><depend>rclcpp</depend><test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend><export><build_type>ament_cmake</build_type></export>
</package>

注释部分以后需要根据实际的包依赖进行添加或修改。已经有了创建工程时的“所需要的依赖”rclcpp。工程创建完,后续再有需要依赖的库,直接在这里面修改即可。

2.CMakeLists.txt
文件内容如下:

cmake_minimum_required(VERSION 3.8)
project(pkg01_helloworld_cpp)if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic)
endif()# find dependencies
find_package(ament_cmake REQUIRED)
# 引入外部依赖包
find_package(rclcpp REQUIRED)# 1 映射源文件与可执行文件
add_executable(helloworld src/helloworld.cpp)# 2 设置目标的依赖库
ament_target_dependencies(helloworld"rclcpp"
)
# 3 定义安装规则,将生成的可执行程序 helloworld安装在 lib/${PROJECT_NAME} 目录下
install(TARGETS helloworldDESTINATION lib/${PROJECT_NAME})if(BUILD_TESTING)find_package(ament_lint_auto REQUIRED)# the following line skips the linter which checks for copyrights# comment the line when a copyright and license is added to all source filesset(ament_cmake_copyright_FOUND TRUE)# the following line skips cpplint (only works in a git repo)# comment the line when this package is in a git repo and when# a copyright and license is added to all source filesset(ament_cmake_cpplint_FOUND TRUE)ament_lint_auto_find_test_dependencies()
endif()ament_package()

可以在cmake指定的 可执行程序安装目录下 找到 helloworld

https://i-blog.csdnimg.cn/blog_migrate/97adde34f2a08cc506dc4aba0a72c9ac.png

(4) 编译

终端下进入到 工作空间 ros2_helloworld 一级目录下,执行如下指令:

colcon build

可以在cmake指定的 可执行程序安装目录下 找到 helloworld
在这里插入图片描述

(5)执行

终端下进入到工作空间,执行如下指令:
如果不刷新环境变量,会导致 run后找不到可执行的功能包。

source install/setup.bash //刷新工作空间中install/下的setup.bash, 临时环境变量
ros2 run pkg01_helloworld_cpp helloworld //执行功能包pkg01_helloworld_cpp中的 helloworld 可执行文件

程序执行,在终端下将输出文本:“hello world!”。
注意:

  • 最开始是直接使用原始创建的cpp进行编译直接输出的: “hello world pkg01_helloworld_cpp package\n”
  • 后面是修改cpp文件,调用rclcpp库函数的info函数打印的信息:[INFO][XXX_TIME][XXX_NODE]: hello world!

在这里插入图片描述
执行命令优化
终端下,执行ROS某个工作空间下的功能包程序时,都需要先调用. install/setup.bash指令配置环境。
使用不便。
优化策略是,可以将该指令的调用添加进 bashrc环境变量中,操作格式如下:

echo "source /{工作空间路径}/install/setup.bash" >> ~/.bashrc

示例:

echo "source /home/ros2/ws00_helloworld/install/setup.bash" >> ~/.bashrc

以后再启动终端时,无需手动再手动刷新环境变量,使用更方便。

2.2.2  python helloworld创建流程

(1) 创建helloworld功能包

进入helloworld/src目录,执行如下命令

ros2 pkg create pkg02_helloworld_py --build-type ament_python --dependencies rclpy --node-name helloworld_py 
(2)编辑源文件

进入pkg02_helloworld_cpp/helloworld_py目录,该目录下有一helloworld.py文件,原有的代码如下:

def main():print('Hi from pkg02_helloworld_py.')if __name__ == '__main__':main()

修改内容如下:

import rclpy
def main():#初始化ros2rclpy.init()#创建节点node = rclpy.create_node("hello_world_py_node")#输出文本node.get_logger().info("hello world!")#释放资源rclpy.shutdown()
if __name__ =="__main__":main
(3)编辑 编译配置文件(setup.py、依赖库xml)

package.xml文件内容如下:

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3"><name>pkg02_helloworld_py</name><version>0.0.0</version><description>TODO: Package description</description><maintainer email="ztfmars@163.com">fusionai</maintainer><license>TODO: License declaration</license><depend>rclpy</depend><test_depend>ament_copyright</test_depend><test_depend>ament_flake8</test_depend><test_depend>ament_pep257</test_depend><test_depend>python3-pytest</test_depend><export><build_type>ament_python</build_type></export>
</package>

setup.py内容,如下:

from setuptools import find_packages, setuppackage_name = 'pkg02_helloworld_py'setup(name=package_name,version='0.0.0',packages=find_packages(exclude=['test']),data_files=[('share/ament_index/resource_index/packages',['resource/' + package_name]),('share/' + package_name, ['package.xml']),],install_requires=['setuptools'],zip_safe=True,maintainer='fusionai',maintainer_email='ztfmars@163.com',description='TODO: Package description',license='TODO: License declaration',tests_require=['pytest'],entry_points={'console_scripts': ['helloworld_py = pkg02_helloworld_py.helloworld_py:main'],},
)
(4) 编译

终端下进入到 工作空间 ros2_helloworld 一级目录下,执行如下指令:

colcon build
(5)执行

终端下进入到工作空间,执行如下指令:

source install/setup.bash //刷新工作空间中install/下的setup.bash, 临时环境变量
ros2 run pkg02_helloworld_py helloworld //执行功能包pkg02_helloworld_py helloworld 中的 helloworld 可执行文件

在这里插入图片描述

3 集成开发环境vscode中编写helloworld功能包

(1) 插件安装
区别于记事本,vscode中编写helloworld功能包,提高代码编写效率(补齐、纠错、高亮)
注意vscode 需要 安装cmake tools, c++, python 等工作包

在这里插入图片描述
如何修复rclcpp相关include文件

  1. 鼠标放到’#include “rclcpp/rclcpp.hpp”'上,出现 quick fix,选择
  2. 添加ros2所有include路径,即 /opt/ros/humble/include/**

在这里插入图片描述

(2)vscode中创建ros2功能包

在这里插入图片描述
打开已经创建好的工作空间,打开vscode终端,从 2.2步骤开始,可以同样创建一个pkg02功能包,并编译执行。

注意:编译阶段, 进入到工作空间,执行如下指令:colcon build,会把所有的功能包再编译一遍,已经编译过的就没有必要,编译也会浪费时间。可以加参数,选择要编译的功能包 (编译多个功能包则用空格隔开)。

colcon build --packages-select pk03_hellworldvscode_py

在这里插入图片描述

(3)需要修改配置文件案例:
假如工作空间中的功能包 pkg2 的src 需要新增新增一个源码,这个源码也有对应的可执行文件,此时应该如何修改?

1、功能包新增源码

在这里插入图片描述
2、修改cmake

在这里插入图片描述
3、重新编译功能包,并单独执行新增的源文件

在这里插入图片描述

Reference

ROS2快速使用博客
ROS2理论与实践 1-3章
ROS2理论与实践第4-6章
ROS2理论与实践第8-9章
如何解决ros2与其他软件冲突的问题 | 【已解决】conda环境下ROS2 colcon build编译选择特定python解释器

http://www.lryc.cn/news/601145.html

相关文章:

  • Linux vimgrep 详解
  • VGG 改进:融合CNN与Transformer的VGG模型
  • vmware虚拟机中显示“网络电缆被拔出“的解决方法
  • 【面板数据】中国A股上市公司制造业智能制造数据集(1992-2024年)
  • 从稀疏数据(CSV)创建非常大的 GeoTIFF(和 WMS)
  • 【温度传感器】热电偶、热敏电阻、热电阻、热成像仪原理及精度解析
  • 立式加工中心X-Y轴传动机械结构设“cad【6张】三维图+设计说明书
  • Day32| 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
  • 基于springboot的在线数码商城/在线电子产品商品销售系统的设计与实现
  • 06-ES6
  • Effective C++ 条款04:确定对象被使用前已先被初始化
  • 【C++】定义常量
  • HTTPS的基本理解以及加密流程
  • 基于图神经网络的星间路由与计算卸载强化学习算法设计与实现
  • C++___快速入门(上)
  • 人形机器人_双足行走动力学:弹性势能存储和步态能量回收
  • LeetCode|Day26|191. 位 1 的个数|Python刷题笔记
  • hot100-每日温度
  • MyBatis-Plus 通用 Service
  • 睡眠函数 Sleep() C语言
  • 缓存一致性:从单核到异构多核的演进之路
  • [RPA] 日期时间练习案例
  • 免费 PDF 转 Word 工具:无水印 / 支持批量转换,本地运行更安全【附工具下载】
  • Python day25
  • 数字化转型 - 企业数字化建设的几点思考
  • Redis的下载和安装(Linux)
  • 学习随笔录
  • SSH连接失败排查与解决教程: Connection refused
  • 不正确的 clone() 方法实现与修复方案
  • java--JDBC