ROS2代码阅读笔记3-ROS2激光雷达简单避障行为

ROS2学习笔记(六)-- 自定义消息和服务实现控制指令优化以及在线换图 简介:前几节我们主要介绍了关于ROS2通讯机制--主题(Topic)的发布与订阅机制的使用方法,一般情况下,数据周期发布、数据交互频率高,或者数据生产与消费不是强关联的功能,我们通过主题的发布与订阅机制来实现,比如摄像头图像数据、小车控制指令等;ROS2系统底层通讯机制还有另外一种--服务(Service),服务一般用于数据交互频率比较低或者没有明显周期性质,而且需要实时返回交互结果的功能需求中,比如我们这一节要实现的在线更新地图的功能。 阅读详情
AI摘要

本文围绕ROS2激光雷达简单避障行为展开代码分析。介绍了导入的库和模块,包括ROS 2 Python客户端库等。定义了常量,创建了实现避障逻辑的类。阐述了订阅者和发布者、参数声明与初始化、状态变量和PID控制器等内容,还说明了定时器及相关方法的功能。

导入库和模块

#ros lib
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist
from sensor_msgs.msg import LaserScan

#common lib
import math
import numpy as np
import time
from time import sleep
from yahboomcar_laser.common import *
  • rclpy: ROS 2 Python客户端库。
  • Node: ROS 2中的节点基类。
  • Twist: 用于发布机器人速度的消息类型。
  • LaserScan: 激光雷达扫描数据的消息类型。
  • math: 数学函数库。
  • numpy: 数值计算库,用于处理数组和数学运算。
  • time: 用于时间管理。
  • yahboomcar_laser.common: 自定义的通用功能模块(具体内容不详)。

 常量定义

print ("import done")
RAD2DEG = 180 / math.pi
  • RAD2DEG: 将弧度转换为度数的常量

laserAvoid 类定义

class laserAvoid(Node):
    def __init__(self, name):
        super().__init__(name)
  • laserAvoid: 继承自 Node,用于实现避障逻辑的类。
  • __init__: 初始化方法,初始化节点和必要的参数、发布者和订阅者。

订阅者和发布者

        #create a sub
        self.sub_laser = self.create_subscription(LaserScan, "/scan", self.registerScan, 1)
        self.sub_JoyState = self.create_subscription(Bool, '/JoyState', self.JoyStateCallback, 1)
        #create a pub
        self.pub_vel = self.create_publisher(Twist, '/cmd_vel', 1)
  • sub_laser: 订阅激光雷达数据的主题 /scan。
  • sub_JoyState: 订阅手柄控制状态的主题 /JoyState。
  • pub_vel: 发布机器人速度指令的主题 /cmd_vel。

参数声明和初始化

        #declareparam
        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("LaserAngle", 40.0)
        self.LaserAngle = self.get_parameter('LaserAngle').get_parameter_value().double_value
        self.declare_parameter("ResponseDist", 0.55)
        self.ResponseDist = self.get_parameter('ResponseDist').get_parameter_value().double_value
        self.declare_parameter("Switch", False)
        self.Switch = self.get_parameter('Switch').get_parameter_value().bool_value
  • 声明了多个参数,如线速度、角速度、激光雷达角度、响应距离和开关状态,并从参数服务器中获取其值。

状态变量和PID控制器

        self.Right_warning = 0
        self.Left_warning = 0
        self.front_warning = 0
        self.Joy_active = False
        self.ros_ctrl = SinglePID()
  • Right_warning, Left_warning, front_warning: 用于存储各方向的障碍物检测结果。
  • Joy_active: 表示手柄是否激活。
  • ros_ctrl: 单独的PID控制器(具体实现不明)。

 定时器

        self.timer = self.create_timer(0.01, self.on_timer)
  •  self.timer: 创建一个定时器,每0.01秒执行一次 on_timer 方法。

on_timer 方法

    def on_timer(self):
        self.Switch = self.get_parameter('Switch').get_parameter_value().bool_value
        self.angular = self.get_parameter('angular').get_parameter_value().double_value
        self.linear = self.get_parameter('linear').get_parameter_value().double_value
        self.LaserAngle = self.get_parameter('LaserAngle').get_parameter_value().double_value
        self.ResponseDist = self.get_parameter('ResponseDist').get_parameter_value().double_value
  • 定时获取和更新参数值。

JoyStateCallback 方法

    def JoyStateCallback(self, msg):
        if not isinstance(msg, Bool): return
        self.Joy_active = msg.data
  • 手柄状态的回调函数,更新 Joy_active 状态

 registerScan 方法

    def registerScan(self, scan_data):
        if not isinstance(scan_data, LaserScan): return
        ranges = np.array(scan_data.ranges)
        self.Right_warning = 0
        self.Left_warning = 0
        self.front_warning = 0
        
        for i in range(len(ranges)):
            angle = (scan_data.angle_min + scan_data.angle_increment * i) * RAD2DEG
            if 160 > angle > 180 - self.LaserAngle:
                if ranges[i] < self.ResponseDist*1.5:
                    self.Right_warning += 1
            if -160 < angle < self.LaserAngle - 180:
                if ranges[i] < self.ResponseDist*1.5:
                    self.Left_warning += 1
            if abs(angle) > 160:
                 if ranges[i] <= self.ResponseDist*1.5: 
                        self.front_warning += 1
        if self.Joy_active or self.Switch:
            if self.Moving:
                self.pub_vel.publish(Twist())
                self.Moving = not self.Moving
            return
        self.Moving = True
        twist = Twist()
        if self.front_warning > 10 and self.Left_warning > 10 and self.Right_warning > 10:
            print('1, there are obstacles in the left and right, turn right')
            twist.linear.x = self.linear
            twist.angular.z = -self.angular
            self.pub_vel.publish(twist)
            sleep(0.2)
        
        elif self.front_warning > 10 and self.Left_warning <= 10 and self.Right_warning > 10:
            print('2, there is an obstacle in the middle right, turn left')
            twist.linear.x = 0.0
            twist.angular.z = self.angular
            self.pub_vel.publish(twist)
            sleep(0.2)
            if self.Left_warning > 10 and self.Right_warning <= 10:
                twist.linear.x = 0.0
                twist.angular.z = -self.angular
                self.pub_vel.publish(twist)
                sleep(0.5)
        elif self.front_warning > 10 and self.Left_warning > 10 and self.Right_warning <= 10:
            print('4. There is an obstacle in the middle left, turn right')
            twist.linear.x = 0.0
            twist.angular.z = -self.angular
            self.pub_vel.publish(twist)
            sleep(0.2)
            if self.Left_warning <= 10 and self.Right_warning > 10:
                twist.linear.x = 0.0
                twist.angular.z = self.angular
                self.pub_vel.publish(twist)
                sleep(0.5)
        elif self.front_warning > 10 and self.Left_warning < 10 and self.Right_warning < 10:
            print('6, there is an obstacle in the middle, turn left')
            twist.linear.x = 0.0
            twist.angular.z = self.angular
            self.pub_vel.publish(twist)
            sleep(0.2)
        elif self.front_warning < 10 and self.Left_warning > 10 and self.Right_warning > 10:
            print('7. There are obstacles on the left and right, turn right')
            twist.linear.x = 0.0
            twist.angular.z = -self.angular
            self.pub_vel.publish(twist)
            sleep(0.4)
        elif self.front_warning < 10 and self.Left_warning > 10 and self.Right_warning <= 10:
            print('8, there is an obstacle on the left, turn right')
            twist.linear.x = 0.0
            twist.angular.z = -self.angular
            self.pub_vel.publish(twist)
            sleep(0.2)
        elif self.front_warning < 10 and self.Left_warning <= 10 and self.Right_warning > 10:
            print('9, there is an obstacle on the right, turn left')
            twist.linear.x = 0.0
            twist.angular.z = self.angular
            self.pub_vel.publish(twist)
            sleep(0.2)
        elif self.front_warning <= 10 and self.Left_warning <= 10 and self.Right_warning <= 10:
            print('10, no obstacles, go forward')
            twist.linear.x = self.linear
            twist.angular.z = 0.0
            self.pub_vel.publish(twist)
  • registerScan: 处理激光雷达数据的回调函数。
  • 将 LaserScan 数据转换为 NumPy 数组 ranges,并初始化各方向的警告计数器。
  • 遍历所有激光雷达的测距数据,计算每个角度对应的障碍物信息。
  • 根据检测到的障碍物信息,设置相应的警告计数器。
  • 判断是否为手柄控制或开关激活模式,如果是则停止移动。
  • 否则,根据障碍物情况发布适当的速度指令(转向、前进等)。

 main 函数

def main():
    rclpy.init()
    laser_avoid = laserAvoid("laser_Avoidance_a1")
    print ("start it")
    rclpy.spin(laser_avoid)
  • 初始化 ROS 2,并创建 laserAvoid 节点实例。
  • 启动节点的事件循环,使其持续运行。

 common.py

#!/usr/bin/env python
# coding:utf-8
#import rospy
import rclpy
from geometry_msgs.msg import Twist
from std_msgs.msg import Bool

class SinglePID:
    def __init__(self, P=0.1, I=0.0, D=0.1):
        self.Kp = P
        self.Ki = I
        self.Kd = D
        print("init_pid: ", P, I, D)
        self.pid_reset()

    def Set_pid(self, P, I, D):
        self.Kp = P
        self.Ki = I
        self.Kd = D
        print("set_pid: ", P, I, D)
        self.pid_reset()

    def pid_compute(self, target, current):
        self.error = target - current
        self.intergral += self.error
        self.derivative = self.error - self.prevError
        result = self.Kp * self.error + self.Ki * self.intergral + self.Kd * self.derivative
        self.prevError = self.error
        return result

    def pid_reset(self):
        self.error = 0
        self.intergral = 0
        self.derivative = 0
        self.prevError = 0

ROS2激光雷达避障实战:从参数调优到行为策略解析 本文深入解析了ROS2激光雷达避障的实战技巧,从核心代码骨架到关键参数调优,详细阐述了LaserAngle与ResponseDist等参数对机器人行为的影响。通过多区域检测与基于规则的决策树,结合具体调优案例,指导开发者实现机器人在复杂环境中的稳健、灵活避障。 阅读详情

相关推荐

从仿真到现实:CTSAC算法在TurtleBot3上的避障实战(含ROS配置教程)

本文详细介绍了如何将前沿的CTSAC算法从仿真环境部署到真实的TurtleBot3机器人上,实现鲁棒的自主避障。文章深入解析了算法融合Transformer架构与课程学习策略的核心原理,并提供了完整的ROS 2环境配置、仿真训练、激光雷达感知优化以及实机调试的实战教程,旨在解决机器人技术从仿真到现实迁移的关键挑战。

weixin_29054245的博客 439

发布Twist消息类型的话题订阅异常报错

报错类型 用python写的一个键盘检测程序: #!/usr/bin/env python #coding=utf-8 import rospy from geometry_msgs.msg import Twist import sys, select, termios, tty msg = “”" Control The Robot! Moving around: u i o j k l m , . q/z : increase/decrease max speeds

blue_skyLZW的博客 1013

Unity+ROS2仿真预演:激光雷达机器人开发降本增效实践

机器人开发中,仿真技术是连接算法验证与实体部署的关键桥梁。其核心原理在于通过高保真虚拟环境模拟真实世界的物理交互与传感器数据,为算法提供安全、可重复的测试平台。这项技术的核心价值在于显著降低开发成本与风险,实现开发流程的革新。在移动机器人领域,尤其是涉及激光雷达导航的场景,仿真技术能有效解决硬件依赖、调试效率低等痛点。通过将机器人操作系统ROS2与强大的3D引擎Unity结合,开发者可以在虚拟环境中先行验证感知、决策与控制算法,待逻辑完备后再无缝迁移至实体机器人,从而达成降本增效的目标。

weixin_33889665的博客 414

ROS2+nav2+激光雷达导航(上)

利用nav2中的amcl算法进行定位

scarecrow_sun的博客 2万+

宇树机器人二次开发实战:从环境搭建到自主避障的完整指南

机器人操作系统(ROS)作为机器人领域的标准软件框架,通过提供硬件抽象、底层设备控制、消息传递和包管理等核心功能,实现了机器人软件模块的松耦合与复用。其核心原理在于基于节点的分布式通信架构,节点间通过话题、服务等机制交换数据,从而构建复杂的机器人应用。这一架构的技术价值在于大幅降低了机器人软件的开发门槛与集成复杂度,使得开发者能够聚焦于算法与应用逻辑,而非底层通信与驱动。在应用场景上,ROS广泛应用于移动机器人导航、机械臂控制、无人机以及四足机器人等领域。以宇树(Unitree)四足机器人为例,其开放的RO

weixin_33861800的博客 1433

2026机器人开发学习路线:从ROS2到AI集成的系统化进阶指南

机器人开发作为软硬件深度融合的交叉学科,其核心在于构建一个完整的“感知-决策-控制”系统框架。从基础原理层面,机器人系统通过传感器(如激光雷达、摄像头)获取环境信息,利用SLAM算法实现同步定位与建图,再通过路径规划与控制算法驱动机体执行任务。这一技术架构的价值在于实现了物理世界的智能交互与自主作业,广泛应用于工业自动化、服务机器人、自动驾驶等场景。随着ROS2成为机器人操作系统的事实标准,结合人工智能技术的快速发展,掌握从基础编程、数学到ROS2核心、感知定位、运动规划,再到AI模型集成与系统部署的全栈能

weixin_30751947的博客 613

【6. 激光雷达接入ROS】

本节学习了ROS机器人的激光雷达原理和数据查看,尝试C++和python两种语言编写,接下来会介绍机器人的IMU传感器的操作。🎉🎉🎉

vor234的博客 7792

【RK3588 ROS2编程实例】-ROS2 Humble中使用激光雷达

本文将详细介绍如何在OrangePi5开发板中搭建ROS2开发环境,并在ROS2环境中使用激光雷达。

视觉与物联智能 4745

ROS学习笔记(三)——调用激光雷达信息实现机器人避障

本文介绍了如何利用ROS的发布/订阅机制实现机器人避障功能。通过激光雷达发布障碍物距离数据到/scan话题,路径规划节点订阅并处理后发布运动指令到/cmd_vel话题,最终驱动机器人运动。文章详细说明了Gazebo物理仿真环境和Rviz可视化工具的使用方法,并提供了创建激光雷达数据功能包、编写订阅节点代码的完整步骤。最后展示了机器人通过激光雷达检测障碍物,在距离小于1.5米时自动转向避障的完整实现过程。

weixin_52865005的博客 1918

ROS2 - 乐动激光雷达 LD06

STL-06P 主要由激光测距核心,无线传电单元,无线通讯单元,角度测量单元、电机驱动单元和机械外壳组成。STL-06P 测距核心采用 DTOF 技术,可进行每秒 5000 次的测距。每次测距时,雷达发射出红外激光,激光遇到目标物体后被反射到单光子接收单元。

机器人控制与仿真应用 3487

c语言串口编程详解

串口: 一种异步通信接口,通常用于低速数据传输。RS-232: 最常见的串口标准,定义了电气特性、连接器和信号线。UART: 通用异步收发传输器,是实现串口通信的硬件模块。通过以上内容,你应能够理解并实现C语言在Windows和Linux平台上的串口编程。希望这本手册能帮助你在实际项目中顺利进行串口通信开发。如果有任何疑问或需要进一步的帮助,请随时提问。

jkzyx123的博客 2224

《动手学ROS2》1.2ROS与ROS2对比

本系列教程作者:小鱼 公众号:鱼香ROS QQ交流群:139707339 教学视频地址:小鱼的B站 完整文档地址:鱼香ROS官网 版权声明:如非允许禁止转载与商业用途。 1.2 ROS与ROS2对比 经过上一节的学习,相信你已经对ROS和ROS2的发展有了一定的了解,本节小鱼将给大家从多个角度讲解ROS和ROS2的区别之处。 1.ROS问题举例 上节课说到ROS的设计目标是简化机器人的开发,如何简化呢?ROS为此设计了一整套通信机制(话题、服务、参数、动作)。 通过这些通信机制,ROS实现了将机器人的.

生活不止眼前的苟且 1912

ROS2前置基础教程 | 使用CMakeLists.txt编译ROS2节点

答案是有的,那就是cmake工具。cmake通过调用CMakeLists.txt直接生成Makefile。 2.新建CMakeLists.txt 在新建,输入下面内容。 3.编译代码 我们一般会创建一个新的目录,运行cmake并进行编译,这样的好处是不会显得那么乱。 创建好文件夹,接着运行cmake指令,代表到上级目录找。 运行完cmake你应该可以在build目录下看到cmake自动生成的Makefile了,接着就可以运行make指令进行编译 运行完上面的指令,就可以在build目录下发现节点了。ROS2

生活不止眼前的苟且 1万+

【ROS2机器人入门到实战】2.ROS与ROS2对比

获取完整教程及配套资料代码,请关注公众号获取两驱版四驱版为方便交流,搭建了机器人技术问答社区:地址经过上一节的学习,相信你已经对ROS和ROS2的发展有了一定的了解,本节小鱼将给大家从多个角度讲解ROS和ROS2的区别之处。1.ROS问题举例上节课说到ROS的设计目标是简化机器人的开发,如何简化呢?ROS为此设计了一整套通信机制(话题、服务、参数、动作)。通过这些通信机制,ROS实现了将机器人的各个组件给的连接起来,在设计这套通信机制的时候就设计了一个叫做Ros Master。

生活不止眼前的苟且 8681

一文搞定学术英语写作 (斯坦福SCI论文写作课程笔记)

0.前言: 本文基于斯坦福Kristin Sainani 教授的学术论文写作公开课——SCI论文写作(Writing in the Sciences)。在此基础上进行章节顺序的重排及部分内容的删减,以方便第一次进行英语学术论文写作的同学快速上手。 时间充足和想要系统学习英文学术写作的同学,十分建议观看完整课程视频,一定会受益匪浅!课程地址如下: 课程B站地址:https://www.bilibili.com/video/BV1zv41177JQ 1.论...

Ogmx的博客 3万+

备战2025数学建模国赛(算法65):Fisher判别分析

在数学建模竞赛中,我们常常会遇到需要对研究对象进行分类或判断的问题。例如,根据西瓜的各类指标判断其好坏,根据经济数据判断一个国家的发展程度,或根据病人的医学影像特征判断其是否患病。这类“分类判别”问题,是建模竞赛中最常见的题型之一。Fisher判别分析(或称线性判别分析,LDA)作为一种经典的、有监督的降维与分类方法,因其模型简洁、可解释性强、计算高效而备受青睐。

YOLO 422

零基础玩转ROS小车

零基础玩转ROS小车 ROS搭建基于Linux版本: Ubuntu 18.04 LTS 虚拟机平台: VMware *需要安装虚拟机VMware 14.0和Linux操作系统,安装过程参考百度 目录: ROS基础 ROS常用概念 环境搭建 ROS初体验 节点通信原理 一、ROS基础 ROS常用的关键词 1: message: 即消息.机器人需要传感器,传感器采集到的信息,即这儿的message. 假如我们的GPS采集到机器人位置消息,温度计采集到的温度等. 任何数据都能作为message. 2

栀末寸芒 5415

让 OData V4 界面更聪明:SAP UI5 中的 Side Effects 全解析

摘要:在OData V4应用中,字段修改常触发联动更新(Side Effects)。SAP UI5支持通过后端PATCH响应隐式返回或前端显式请求(requestSideEffects)两种方式处理。最佳实践包括:在validateFieldGroup事件中触发同批次请求,使用$$patchWithoutSideEffects避免重复刷新,并在草稿场景优化响应体。注解定义触发规则,而前端负责执行时机,二者配合可减少网络开销并保证数据一致性。Fiori elements进一步扩展了Side Effects在批

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 178

SLAM导航机器人零基础实战系列:(六)SLAM建图与自主避障导航——1.在机器人上使用传感器...

SLAM+语音机器人DIY系列:(六)SLAM建图与自主避障导航——1.在机器人上使用传感器 摘要 通过前面的基础学习,本章进入最为激动的机器人自主导航的学习。在前面的学习铺垫后,终于迎来了最大乐趣的时刻,就是赋予我们的miiboo机器人能自由行走的生命。本章将围绕机器人SLAM建图、导航避障、巡航、监控等...

小虎哥哥爱学习-优快云 5767

Python爬虫实战:公共资源交易平台招标数据采集实战 - 从零构建企业情报系统(附CSV导出 + SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 1288

MATLAB算法实战应用案例精讲-【数模应用】校准曲线(附MATLAB、python和R语言代码实现)

模型校准曲线(Calibration Curve),也称为可靠性曲线(Reliability Curve)或概率校准曲线(Probability Calibration Curve),是一种评估分类模型输出概率准确性的图形工具。它可以帮助我们理解模型的预测概率是否与实际标签的分布一致。校准曲线通常包括以下步骤:计算模型预测概率:对于测试集中的每个样本,模型会输出一个概率值,表示样本属于正类的概率。将数据分桶:将这些概率值分成若干个等宽的桶(例如10个桶),每个桶中的样本具有相似的预测概率。

qq_36130719的博客 559

slam_gmapping:ROS2下的高精度SLAM解决方案

slam_gmapping:ROS2下的高精度SLAM解决方案 【下载地址】slam_gmapping针对ROS2的SlamGmapping slam_gmapping是一个专为ROS2设计的SLAM(同步定位与地图构建)工具,能够帮助移动机器人在未知环境中实时创建二维地图。该项目包含两个核心软件包:openslam_g...

gitblog_06784的博客 846

YOLOv8改进有效系列目录 | 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制

Hello,各位读者们好,本专栏自开设两个月以来已经更新改进教程120+余篇其中包含C2f、主干、检测头、注意力机制、Neck多种结构上创新,也有损失函数和一些细节点上的创新,订阅本专栏以后你不仅可以收获跟专栏的阅读权限,同时可以进Qq群,里面包含集成我所有创新的YOLO最新目录,和我本人录制的视频讲解教程,如果你想要在YOLOv8系列收获一篇论文,我相信订阅本专栏后你一定会有所收获~YOLOv8改进有效系列目录。

Snu77的博客 18万+

基于ROS 2与PuppyPi的家庭机器人:自主巡逻与视觉抓取实践

机器人操作系统(ROS)作为机器人领域的核心中间件,为分布式、模块化的机器人软件开发提供了标准化的通信框架与工具集。其核心原理在于通过节点、话题、服务等抽象,实现传感器、控制器与算法模块间的高效数据交换与解耦。这一设计极大地提升了机器人系统的开发效率与可维护性,其技术价值在于将复杂的机器人系统拆分为可复用、可独立测试的功能单元。在应用场景上,ROS广泛应用于从工业自动化到服务机器人的各个领域,特别是在需要集成多传感器(如激光雷达、深度相机)与复杂行为(如SLAM导航、机械臂控制)的智能移动机器人项目中。本文

ithome 362

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Turtlebot深度解析:从ROS控制到硬件校准的全栈实践

移动机器人平台是理解自主导航、SLAM与嵌入式系统协同的关键入口。其核心在于ROS通信机制、传感器融合原理与物理层参数耦合关系——激光雷达FOV偏差会指数级放大定位漂移,轮距与编码器误差共同决定里程计可靠性,而TF树结构和QoS策略则暴露分布式系统的本质约束。这些技术价值在高校教学、毕业设计及轻量级产品原型开发中尤为突出:既需兼顾实时性与鲁棒性,又受限于OpenCR等资源受限平台。本文聚焦Turtlebot3在ROS2环境下的真实工程断层,深入拆解RPLIDAR A1选型逻辑、IMU与轮式里程计的误差互补机

weixin_34151004的博客 554

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

开篇导读:《PX4 + ROS 2:从仿真到真机的可编程无人机开发指南》

摘要: 本系列文章介绍如何利用ROS2+PX4构建智能无人机系统,实现自主飞行、避障和目标跟踪等功能。内容涵盖四大模块:基础架构与通信(ROS2/PX4工具链搭建)、核心控制与飞行(Offboard模式控制)、智能感知与避障(激光雷达/YOLO应用)以及高级应用(精准降落/编队飞行)。通过12章的渐进式学习,读者将从仿真到真机逐步掌握无人机开发技术,理解PX4(实时控制)与ROS2(智能决策)的协同架构。适合零基础入门或进阶开发者,配套代码与仿真环境支持实践验证。

612

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值