ROS2代码阅读笔记5-ROS2小车巡逻功能

ROS机器人操作系统入门:从核心概念到实战应用全解析 机器人操作系统(ROS)作为机器人开发领域的核心框架,本质上是一种分布式计算的“元操作系统”或“超级中间件”。其核心原理基于节点(Node)的松耦合通信模型,通过话题(Topic)和服务(Service)两种机制实现模块间的数据交换与协同,从而将复杂的机器人系统解耦为可独立开发、测试与复用的功能模块。这一设计带来了巨大的技术价值:它标准化了机器人软件开发的接口与流程,使得开发者能够专注于算法与业务逻辑创新,而非陷入底层通信、驱动兼容等重复性工作中,极大地提升了开发效率与代码复用率。在应用场景上,ROS广泛应 阅读详情

#for patrol
#math
import math
from math import radians, copysign, sqrt, pow
from math import pi
import numpy as np
#rclpy
import rclpy
from rclpy.node import Node
#tf
from tf2_ros import TransformException
from tf2_ros.buffer import Buffer
from tf2_ros.transform_listener import TransformListener
from tf2_ros import LookupException, ConnectivityException, ExtrapolationException
#msg
from geometry_msgs.msg import Twist, Point,Quaternion
from sensor_msgs.msg import LaserScan
from std_msgs.msg import Bool
#others
import PyKDL
from time import sleep

print("import finish")

RAD2DEG = 180 / math.pi

class YahboomCarPatrol(Node):
    def __init__(self,name):
        super().__init__(name)
        self.moving = True
        self.Joy_active = False
        self.command_src = "finish"
        self.warning = 1
        self.SetLoop = False
        self.Linear = 0.5
        self.Angular = 1.0
        self.Length = 1.0 #1.0
        self.Angle = 360.0
        self.LineScaling = 1.1
        self.RotationScaling = 1.0
        self.LineTolerance = 0.1
        self.RotationTolerance = 0.3
        #self.ResponseDist = 0.6
        #self.LaserAngle = 20
        self.warning = 1
        #self.Command = "LengthTest"
        #self.Switch = False
        self.position = Point()
        self.x_start = self.position.x
        self.y_start = self.position.y
        self.error = 0.0
        self.distance = 0.0 
        self.last_angle = 0.0 
        self.delta_angle = 0.0
        self.turn_angle = 0.0
        #create publisher
        self.pub_cmdVel = self.create_publisher(Twist,"/cmd_vel",5)
        #create subscriber
        self.sub_scan = self.create_subscription(LaserScan,"/scan",self.LaserScanCallback,1)
        self.sub_joy = self.create_subscription(Bool,"/JoyState",self.JoyStateCallback,1)
        #create TF
        self.tf_buffer = Buffer()
        self.tf_listener = TransformListener(self.tf_buffer,self)
        #declare param
        self.declare_parameter('odom_frame',"odom")
        self.odom_frame = self.get_parameter('odom_frame').get_parameter_value().string_value
        self.declare_parameter('base_frame',"base_footprint")
        self.base_frame = self.get_parameter('base_frame').get_parameter_value().string_value
        self.declare_parameter("circle_adjust",2.0)
        self.circle_adjust = self.get_parameter("circle_adjust").get_parameter_value().double_value
        self.declare_parameter('Switch',False)
        self.Switch = self.get_parameter('Switch').get_parameter_value().bool_value
        self.declare_parameter('Command',"Square")
        self.Command = self.get_parameter('Command').get_parameter_value().string_value
        self.declare_parameter('Set_loop',False)
        self.Set_loop = self.get_parameter('Set_loop').get_parameter_value().bool_value
        self.declare_parameter('ResponseDist',0.6)
        self.ResponseDist = self.get_parameter('ResponseDist').get_parameter_value().double_value
        self.declare_parameter('LaserAngle',20.0)
        self.LaserAngle = self.get_parameter('LaserAngle').get_parameter_value().double_value
        self.declare_parameter('Linear',0.5)
        self.Linear = self.get_parameter('Linear').get_parameter_value().double_value
        self.declare_parameter('Angular',1.0)
        self.Angular = self.get_parameter('Angular').get_parameter_value().double_value
        self.declare_parameter('Length',1.0)
        self.Length = self.get_parameter('Length').get_parameter_value().double_value
        self.declare_parameter('RotationTolerance',0.3)
        self.RotationTolerance = self.get_parameter('RotationTolerance').get_parameter_value().double_value
        self.declare_parameter('RotationScaling',1.0)
        self.RotationScaling = self.get_parameter('RotationScaling').get_parameter_value().double_value
        
        #create a timer
        self.timer = self.create_timer(0.01,self.on_timer)
        self.index = 0

这段代码定义了一个名为 YahboomCarPatrol 的 ROS 2 节点类,该类继承自 Node 类。此节点主要用于控制 Yahboom 小车进行巡逻任务,如沿着特定路径移动、检测障碍物并做出响应等。

下面是这段代码的主要组成部分和功能说明:

  1. 导入必要的模块:

    • 导入了数学相关的函数和常量(例如 math 和 numpy)。
    • 导入了 ROS 2 相关的模块,如 rclpy 和 Node。
    • 导入了 TF2(Transforms)相关的类,用于坐标变换。
    • 导入了消息类型,如 Twist 和 LaserScan。
    • 导入了其他一些辅助工具,如 PyKDL 和 time.sleep。
  2. 初始化节点:

    • 定义了 __init__ 构造函数,用于创建节点实例。
    • 初始化了一些成员变量,如 moving, Joy_active, command_src, warning, SetLoop, Linear, Angular, Length, Angle, LineScaling, RotationScaling, LineTolerance, RotationTolerance 等。
    • 创建了发布者和订阅者,用于发送速度指令和接收激光雷达数据及手柄状态。
    • 创建了一个 TF2 缓冲区和监听器,用于进行坐标系之间的转换。
    • 声明了多个参数,并设置了默认值,这些参数可以通过外部配置文件或命令行参数进行修改。
    • 创建了一个定时器,用于定期调用 on_timer 方法。
  3. 订阅者回调函数:

    • LaserScanCallback: 这个函数用于处理接收到的激光雷达数据,但在这个类的定义中并未给出具体的实现。
    • JoyStateCallback: 这个函数用于处理接收到的手柄状态数据,同样未给出具体实现。
  4. 定时器回调函数:

    • on_timer: 这个函数是定时器的回调函数,用于周期性地更新小车的状态并执行相应的命令。这部分代码您已经在前一个问题中提供过了。
    def on_timer(self):
        #print("self.error: ",self.error)
        self.Switch = self.get_parameter('Switch').get_parameter_value().bool_value
        self.Command = self.get_parameter('Command').get_parameter_value().string_value
        self.Set_loop = self.get_parameter('Set_loop').get_paramete
具身智能开发实战:12周掌握ROS2机器人开发与AI融合 机器人操作系统(ROS)是机器人软件开发的标准化框架,它通过节点、话题、服务等通信机制实现了模块化与分布式系统设计。其核心原理在于提供硬件抽象、底层设备控制、消息传递和包管理等功能,从而降低机器人开发的复杂度。这一技术价值在于实现了机器人感知、决策与执行三大系统的无缝集成,为智能体与物理环境的交互提供了基础架构。在应用场景上,ROS广泛应用于工业自动化、服务机器人、自动驾驶和特种作业等领域,尤其在需要多传感器融合与实时控制的场景中不可或缺。随着具身智能概念的兴起,ROS2进一步融合了AI大模型与强化学习技术 阅读详情

相关推荐

基于旭日派的Ros系统小车开发——车辆循迹功能开发

摘要:通过调用MiPi相机采集实时图像数据识别黄色的实线,使得小车进行循迹运动。

suners 1395

提炼总结—ROS2机器人开发(第7章)(下)

《ROS2机器人开发 从入门到实践》是一本从零基础到实战落地的机器人开发指南,通过"基础理论+工具详解+项目实战"的三阶学习路径,带你掌握机器人操作系统ROS2核心架构。书中不仅包含通信机制、URDF建模等必备知识,更有SLAM导航、机械臂控制等12个工业级案例,配合Git代码库和仿真环境配置指南,帮助开发者快速实现从算法仿真到真机部署的完整闭环。无论是学生、工程师还是科研人员,都能通过本书构建系统的ROS2开发能力,抢占机器人技术前沿阵地。

weixin_41705306的博客 945

开源机器人之Gazebo和ROS2入门源码包dolly-dashing.zip

开源机器人之Gazebo和ROS2入门源码包 Dolly是虚拟机器人小车,可作为Gazebo和ROS 2的实用介绍。 机器人操作系统的最新版本ROS 2提供了熟悉的工具和功能,同时扩展到新的用例。 Gazebo是一个功能强大的机器人模拟器,供工业界和学术界使用,可以计算物理,生成传感器数据并提供方便的界面。 开源软件正在降低进入门槛并加快机器人技术的进步。 世界各地的机器人专家正在利用Gazebo和ROS的应用,从人形机器人和无人机到仓库机器人和自动驾驶汽车。

基于ROS2和Navigation2框架开发的智能自动巡检机器人系统_包含地图构建_路径规划_自主导航_避障功能_多传感器融合_实时监控_远程控制_异常检测_数据采集_环境感知_自.zip

基于ROS2和Navigation2框架开发的智能自动巡检机器人系统_包含地图构建_路径规划_自主导航_避障功能_多传感器融合_实时监控_远程控制_异常检测_数据采集_环境感知_自.zip

基于ROS 2和Navigation 2的自动巡检机器人设计源码+文档说明.zip

基于ROS 2和Navigation 2的自动巡检机器人设计源码+文档说明.zip,含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用。该项目可以直接作为毕设、期末大作业使用,代码都在里面,系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值,项目都经过严格调试,确保可以运行! 基于ROS 2和Navigation 2的自动巡检机器人设计源码+文档说明.zip基于ROS 2和Navigation 2的自动巡检机器人设计源码+文档说明.zip基于ROS 2和Navigation 2的自动巡检机器人设计源码+文档说明.zip基于ROS 2和Navigation 2的自动巡检机器人设计源码+文档说明.zip基于ROS 2和Navigation 2的自动巡检机器人设计源码+文档说明.zip基于ROS 2和Navigation 2的自动巡检机器人设计源码+文档说明.zip基于ROS 2和Navigation 2的自动巡检机器人设计源码+文档说明.zip基于ROS 2和Naviga

计算机视觉_OpenCV_ROS2_图像采集与处理_深度学习_机器学习_人工智能_摄像头驱动_视频流处理_实时图像传输_多传感器融合_机器人感知_自动驾驶_智能监控_工业检测_医疗影像_增强现.zip

计算机视觉_OpenCV_ROS2_图像采集与处理_深度学习_机器学习_人工智能_摄像头驱动_视频流处理_实时图像传输_多传感器融合_机器人感知_自动驾驶_智能监控_工业检测_医疗影像_增强现.zip

基于ROS2和Navigation2框架开发的智能巡检机器人仿真系统_包含机器人建模与仿真_导航路径规划_目标点语音播报_环境图像采集_多传感器数据融合_自主移动与避障_循环巡检任.zip

基于ROS2和Navigation2框架开发的智能巡检机器人仿真系统_包含机器人建模与仿真_导航路径规划_目标点语音播报_环境图像采集_多传感器数据融合_自主移动与避障_循环巡检任.zip

osgEarth shapefile矢量生成三维模型案例 2.boston.earth

osgEarth shapefile矢量生成三维模型案例 2.boston.earth 波士顿城市建筑、路灯、公园、道路shp矢量生成三维模型案例。

qq_24934183的博客 3543

STM32项目实战_基于STM32F103的智能药箱设计与实现(硬件详解+软件逻辑+调试要点)

本文详细介绍了基于STM32F103的智能药箱设计与实现,涵盖硬件设计、软件逻辑和调试要点。项目核心功能包括精准提醒、药品管理和远程监控,采用STM32单片机作为主控,结合光电开关、蓝牙模块等实现智能化管理。文章还分享了电路图设计、程序优化及常见问题解决方案,为嵌入式开发爱好者提供实用参考。

weixin_28717683的博客 303

Windows防火墙服务异常修复指南:0x80070422与0x6D9报错实战处理

本文针对Windows防火墙服务异常导致的0x80070422与0x6D9报错,提供了从基础到进阶的实战修复指南。核心是通过services.msc服务管理器检查并修复Windows Firewall服务,包括设置启动类型、检查依赖服务等关键步骤。同时介绍了当基础方法失效时,如何使用命令行工具、系统文件检查器(SFC/DISM)以及排查组策略与第三方软件冲突等深度解决方案,帮助用户彻底解决防火墙服务无法启动或访问的问题。

m9n0o的博客 542

CloudFlare CDN优化延迟

这两天在倒腾一个小网站,因为刚注册的域名还没来得及备案,所以就解析到了国外的服务器临时撸代码。为了防止不必要的麻烦,所以在前端套了CloudFlare,但是延迟就比较感人了,通常在150+左右还时不时的抽风,所以就找了点资料来优化一下这个延迟问题。然后再新增一些CloudFlare的亚太地区节点ip的A解析,有耐心的可以分为电信线路和联通线路,我比较懒,所以只分了境内和默认。众所周知CloudFlare是智齿cname解析的,那么我们今天就要用到这个办法了,这里要注意一下,默认的解析是不能动的。

Zuozi - 网络从业者长见识就来Zuozi.NET 1084

EMC工程师职业发展:从测试整改到系统设计的进阶之路

电磁兼容(EMC)是确保电子设备在复杂电磁环境中可靠工作的关键技术,其核心在于控制电磁干扰(EMI)并提升抗扰度。其基本原理涉及电磁场理论、噪声耦合路径与滤波屏蔽技术。对于电子产品而言,EMC设计直接关系到能否通过CE、FCC等强制性认证,是产品上市和市场竞争力的关键。在工程实践中,EMC工程师需要从电路设计、PCB布局、元器件选型等源头入手,将EMC要求融入产品开发全流程,实现从后期“整改”到前期“设计预防”的价值跃迁。本文聚焦EMC工程师的核心能力体系构建与职业发展路径,深入探讨了如何从掌握标准测试、电

weixin_30819085的博客 388

GMSL2摄像头接入避坑指南:从FMC子卡配置到V4L2调用的完整流程(附Ubuntu20.04实测)

本文详细解析了GMSL2摄像头接入的全流程,从FMC子卡配置到V4L2调用的完整指南。基于XC7Z100平台实测经验,提供了硬件选型、带宽优化、Linux驱动配置及高分辨率采集的实战技巧,帮助开发者规避常见问题,提升系统稳定性与性能。

weixin_33737774的博客 418

Python声音识别实战:从音频处理到智能分类

本文详细介绍了使用Python进行声音识别的完整实战流程。从音频预处理、特征提取(如MFCC)到构建分类模型(SVM、CNN),并最终实现一个实时环境音分类器。文章以Python为核心工具,结合librosa等库,为开发者提供了从理论到实践的清晰路径,适用于智能家居、工业监测等多种应用场景。

weixin_29064009的博客 324

米哈游 AI产品经理面试题精选:10道高频考题+答案解析(附PDF)

米哈游是全球知名游戏开发商,以《原神》《崩坏》系列著称,专注二次元文化与AI技术创新。本文整理了10道AI产品经理面试题,涵盖Transformer架构、智能NPC设计、机器学习应用、AIGC产品规划等核心领域。题目既考察技术理解(如RAG原理、多模态模型),又关注产品落地(游戏平衡性优化、伦理安全),同时强调跨团队协作能力。参考答案均结合米哈游业务场景,体现技术驱动与玩家体验并重的产品思维,展现AI在游戏行业的创新应用前景。

ZHHHHH15的博客 682

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: ROS2代码阅读笔记4-ROS2雷达跟踪
下一篇: Eigen的使用
Lelin_8013
博客等级 码龄6年 423粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值