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

开源模型应用落地-知识巩固-生产级AI服务优化(二)

开源模型应用落地-知识巩固-生产级AI服务优化(二)

一、前言     在构建基于Flask的AI接口服务时,采用蓝图(Blueprint)架构可以大幅提升应用的可管理性和扩展性。通过将不同功能模块(如用户认证、模型处理和数据管理)组织成独立的蓝图,我们可以更加清晰地划分代码结构,使团队协作和后续维护变得更加高效。同时,借助 `python-dotenv` 来管理敏感信息和环境变量,则进一步增强了应用的安全性和灵活性。通过合理的模块化设计与高效的环境设置,我们能够优化 AI 服务的开发和部署流程,提升服务的性能与用户体验。 二、术语介绍 2.1. Loguru     是一个用于 Python 的日志库,旨在简化日志记录的过程,提供比 Python 内置的 `logging` 模块更易用和更强大的功能。Loguru 不仅使得日志记录更加简单直观,还提供了许多功能,例如: 1. 简单易用:Loguru 的接口设计得非常直观,用户只需几行代码即可开始记录日志。 2. 丰富的功能:它支持多种日志级别、格式化、过滤、

By Ne0inhk
开源新势力:openGauss 在数字时代企业级开源库选型核心的竞争力

开源新势力:openGauss 在数字时代企业级开源库选型核心的竞争力

前言 在 AI 与大数据深度融合的数字化浪潮中,数据形态正从单一结构化向 “结构化 + 非结构化” 混合形态演进。而数据库作为企业数据资产的核心载体,其选型直接关系到业务连续性、数据安全性与技术前瞻性。随着开源技术成为企业级应用的主流选择,市场对数据库的需求已从单纯的 “存储与查询”,升级为对 “高性能、高安全、高可用、智能化” 综合能力的诉求。 openGauss 作为源于华为技术沉淀的企业级开源关系型数据库,凭借架构创新、技术突破与生态共建,已成为越来越多关键行业的选型之一。下面,我们就来探究 openGauss 在数据库选型中究竟具备哪些竞争力! 一、openGauss 向量数据库简介 openGauss是一款全面友好开放,携手伙伴共同打造的企业级开源关系型数据库。openGauss提供面向多核架构的极致性能、全链路的业务、数据安全、基于AI的调优和高效运维的能力。其核心架构采用 “内核 + 引擎” 的模块化设计,内核层面保留关系型数据库的 ACID 事务特性,引擎层面则集成 DataVec 向量数据库能力,形成 “结构化

By Ne0inhk
EhViewer:官方开源免费的安卓E-Hentai漫画浏览神器,官方版下载安装图文教程

EhViewer:官方开源免费的安卓E-Hentai漫画浏览神器,官方版下载安装图文教程

版本一:专业科普版(适配技术博客/二次元社区专栏) https://gitee.com/one-hundred-and-eighty-ssk/ehhttp://官方漫画项目地址 漫画项目地址:https://gitee.com/one-hundred-and-eighty-ssk/eh EhViewer是一款开源、免费、专为Android平台打造的漫画浏览工具,核心服务于E-Hentai(俗称“e站”)二次元社区,支持漫画、动漫、Cosplay等同人资源的浏览、阅读与离线下载,是二次元爱好者的移动端阅读利器。 一、先搞懂:E-Hentai与同人本的核心概念 E-Hentai是全球规模最大的同人本交流社区,主打二次元同人创作资源分享,也是圈内公认的“同人本宝库”。 很多人对“同人本(同人志)”存在误解:它并非等同于黄暴内容,而是指基于已出版作品的角色/世界观进行二次创作,或完全原创的二次元刊物——优质同人本既能满足粉丝对原作情节、角色的个性化期待,还能反向提升原创作品的热度与传播度,是二次元文化生态的重要组成部分。 二、EhViewer为何诞生? E-Hentai

By Ne0inhk