ROS2快速入门Python篇-版本梳理、环境搭建、源码架构介绍

1. ROS2版本说明及资料获取

1.1 ROS2版本更新记录

https://docs.ros.org/en/foxy/Releases.html
在这里插入图片描述

ROS1版本更新记录
https://wiki.ros.org/Distributions
在这里插入图片描述

1.2 ROS1/ROS2各版本资料位置

https://docs.ros.org/en/?C=M;O=D
在这里插入图片描述

本系列将使用humble来讲解Ros2的使用。

2. humble安装

两种方式: Binary安装和源码安装

2.1 使用Binary方式安装与测试

binary安装支持Ubuntu Linux Jammy (Ubuntu 22.04) 64-bit x86 and 64-bit ARM,所以如果你装的是Ubuntu22.04, 可以直接使用这种方式安装或者使用源码安装。

We currently support Ubuntu Linux Jammy (22.04) 64-bit x86 and 64-bit ARM.

安装与测试步骤参考:

https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html

2.2 使用源码方式安装与测试

如果是其他Linux系统,如树莓派4(Raspi OS基于Debian Bullseye),可以选择源码安装方式。

The current Debian-based target platforms for Humble Hawksbill are:
. Tier 1: Ubuntu Linux - Jammy (22.04) 64-bit
. Tier 3: Ubuntu Linux -Focal (20.04) 64-bit
. Tier 3: Debian Linux - Bullseye (11) 64-bit

Other Linux platforms with varying support levels include:
. Arch Linux, see alternate instructions
. Fedora Linux, see alternate instructions
. OpenEmbedded / webOS OSE, see alternate instructions

安装步骤参考:

https://docs.ros.org/en/humble/Installation/Alternatives/Ubuntu-Development-Setup.html

Ubuntu22.04源码安装步骤:

2.2.1 源码下载

#https://docs.ros.org/en/humble/Installation/Alternatives/Ubuntu-Development-Setup.html
#suit for ubuntu22.04

sudo apt install software-properties-common
sudo add-apt-repository universe

sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

sudo apt update && sudo apt install -y \
  python3-flake8-docstrings \
  python3-pip \
  python3-pytest-cov \
  ros-dev-tools
  
sudo apt install -y \
   python3-flake8-blind-except \
   python3-flake8-builtins \
   python3-flake8-class-newline \
   python3-flake8-comprehensions \
   python3-flake8-deprecated \
   python3-flake8-import-order \
   python3-flake8-quotes \
   python3-pytest-repeat \
   python3-pytest-rerunfailures
 
 sudo apt install python3-colcon-common-extensions
 
#download git listed in ros2.repos (https://github.com/ros2/ros2.git)
#code size 561M
mkdir -p ./ros2_humble/src
cd ros2_humble
vcs import --input https://raw.githubusercontent.com/ros2/ros2/humble/ros2.repos src

国内网络访问raw.githubusercontent.com出现Connection refused问题处理
如果遇到这样的错误

$ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
curl: (7) Failed to connect to raw.githubusercontent.com port 443 after 70 ms: Connection refused

在网站https://sites.ipaddress.com/查询raw.githubusercontent.com的ip地址
在这里插入图片描述
添加到/etc/hosts文件中
在这里插入图片描述

2.2.2 源码编译

sudo apt upgrade
sudo rosdep init
rosdep update
rosdep install --from-paths src --ignore-src -y --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers"

cd ros2_humble/
colcon build --symlink-install

sudo rosdep init遇到cannot download default sources list from问题

$ sudo rosdep init ERROR: cannot download default sources list from:
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
Website may be down.

重试几次可成功,原因未知,可能是单纯的网络问题。

$ sudo rosdep init Wrote
/etc/ros/rosdep/sources.list.d/20-default.list Recommended: please run

rosdep update

2.2.3 运行测试

初始化运行环境
echo "source <workspace path>/ros2_humble/install/local_setup.bash" >> ~/.bashrc

新终端运行talker示例程序

ros2 run demo_nodes_cpp talker

新终端运行listener示例程序

ros2 run demo_nodes_py listener

结果如图所示
在这里插入图片描述

在这里插入图片描述

rosrun和ros2 run区别
rosrun和ros2 run都是用于在ROS环境中运行节点的命令行工具,但它们分别适用于不同版本的ROS。

rosrun:
rosrun命令是用于在ROS1中运行节点的工具。它允许你直接指定要运行的ROS软件包中的节点,而不需要提前source或者setup.bash ROS环境。它的使用方式是:
rosrun package_name node_name
其中,package_name是要运行节点所属的ROS软件包的名称,node_name是要运行的节点的名称。

ros2 run:
ros2 run命令是用于在ROS 2中运行节点的工具。它的功能类似于rosrun,但是针对ROS2环境。它允许你直接指定要运行的ROS软件包中的节点,而不需要提前source或者setup.bash ROS环境。它的使用方式也是类似的:

ros2 run package_name node_name
其中,package_name是要运行节点所属的ROS软件包的名称,node_name是要运行的节点的名称。

3. ROS架构体系

3.1 主要模块及其功能的概述

模块功能
rclcpp这是 ROS 2 的 C++ 客户端库。它提供了一个面向对象的接口,用于创建节点、发布和订阅主题、调用服务等。rclcpp 提供了一个类似于 ROS 1 的 roscpp 的接口,但是专门为 ROS 2 的分布式架构设计。
rclpy与 rclcpp 类似,rclpy 是 ROS 2 的 Python 客户端库。它允许开发者使用 Python 来编写 ROS 2 节点,并与 ROS 2 系统进行交互。
rosidl这个模块用于 ROS 2 中的消息和服务接口定义语言 (IDL)。它允许定义 ROS 2 中使用的消息和服务的结构,并生成用于序列化和反序列化这些消息的代码
rclROS 2 的核心 C 语言实现。rcl 提供了一个低级别的 ROS 2 客户端库,用于与 ROS 2 的中间件通信。
rmwROS Middleware Interface (RMW) 是 ROS 2 与不同通信中间件之间的接口。ROS 2 支持多种不同的中间件,如 FastRTPS、Cyclone DDS 等,而 RMW 模块允许 ROS 2 与这些不同的中间件进行通信
ros2cliROS 2 命令行工具的集合。这些工具用于管理 ROS 2 节点、主题、服务等,以及执行其他与 ROS 2 相关的任务。
ros2 launch这是 ROS 2 中用于启动多个节点的工具。它允许用户使用 XML 或 Python 文件来描述节点的启动配置,并按照指定的配置启动这些节点。

3.2 ros-core, ros-base,ros_desktop差异

安装ROS的时候,总会有不同的安装选项,如ros-core, ros-base,ros_desktop,区别只是不同选项所包含组件有的多,有的少些而已。

ros_core:ros_core是ROS的核心组件,它包含了ROS的基本功能和工具,例如ROS Master、rosout日志记录节点等。ros_core只包含最基本的ROS功能,适用于用户想要自定义自己的ROS环境的情况。

ros_base:ros_base是一个比ros_core更大的安装选项,它包含了ros_core中的所有内容,同时还包含了一些额外的ROS软件包,如常用的ROS库、工具和一些常用的传感器和执行器的驱动程序。ros_base提供了一个较为完整的ROS环境,适用于大多数ROS应用。

ros_desktop:ros_desktop是ROS安装的最完整的选项,它包含了ros_base中的所有内容,以及一些针对桌面用户的可视化工具和库,如rviz(ROS的三维可视化工具)、rqt(ROS的可视化工具集)等。ros_desktop适用于需要使用ROS进行开发和调试的桌面用户。

因此,这三个选项之间的关系是:ros_desktop包含了ros_base,ros_base包含了ros_core。用户可以根据其需求选择合适的安装选项。

具体差异可见:https://www.ros.org/reps/rep-2001.html#id23
同样以humble版本为例
在这里插入图片描述
在这里插入图片描述

3.3 DDS介绍

DDS 指的是 Data Distribution Service(数据分发服务),是一种用于实时系统之间通信和数据共享的开放标准。在 ROS 2 中,DDS 用作 ROS 2 的通信中间件,用于在不同的 ROS 2 节点之间传输消息。

ROS 2 中的 DDS 实现充当了 ROS 2 架构的基础,负责节点之间的通信。ROS 2 支持多种 DDS 实现,例如 Fast DDS、Cyclone DDS 等。这些实现都遵循 DDS 标准,并提供了在 ROS 2 中使用 DDS 进行通信所需的接口和功能。

DDS 提供了一种灵活而强大的消息传输机制,具有高度的可靠性和实时性。它允许开发者根据系统的需求配置通信参数,并支持多种通信模式,包括发布-订阅、请求-响应等。这使得 DDS 成为构建实时分布式系统的理想选择,也成为了 ROS 2 作为机器人操作系统的核心通信技术。

DDS(Data Distribution Service)是一种用于实时系统之间通信和数据共享的开放标准。DDS 标准由 Object Management Group(OMG)制定和维护,是一种针对实时和嵌入式系统的数据通信协议。以下是 DDS 标准的主要特点和组成部分:

  1. 发布-订阅模型(Publish-Subscribe Paradigm):DDS 使用发布-订阅模型,允许数据的发布者(Publishers)向感兴趣的订阅者(Subscribers)广播数据。这种模型允许松散的耦合和异步通信,使得系统更加灵活和可扩展。

  2. 数据中心(Data-Centric):DDS 是一种数据中心的通信协议,强调数据的传输和共享。数据被视为中心,而不是消息传输机制。这种方法允许系统中的各个部分直接共享数据,而不需要显式的点对点通信。

  3. 实时性(Real-Time Capabilities):DDS 具有很好的实时性能,能够满足实时系统的要求。DDS 的实现通常提供了可配置的 QoS(Quality of Service)参数,允许开发者根据系统的需求调整通信的实时性、可靠性和带宽利用率等方面的参数。

  4. 自动发现和路由(Automatic Discovery and Routing):DDS 允许系统中的节点自动发现彼此,并建立通信连接。DDS 还支持动态的路由机制,允许在系统运行时动态地调整通信路径。

  5. 安全性(Security):DDS 提供了安全性的支持,包括身份验证、访问控制、加密等功能,以确保通信数据的机密性和完整性。

  6. 平台无关性(Platform-Independence):DDS 是一种平台无关的通信协议,可以在各种不同的操作系统和硬件平台上使用。

DDS 标准的实现通常由各个厂商提供,包括开源实现和商业实现。在实时系统、嵌入式系统、大规模分布式系统等领域,DDS
在提供高效、可靠的数据通信方面发挥着重要作用。

  • 30
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一些关于使用Python编写ROS2激光SLAM的基本步骤和流程。 首先,您需要安装ROS2和Python3。确保您的系统已正确配置ROS2环境变量。接下来,您需要安装与激光SLAM相关的ROS2软件包,例如`cartographer_ros`或`slam_toolbox`。 在Python脚本中,您需要编写ROS2节点以订阅激光传感器数据,并使用激光SLAM算法处理数据以生成地图。您可以使用`rclpy`库来编写ROS2节点。 以下是一个简单的示例Python脚本,用于订阅激光传感器数据并使用`cartographer_ros`软件包进行SLAM: ```python import rclpy from rclpy.node import Node from sensor_msgs.msg import LaserScan from cartographer_ros_msgs.msg import TrajectoryOptions from cartographer_ros import cartographer_node class SLAMNode(Node): def __init__(self): super().__init__('slam_node') self.create_subscription(LaserScan, 'scan', self.scan_callback, 10) self.options = TrajectoryOptions() self.options.tracking_frame = 'base_link' self.options.published_frame = 'map' self.options.odometry_frame = 'odom' self.options.provide_odom_frame = True self.options.use_odometry = False self.options.num_laser_scans = 1 self.options.num_multi_echo_laser_scans = 0 self.options.num_subdivisions_per_laser_scan = 1 self.options.num_point_clouds = 0 self.options.rangefinder_sampling_ratio = 1. self.options.odometry_sampling_ratio = 1. self.options.fixed_frame_pose_sampling_ratio = 1. self.options.imu_sampling_ratio = 1. cartographer_node.main(args=[ '--ros-args', '--params-file', '/opt/ros/foxy/share/cartographer_ros/configuration_files/backpack_2d.lua', '--params-file', '/opt/ros/foxy/share/cartographer_ros/configuration_files/turtlebot.lua', '--params-file', '/opt/ros/foxy/share/cartographer_ros/configuration_files/turtlebot_vlp_16.lua', '--trajectory_builder=trajectory_builder_2d', '--use_laser_scan', '--num_laser_scans=1', '--num_subdivisions_per_laser_scan=1', '--tracking_frame=base_link', '--published_frame=map', '--odom_frame=odom', '--provide_odom_frame', '--use_odometry=false', '--use_nav_sat=false', '--use_landmarks=false', '--num_point_clouds=0', '--rangefinder_sampling_ratio=1.0', '--odometry_sampling_ratio=1.0', '--fixed_frame_pose_sampling_ratio=1.0', '--imu_sampling_ratio=1.0' ]) def scan_callback(self, msg): # Process laser scan data here pass def main(args=None): rclpy.init(args=args) node = SLAMNode() rclpy.spin(node) rclpy.shutdown() if __name__ == '__main__': main() ``` 请注意,在此示例中,我们使用了`cartographer_node`来启动`cartographer_ros`软件包,并提供了一些参数来配置SLAM算法。 当您运行此脚本时,它将订阅名为`scan`的激光传感器数据,并使用`cartographer_ros`软件包进行SLAM。您可以在`scan_callback`函数中添加代码来处理激光数据并生成地图。 希望这可以帮助您入门ROS2激光SLAM的Python编程!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值