【ROS2】MOMO的鱼香ROS2(三)ROS2入门篇——ROS2第一个节点

news2024/11/28 16:00:19

ROS2第一个节点

  • 引言
  • 1 认识ROS2节点
    • 1.1 节点之间的交互
    • 1.2 节点的命令行指令
    • 1.3 工作空间
    • 1.4 功能包
      • 1.4.1 功能包获取安装
      • 1.4.2 功能包相关的指令 ros2 pkg
  • 2 ROS2构建工具—Colcon
    • 2.1 安装Colcon
    • 2.2 测试编译
    • 2.3 Colcon其他指令
  • 3 使用RCLPY编写节点
    • 3.1 创建Python功能包
    • 3.2 编写程序
    • 3.3 编译运行节点

引言

笔者跟着鱼香ROS的ROS2学习之旅
学习参考:
【ROS2机器人入门到实战】
笔者的学习目录

  1. MOMO的鱼香ROS2(一)ROS2入门篇——从Ubuntu操作系统开启
  2. 【ROS2】MOMO的鱼香ROS2(二)ROS2入门篇——ROS2初体验

专业术语认识

  1. 面向过程编程思想。缩写:POP
  2. 面向对象编程思想。缩写:OOP
    对象 = 属性+行为
  3. 函数式思想。缩写:FP

1 认识ROS2节点

1.1 节点之间的交互

ROS2中每一个节点也是只负责一个单独的模块化的功能,(比如一个节点负责控制车轮转动,一个节点负责从激光雷达获取数据、一个节点负责处理激光雷达的数据、一个节点负责定位等等)
那节点与节点之间的通信一共四种通信方式:

  1. 话题-topics
  2. 服务-services
  3. 动作-Action
  4. 参数-parameters

在这里插入图片描述

1.2 节点的命令行指令

运行节点指令:ros2 run 包名字 可执行文件名字

ros2 run <package_name> <executable_name>

查看节点列表

ros2 node list

查看节点信息

ros2 node info <node_name>

其他指令

# 重映射节点名称
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
# 运行节点时设置参数
ros2 run example_parameters_rclcpp parameters_basic --ros-args -p rcl_log_level:=10

1.3 工作空间

创建工作空间(其实就是创建一个目录)

mkdir -p name_ws/src

1.4 功能包

功能包可以理解为存放节点的地方,ROS2中功能包根据编译方式的不同分为三种类型。

ament_python,适用于python程序
cmake,适用于C++
ament_cmake,适用于C++程序,是cmake的增强版

1.4.1 功能包获取安装

sudo apt install ros-<version>-package_name

1.4.2 功能包相关的指令 ros2 pkg

1.创建功能包

ros2 pkg create <package-name>  --build-type  {cmake,ament_cmake,ament_python}  --dependencies <依赖名字>

2.列出可执行文件

ros2 pkg executables

3.列出所有的包

ros2 pkg list

4.输出某个包所在路径的前缀

ros2 pkg prefix  <package-name>

5.查看功能包的信息。

ros2 pkg xml  <package-name>

2 ROS2构建工具—Colcon

对创建的ROS2工作空间进行编译,colcon想当于ros1中的catkin工具。

2.1 安装Colcon

sudo apt-get install python3-colcon-common-extensions

打开终端输入colcon即可看到其使用方法

2.2 测试编译

  1. 创建一个工作文件夹
mkdir -p ROS_WS/colcon_ws/src
cd ROS_WS/colcon_ws/src
# -b eloquent克隆的分支为eloquent
git clone https://github.com/ros2/examples -b eloquent  
  1. 编译
colcon build
# 指定包编译
colcon build --packages-select [YOUR_PKG_NAME]

允许通过更改src下的部分文件来改变install(重要),每次调整 python 脚本时都不必重新build了

colcon build --symlink-install

运行编译的包的测试

colcon test
  1. 配置资源
source install/setup.bash

2.3 Colcon其他指令

  1. 构建指令
    –packages-select ,仅生成单个包(或选定的包)。
    –packages-up-to,构建选定的包,包括其依赖项。
    –packages-above,整个工作区,然后对其中一个包进行了更改。此指令将重构此包以及(递归地)依赖于此包的所有包。
    指定构建后安装的目录可以通过 --build-base参数和–install-base,指定构建目录和安装目录。

  2. 合并构建目录
    –merge-install,使用作为所有软件包的安装前缀,而不是安装基中的软件包特定子目录。
    –install-base 如果没有此选项,每个包都将提供自己的环境变量路径,从而导致非常长的环境变量值。使用此选项时,添加到环境变量的大多数路径将相同,从而导致环境变量值更短。

  3. 符号链接安装
    启用–symlink-install后将不会把文拷贝到install目录,而是通过创建符号链接的方式。

  4. 错误时继续安装
    启用–continue-on-error,当发生错误的时候继续进行编译。

  5. CMake参数
    –cmake-args,将任意参数传递给CMake。与其他选项匹配的参数必须以空格为前缀。

  6. 控制构建线程
    –executor EXECUTOR,用于处理所有作业的执行程序。默认值是根据所有可用执行程序扩展的优先级选择的。要查看完整列表,请调用 colcon extensions colcon_core.executor --verbose。
    sequential [colcon-core] 一次处理一个包。
    parallel [colcon-parallel-executor] 处理多个作业平行.
    –parallel-workers NUMBER 要并行处理的最大作业数。默认值为 os.cpu_count() 给出的逻辑 CPU内核数。

  7. 开启构建日志 使用–log-level可以设置日志级别,比如–log-level info。

3 使用RCLPY编写节点

3.1 创建Python功能包

cd ROS_WS/colcon_ws/src
ros2 pkg create imu_py  --build-type ament_python --dependencies rclpy

具体解释如下:
ros2 pkg create imu_py: 创建 ROS 2 包的命令,包的名称为 “imu_py”。
–build-type ament_python: 指定使用 Ament 构建系统,并选择 Python 作为开发语言。
–dependencies rclpy: 指定该包的依赖项,即 “rclpy”,这是 ROS 2 的 Python 客户端库。

3.2 编写程序

  1. 导入库文件
  2. 初始化客户端库
  3. 新建节点
  4. spin循环节点
  5. 关闭客户端库

在imu_py/imu_py下创建node_imu.py,开始编写代码。
插上usb接口的IMU硬件!!!

# -*- coding: utf-8 -*-
"""
Created on 2023/12/6 下午4:46
@author: alian
1.查看映射端口
ls /dev/ttyUSB*
2.更改端口的权限
sudo chmod 777 /dev/ttyUSB0
3.可视化
ros2 run rviz2 rviz2
4. ROS2重要指令
colcon build --packages-select imu_py  # 编译
source install/setup.bash
ros2 run imu_py node_imu # 运行节点
"""
import rclpy
from rclpy.node import Node
# 话题接口
from sensor_msgs.msg import Imu  # imu接口
from sensor_msgs.msg import LaserScan # 激光雷达接口
from sensor_msgs.msg import Image  # 相机接口
# Usart Library
import serial
import struct
import binascii

# imu接收数据类型
class Node_imu(Node):
    send_data = []

    def __init__(self,name):
        super().__init__(name)  # 继承父类,初始化名称
        self.get_logger().info("发布节点:%s"%name)
        self.publisher_ = self.create_publisher(Imu, 'imu_data', 1)  # 创建发布imu数据的发布者到话题:imu_data上

        # 串口初始化
        self.IMU_Usart = serial.Serial(
            port='/dev/ttyUSB0',  # 串口
            baudrate=115200,  # 波特率
            timeout=0.001  # 由于后续使用read_all按照一个timeout周期时间读取数据
            # imu在波特率115200返回数据时间大概是1ms,9600下大概是10ms
            # 所以读取时间设置0.001s
        )
        # 判断串口是否打开成功
        if self.IMU_Usart.isOpen():
            print("open success")
        else:
            print("open failed")

def main(args=None):
    """
    ros2运行该节点的入口函数
    编写ROS2节点的一般步骤
    1. 导入库文件
    2. 初始化客户端库
    3. 新建节点对象
    4. spin循环节点
    5. 关闭客户端库
    """
    rclpy.init(args=args)  # 初始化rclpy
    node = Node_imu("imu_publisher")  # 新建一个节点
    node.get_logger().info("大家好,我是node_imu.")
    rclpy.spin(node)  # 保持节点运行,检测是否收到退出指令(Ctrl+C)
    rclpy.shutdown()  # 关闭rclpy

代码编写完成用Crtl+S进行保存。接着修改setup.py。

from setuptools import setup

package_name = 'imu_py'

setup(
    name=package_name,
    version='0.0.0',
    packages=[package_name],
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='ll',
    maintainer_email='ll@todo.todo',
    description='TODO: Package description',
    license='TODO: License declaration',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
            "node_imu=imu_py.node_imu:main",  # 在这里修改!!!!!!
            # "node_imu=imu_py.node_imu:main"  # 可以发布多个节点
        ],
    },
)

“node_imu=imu_py.node_imu:main”,解释如下:

node_imu:节点名称
imu_py.node_imu:main:【软件包】.【执行文件.py】:【执行函数mian】

setup.py这段配置是声明一个ROS2的节点,声明后使用colcon build才能检测到,从而将其添加到install目录下。

3.3 编译运行节点

# 回到工作空间
cd ROS_WS/colcon_ws/src
colcon build --packages-select  imu_py
source install/setup.bash

在这里插入图片描述
运行的软件包和节点名可以通过查看软件包的setup.py

ros2 run imu_py node_imu

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

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

相关文章

2024新版塔罗占卜网站源码风水起名附带搭建视频及文本教程

附带文本教学及视频教程安装方法以linux为例&#xff1a; 1、建议在服务器上面安装宝塔面板&#xff0c;以便操作&#xff0c;高逼格技术员可以忽略这步操作。 2、把安装包文件解压到根目录&#xff0c;同时建立数据库&#xff0c;把数据文件导入数据库 3、修改核心文件conf…

力扣-206. 反转链表

文章目录 力扣题目代码 力扣题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#x…

【形式语言与自动机/编译原理】CFG-->Greibach-->NPDA(2)

本文将详细讲解《形式语言与自动机》&#xff08;研究生课程&#xff09;或《编译原理》&#xff08;本科生课程&#xff09;中的上下文无关文法&#xff08;CFG&#xff09;转换成Greibach范式&#xff0c;再转成下推自动机&#xff08;NPDA&#xff09;识别语言是否可以被接受…

【大数据Hive】hive 运算符使用详解

目录 一、前言 二、hive 运算符分类 三、hive 运算符操作演示 3.1 数据准备 创建表dual 加载一个文件dual.txt到dual表中 模拟测试 3.2 关系运算符 is null空值判断 is not null 非空值判断 like使用 3.3 算术运算符 取整操作 取余操作: % 位与操作: & …

Airtest的iOS实用接口介绍

前段时间Airtest更新了1.3.0.1版本&#xff0c;里面涉及非常多的iOS功能新增和改动&#xff0c;今天想详细跟大家聊一下里面的iOS设备接口。 PS&#xff1a;本文示例均使用本地连接的iOS设备&#xff0c;Airtest版本为1.3.0.1 。 安装接口&#xff1a;install、install_app …

互联网大厂面试题目

阿里篇 1.1.1 如何实现一个高效的单向链表逆序输出&#xff1f; 1.1.2 已知sqrt(2)约等于1.414&#xff0c;要求不用数学库&#xff0c;求sqrt(2)精确到小数点后10位 1.1.3 给定一个二叉搜索树(BST)&#xff0c;找到树中第 K 小的节点 1.1.4 LRU缓存机制 1.1.5 关于epoll和…

UG装配-接触对齐

UG装配约束命令在如下位置 首选接触&#xff1a;含接触和对齐&#xff0c;自动判断两种类型 接触&#xff1a;约束对象使其曲面法向在相反方向&#xff0c;并共面或共线 对齐&#xff1a;约束对象使其曲面法向在同一方向&#xff0c;并共面或共线 自动判断中心/轴&#xff1…

innovus:refresh CTS

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 调试CTS spec过程中&#xff0c;如果对CTS结果不满意&#xff0c;需要重新做CTS&#xff0c;有没有办法不退出工具&#xff0c;不用重新启动placemen database重新做CTS吗&…

爬取豆瓣电影评论内容、星级、评论时间、支持人数

大家好&#xff0c;我是带我去滑雪&#xff0c;每天教你一个小技巧&#xff01; 本期爬取豆瓣电影评论人、评论时间、星级、支持人数、评论内容。话不多说&#xff0c;直接上代码&#xff1a; import requests from bs4 import BeautifulSoup import pandas as pd import time…

Node.js+Express+Mysql 极简代码实现对数据库增删改查的Restful API服务

确保已安装node 创建项目文件夹&#xff0c;并初始化 npm init -y 安装express ​npm install express 安装mysql npm install mysql 安装body-parser npm install body-parser 新建db/mysql.js const mysql require(mysql);let db mysql.createConnection({host: …

如何解决企业内部FTP文件传输速度过慢和安全问题

在数据化时代里&#xff0c;企业内部的文件传输永远是刚需&#xff0c;而因为 FTP协议的简单、易用、广泛支持等优点&#xff0c;让很多企业早期都普遍使用&#xff0c;随着数量量的增多&#xff0c;和对安全的要求越来越高&#xff0c;FTP也暴露出了一些列问题&#xff0c;小编…

软件测试/测试开发丨Linux 三剑客与管道使用

1、 程序运行环境输入与输出 标准输入 0 read a;echo $a标准输出 1 echo ceshiren.com错误输出 ls not_exist_dir 2、 管道重定向 管道与管道之间可以重定向管道与文件之间可以重定向 echo 11 > /tmp/1 read var </tmp/1错误输出&#xff1a; ls not_exist_dir > /…

【华为机试】2023年真题B卷(python)-喊七的次数重排

一、题目 题目描述&#xff1a; 喊7是一个传统的聚会游戏&#xff0c;N个人围成一圈&#xff0c;按顺时针从1到N编号。 编号为1的人从1开始喊数&#xff0c;下一个人喊的数字为上一个人的数字加1&#xff0c;但是当将要喊出来的数字是7的倍数或者数字本身含有7的话&#xff0c;…

第一节 初始化项目

系列文章目录 第一节 初始化项目 文章目录 操作步骤 总结 操作步骤 打开cmd 输入 vue ui 在打开的网页中点击“创建”&#xff0c;复制文件夹路径并粘贴点击“在此创建新项目” 输入项目名称 点击下一步选择手动配置 选择babel、router、vuex、css pre-processors、 linter建…

Pearson correlation coefficient (Pearson’s r) 皮尔森相关系数

此图用的是箱状图&#xff0c;的纵轴是“Pearson’s r”&#xff0c;是实际观测值与机器学习模型预测值之间的相关性 Pearsons f得分&#xff0c;它是一个统计量&#xff0c;用来衡量两个变量之间线性相关性的强度。这个得分可能是用来衡量实际观测值与机器学习模型预测值之间的…

Pycharm 切换interpreter---python的环境和第三方库问题

这篇回答两个问题&#xff1a; 1.为什么在 pycharm中打开新的project&#xff0c;切换interpreter 之后发现自己之前装的库消失了&#xff1f; 2.为什么 interpreter 切换到python3.8了&#xff0c; terminal 还是在 3.9&#xff1f;&#xff1f; 问题的关键&#xff1a;搞懂什…

自定义富集分析结果的term顺序

大家好&#xff0c;元旦过得还好吗&#xff1f;之前我们聊过如果富集分析结果不理想&#xff0c;如何选择富集分析的terms&#xff0c;如果不记得&#xff0c;可以看看这三个推文和视频。 ​富集分析结果不理想&#xff1a;如何从上千个term中找到自己想要所有term&#xff1f;…

AD教程 (二十一)模块化布局规划

AD教程 &#xff08;二十一&#xff09;模块化布局规划 原理图是按照我们的功能模块去进行排布划分的 利用交叉选择模式分屏快速进行模块化布局 分屏&#xff0c;选中任意文档&#xff0c;右击&#xff0c;点击垂直分割 交叉选择模式&#xff0c;点击工具&#xff0c;交叉选…

C++/CLI——2类和对象生存期

C/CLI——2函数与类的使用方法 函数使用 定义函数和使用函数基本与C#相同&#xff0c;只不过C/CLI可以像标准C一样&#xff0c;可以先声明函数原型&#xff0c;再定义函数主体。值得注意的是&#xff0c;如果有默认参数&#xff0c;只能在函数原型中定义&#xff0c;不能在函…

SpringBoot 请求参数

文章目录 一、简单参数实体参数数组集合参数日期参数Json参数路径参数 一、简单参数 原始方式 在原始的web程序中&#xff0c;获取请求参数&#xff0c;需要通过HttpServletRequest 对象手动获取。 SpringBoot方式 1.参数名与形参变量名相同&#xff0c;定义形参即可接收参数。…