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

2024-01-01 13:36

本文主要是介绍【ROS2】MOMO的鱼香ROS2(三)ROS2入门篇——ROS2第一个节点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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入门篇——从Ubuntu操作系统开启

专业术语认识

  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)  # 初始化rclpynode = 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 setuppackage_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

这篇关于【ROS2】MOMO的鱼香ROS2(三)ROS2入门篇——ROS2第一个节点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/559406

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

Spring Boot 入门篇

一、简介 Spring Boot是一款开源的Java Web应用框架,旨在简化Spring应用的初始搭建以及开发过程。它整合了Spring技术栈中的诸多关键组件,为开发者提供了一种快速、简便的Spring应用开发方式。Spring Boot遵循“约定优于配置”的原则,通过自动配置、起步依赖和内置的Servlet容器,极大地简化了传统Spring应用的配置和部署过程。 二、Spring Boot

Spring Roo 实站( 一 )部署安装 第一个示例程序

转自:http://blog.csdn.net/jun55xiu/article/details/9380213 一:安装 注:可以参与官网spring-roo: static.springsource.org/spring-roo/reference/html/intro.html#intro-exploring-sampleROO_OPTS http://stati

JS和jQuery获取节点的兄弟,父级,子级元素

原文转自http://blog.csdn.net/duanshuyong/article/details/7562423 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。 JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素。 <div id="test"><div></div><div></div

(入门篇)JavaScript 网页设计案例浅析-简单的交互式图片轮播

网页设计已经成为了每个前端开发者的必备技能,而 JavaScript 作为前端三大基础之一,更是为网页赋予了互动性和动态效果。本篇文章将通过一个简单的 JavaScript 案例,带你了解网页设计中的一些常见技巧和技术原理。今天就说一说一个常见的图片轮播效果。相信大家在各类电商网站、个人博客或者展示页面中,都看到过这种轮播图。它的核心功能是展示多张图片,并且用户可以通过点击按钮,左右切换图片。

第49课 Scratch入门篇:骇客任务背景特效

骇客任务背景特效 故事背景:   骇客帝国特色背景在黑色中慢慢滚动着! 程序原理:  1 、 角色的设计技巧  2 、克隆体的应用及特效的使用 开始编程   1、使用 黑色的背景: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7d74c872f06b4d9fbc88aecee634b074.png#pic_center)   2