ROS2机器人slam_toolbox建图零基础

系统:Ubuntu22.04

ROS2版本:Humble

雷达设备:rplidar_a1

一、安装必要的软件包

# 更新系统 sudo apt update
# 安装slam_toolbox sudo apt install ros-humble-slam-toolbox
# 安装RPLidar驱动 sudo apt install ros-humble-rplidar-ros
# 安装导航相关包 sudo apt install ros-humble-navigation2 ros-humble-nav2-bringup

二、配置RPLidar_A1

创建udev规则(让系统识别雷达)

# 创建udev规则 echo 'KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0666", GROUP:="dialout", SYMLINK+="rplidar"' | sudo tee /etc/udev/rules.d/rplidar.rules
# 重新加载udev规则 sudo udevadm control --reload-rules sudo udevadm trigger

重新插拔雷达USB线

测试雷达连接

# 查看雷达是否被识别 ls -l /dev | grep ttyUSB # 应该看到类似:lrwxrwxrwx 1 root root 7 Nov 6 10:20 rplidar -> ttyUSB0

三、启动雷达

# 启动RPLidar A1 ros2 launch rplidar_ros rplidar_a1_launch.py
# 在另一个终端检查激光数据 ros2 topic echo /scan --no-arr | head -5 #这一步有报错很正常,因为我们只看前5行的数据

四、创建SLAM启动文件

# 创建工作空间目录(如果还没有) mkdir -p ~/slam_ws/src cd ~/slam_ws/src
# 创建功能包(如果需要) ros2 pkg create my_slam --build-type ament_cmake --dependencies rclcpp slam_toolbox nav2_msgs
# 创建launch目录 mkdir -p ~/slam_ws/src/my_slam/launch

创建启动文件

nano ~/slam_ws/src/my_slam/launch/slam_with_rplidar.launch.py

添加以下代码:

import launch from launch_ros.actions import Node from launch.actions import DeclareLaunchArgument from launch.substitutions import LaunchConfiguration def generate_launch_description(): # 定义启动参数 use_sim_time = LaunchConfiguration('use_sim_time', default='false') # RPLidar A1 节点 rplidar_node = Node( package='rplidar_ros', executable='rplidar_node', name='rplidar_node', parameters=[{ 'serial_port': '/dev/rplidar', 'serial_baudrate': 115200, 'frame_id': 'laser', 'inverted': False, 'angle_compensate': True, 'scan_mode': 'Standard' }], output='screen' ) # slam_toolbox 节点 slam_toolbox_node = Node( package='slam_toolbox', executable='async_slam_toolbox_node', name='slam_toolbox', output='screen', parameters=[{ 'use_sim_time': use_sim_time, 'map_frame': 'map', 'odom_frame': 'odom', 'base_frame': 'base_link', 'scan_topic': '/scan', 'mode': 'mapping', # 建图模式 'resolution': 0.05, # 地图分辨率 'max_laser_range': 12.0, # 最大激光范围 }] ) # 静态TF发布 - 定义雷达位置 static_tf_laser = Node( package='tf2_ros', executable='static_transform_publisher', name='static_transform_publisher_laser', arguments=['0', '0', '0.1', '0', '0', '0', 'base_link', 'laser'] ) # 静态TF发布 - 定义base_link到odom的初始位置 static_tf_odom = Node( package='tf2_ros', executable='static_transform_publisher', name='static_transform_publisher_odom', arguments=['0', '0', '0', '0', '0', '0', 'odom', 'base_link'] ) return launch.LaunchDescription([ DeclareLaunchArgument('use_sim_time', default_value='false'), rplidar_node, static_tf_laser, static_tf_odom, slam_toolbox_node, ])

添加依赖

cd ~/slam_ws/src/my_slam nano CMakeLists.txt

将内容修改为:

cmake_minimum_required(VERSION 3.8) project(my_slam) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif() # find dependencies find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(slam_toolbox REQUIRED) find_package(nav2_msgs REQUIRED) # 添加这行:安装launch目录 install(DIRECTORY launch DESTINATION share/${PROJECT_NAME} ) if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) # the following line skips the linter which checks for copyrights # comment the line when a copyright and license is added to all source files set(ament_cmake_copyright_FOUND TRUE) # the following line skips cpplint (only works in a git repo) # comment the line when this package is in a git repo and when # a copyright and license is added to all source files set(ament_cmake_cpplint_FOUND TRUE) ament_lint_auto_find_test_dependencies() endif() ament_package()

这一步主要添加了launch目录:

install(DIRECTORY launch

    DESTINATION share/${PROJECT_NAME}        

)

五、构建工作空间

cd ~/slam_ws colcon build source install/setup.bash

六、启动完整的SLAM系统

# 终端1:启动SLAM和雷达 ros2 launch my_slam slam_with_rplidar.launch.py # 终端2:启动RViz2 ros2 run rviz2 rviz2

七、配置RViz2显示建图过程

在RViz2中:

1、修改Fixed Frame:

        Global Option---->Fixed Frame:设置为 map

2、添加显示项(点击Add按钮)

        LaserScan:

                Topic :  /scan

                Size : 0.1

                Color : 红色或绿色

        Map:

                Topic : /map

                Color Scheme : costmap

                Draw Behind : √

TF:

        显示坐标框架关系

3、保存RViz配置

file---->Save Config As ----> ~/slam_ws/slam_config.rviz

 八、开始建图

1、缓慢移动雷达在环境中行走

2、观察RViz中的建图过程

3、确保覆盖所有区域

九、保存地图

建图完成后,保存地图:

ros2 run nav2_map_server map_saver_cli -f ~/my_first_map

Read more

逐字显示的前端渲染机制解析

逐字显示的前端渲染机制解析

核心原理 逐字显示效果的实现,本质上是通过状态的逐步更新和React的高效渲染机制共同作用的结果。让我们从原理上分析这个过程: 1. 状态更新机制 在React中,当我们使用setState(或函数式组件中的useState)更新状态时,React会重新渲染组件。对于逐字显示,我们每次只更新状态中存储的文本内容,添加一个新字符: // 伪代码const[text, setText]=useState('');// 每次添加一个字符setText(prevText=> prevText + newChar); 2. React的渲染优化 React的渲染过程并不是简单的全量渲染,而是经过了以下优化: 1. 虚拟DOM比较:React会将新的虚拟DOM与旧的虚拟DOM进行比较,只更新发生变化的部分 2. 批量更新:React会将多个状态更新合并为一次渲染 3. DOM操作最小化:只修改必要的DOM节点,而不是重新创建整个元素 3. 视觉效果实现 虽然每次状态更新都会触发组件重新渲染,但由于: * 每次只添加一个字符 * React的渲染速度非常快 * 浏览器

LangChain 消息处理全解析:缓存、过滤、合并与流式输出实战

LangChain 消息处理全解析:缓存、过滤、合并与流式输出实战

文章目录 * 一、消息内存缓存 * 核心概念 * 关键组件 * 代码流程 * 运行效果 * 二、消息过滤 * 核心概念 * 关键函数 * 过滤参数 * 代码示例 * 过滤逻辑 * 三、消息合并 * 核心概念 * 关键函数 * 代码示例 * 合并效果 * 两种使用方式 * 四、流式输出 * 什么是流式输出 * 为什么需要? * 典型应用 * 五、同步 vs 异步流式 * 核心区别 * 工作原理 * 何时使用异步? * 六、流式输出基础用法 * 同步流式 * 异步流式 * 七、输出解析器 * 八、流式输出实际应用 * 1. 聊天机器人 * 2. 多用户并发 * 3. FastAPI 集成 * 九、常见问题

Spring Boot 项目中的响应式应用(Reactive Web)与传统 MVC:原理区别、代码对比与适用场景

Spring Boot 项目中的响应式应用(Reactive Web)与传统 MVC:原理区别、代码对比与适用场景 在 Spring Boot 项目中,开发者经常需要在传统 Spring MVC 和响应式 WebFlux 之间做出选择,尤其当配置文件中出现 spring.main.web-application-type: reactive 时。本文将从底层原理、线程模型、I/O 处理方式、适用场景等角度详细对比两者,并通过实际代码示例说明差异。 1. 核心原理对比 维度传统 Spring MVC (Servlet-based)Spring WebFlux (Reactive / Non-blocking)编程范式命令式(Imperative)声明式 + 响应式(Declarative + Reactive)底层 I/

WebAgent详解+实战:用开源AI智能体搞定产品与竞品市场调研

WebAgent详解+实战:用开源AI智能体搞定产品与竞品市场调研

在市场调研场景中,产品及竞品分析往往需要投入大量人力,手动浏览网页、提取信息、整理数据,不仅效率低下,还容易出现信息遗漏、误差等问题。WebAgent作为通义实验室开源的端到端自主网页智能体,凭借强大的中文语义理解、多步骤推理和结构化输出能力,可完全本地部署且永久免费,能高效替代人工完成网页信息采集、竞品数据提取、产品信息汇总等调研工作。本文将从WebAgent核心介绍、部署要点入手,聚焦产品与竞争对手调研场景,一步步实现实战示例,让无论是开发者还是市场从业者,都能快速上手,用AI提升调研效率,摆脱重复劳动。 一、初识WebAgent:阿里开源的网页智能体“神器” 1.1 什么是WebAgent? WebAgent是阿里巴巴通义实验室开源的自主网页智能体框架,核心定位是“模拟人类浏览网页的完整流程”,能理解自然语言指令、规划浏览路径、执行网页操作(点击、翻页、搜索等)、提取关键信息并结构化输出,无需人工干预即可完成复杂的网页相关任务。 与国外的AgentQL相比,WebAgent最大的优势的是完全开源免费、支持本地部署、中文语义优化,无需调用云端API,数据可完全保存在内网,