ITPub博客

首页 > 应用开发 > IT综合 > 基于Jetson Orin Nano的激光雷达SLAM系统集成与实践

基于Jetson Orin Nano的激光雷达SLAM系统集成与实践

投稿 IT综合 作者:bhluo 时间:2026-01-23 11:21:10 0 删除 编辑

基于Jetson Orin Nano的激光雷达SLAM系统集成与实践


在嵌入式AI平台上实现激光SLAM与无人机控制是当前机器人研究的热点。本文介绍在Jetson Orin Nano平台上,结合Ubuntu 22.04、ROS2、宇树L2激光雷达和FAST-LIO2算法,实现PX4飞控定点模式的完整方案。


## 系统环境与基础配置


Jetson Orin Nano预装Ubuntu 22.04系统,首先需要配置基础开发环境。确保系统已更新并安装必要组件:


```bash

# 更新系统软件包

sudo apt update

sudo apt upgrade -y


# 安装基础开发工具

sudo apt install -y build-essential cmake git curl wget

sudo apt install -y libeigen3-dev libboost-all-dev


# 配置USB设备权限(激光雷达需要)

sudo usermod -a -G dialout $USER

sudo usermod -a -G tty $USER

```


由于Jetson平台采用ARM架构,部分库需要源码编译。安装PCL点云库:


```bash

# 安装PCL依赖

sudo apt install -y libflann-dev libvtk9-dev libqhull-dev

sudo apt install -y libproj-dev libpcap-dev


# 编译安装PCL

cd ~

git clone https://github.com/PointCloudLibrary/pcl.git

cd pcl && mkdir build && cd build

cmake -DCMAKE_BUILD_TYPE=Release ..

make -j6

sudo make install

```


## ROS2 Humble安装与配置


Jetson Orin Nano推荐使用ROS2 Humble版本,这是首 个支持ARM64的长期支持版本:


```bash

# 设置区域设置

sudo locale-gen en_US en_US.UTF-8

sudo update-locale LC_ALL=en_US.UTF-8.UTF-8

export.UTF-8


# 添加ROS2仓库

sudo apt install software-properties-common

sudo add-apt-repository universe

sudo apt update && sudo apt install curl -y

sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg


# 安装ROS2基础包

sudo apt update

sudo apt install ros-humble-desktop

sudo apt install ros-dev-tools


# 配置环境变量

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc

source ~/.bashrc

```


## 宇树L2激光雷达驱动集成


宇树L2激光雷达需要通过ROS2驱动进行数据采集。创建工作空间并编译驱动:


```bash

# 创建ROS2工作空间

mkdir -p ~/ros2_ws/src

cd ~/ros2_ws/src


# 克隆激光雷达驱动

git clone https://github.com/YUSHU-LIDAR/YUSHU_L2_ROS2_Driver.git


# 安装依赖

sudo apt install -y ros-humble-tf2 ros-humble-tf2-ros

sudo apt install -y ros-humble-sensor-msgs ros-humble-pcl-ros


# 编译工作空间

cd ~/ros2_ws

colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release


# 配置环境

echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc

source ~/.bashrc

```


创建激光雷达启动配置文件`~/ros2_ws/src/YUSHU_L2_ROS2_Driver/config/lidar_params.yaml`:


```yaml

lidar:

  device_ip: "192.168.1.100"

  data_port: 2368

  firmware_port: 2369

  group_list: "0,1"

  pcap_path: ""

  pcap_speed: 1.0


publish:

  point_cloud_topic: "/points_raw"

  scan_topic: "/scan"

  frame_id: "laser_link"

  organized_cloud: false


sensor:

  min_range: 0.1

  max_range: 100.0

  horizontal_resolution: 0.4

  vertical_resolution: 0.33

```


启动激光雷达节点进行测试:


```bash

# 启动激光雷达驱动

ros2 launch yushu_l2_driver lidar.launch.py


# 新终端查看点云数据

ros2 topic echo /points_raw --field data --once | head -20

```


## FAST-LIO2算法部署


FAST-LIO2是高效的激光惯性里程计算法,适合嵌入式平台。编译安装过程需要特别注意Jetson平台的优化:


```bash

# 安装依赖

sudo apt install -y ros-humble-navigation2 ros-humble-nav2-bringup

sudo apt install -y libomp-dev


# 下载FAST-LIO2

cd ~/ros2_ws/src

git clone https://github.com/h  ku-mars/FAST_LIO.git


# 修改CMakeLists以适应Jetson平台

cd FAST_LIO

# 编辑CMakeLists.txt,添加ARM优化标志

# 在add_definitions中添加:-march=armv8-a+crypto -mtune=cortex-a78

```


创建FAST-LIO2配置文件`~/ros2_ws/src/FAST_LIO/config/YUSHU_L2.yaml`:


```yaml

common:

  lid_topic: "/points_raw"

  imu_topic: "/imu/data"

  time_sync_en: false

  extrinsic_T: [0.0, 0.0, 0.0]

  extrinsic_R: [1.0, 0.0, 0.0,

                0.0, 1.0, 0.0,

                0.0, 0.0, 1.0]


preprocess:

  lidar_type: 2              # 宇树L2对应类型

  blind: 0.01

  point_filter_num: 1


odometry:

  fov_degree: 180

  filter_size_surf: 0.5

  filter_size_map: 0.5


map:

  frame_id: "map"

  publish_odometry: true

  publish_path: true

```


编译并测试FAST-LIO2:


```bash

# 编译工作空间

cd ~/ros2_ws

colcon build --packages-select fast_lio --cmake-args -DCMAKE_BUILD_TYPE=Release


# 启动FAST-LIO2

ros2 launch fast_lio mapping.launch.py


# 查看生成的里程计数据

ros2 topic echo /Odometry

```


## PX4飞控通信配置


建立ROS2与PX4飞控的通信链路,使用MAVROS2桥接:


```bash

# 安装MAVROS2

sudo apt install -y ros-humble-mavros ros-humble-mavros-extras


# 安装地理库数据

sudo apt install -y geographiclib-tools

sudo geographiclib-get-geoids egm96-5


# 配置MAVROS连接

mkdir -p ~/ros2_ws/src/mavros_config

```


创建MAVROS启动文件`~/ros2_ws/src/mavros_config/launch/px4.launch.py`:


```python

from launch import LaunchDescription

from launch_ros.actions import Node


def generate_launch_description():

    return LaunchDescription([

        Node(

            package='mavros',

            executable='mavros_node',

            name='mavros',

            output='screen',

            parameters=[

                {'fcu_url': 'serial:///dev/ttyACM0:921600'},

                {'tgt_system': 1},

                {'tgt_component': 1},

                {'system_id': 1},

                {'component_id': 191},

                {'plugin_allowlist': [

                    'sys_status', 'command', 'position', 'setpoint',

                    'local_position', 'global_position'

                ]}

            ]

        )

    ])

```


创建定点控制节点`~/ros2_ws/src/px4_control/src/position_hold_node.cpp`:


```cpp

#include <rclcpp/rclcpp.hpp>

#include <geometry_msgs/msg/pose_stamped.hpp>

#include <mavros_msgs/msg/state.hpp>

#include <mavros_msgs/srv/command_bool.hpp>

#include <mavros_msgs/srv/set_mode.hpp>


class PositionHoldNode : public rclcpp::Node {

public:

    PositionHoldNode() : Node("position_hold_node") {

        // 订阅本地位置

        local_pose_sub_ = create_subscription<geometry_msgs::msg::PoseStamped>(

            "/mavros/local_position/pose", 10,

            std::bind(&PositionHoldNode::poseCallback, this, std::placeholders::_1));

        

        // 订阅飞控状态

        state_sub_ = create_subscription<mavros_msgs::msg::State>(

<"ted.yunruiwater.cn"><"hy.sxyicheng.cn"><"loj.jsnjz.cn"><"qwd.csxthr.com">

            "/mavros/state", 10,

            std::bind(&PositionHoldNode::stateCallback, this, std::placeholders::_1));

        

        // 服务客户端

        arm_client_ = create_client<mavros_msgs::srv::CommandBool>("/mavros/cmd/arming");

        mode_client_ = create_client<mavros_msgs::srv::SetMode>("/mavros/set_mode");

        

        timer_ = create_wall_timer(std::chrono::seconds(1),

            std::bind(&PositionHoldNode::controlLoop, this));

    }

    

private:

    void poseCallback(const geometry_msgs::msg::PoseStamped::SharedPtr msg) {

        current_pose_ = *msg;

    }

    

    void stateCallback(const mavros_msgs::msg::State::SharedPtr msg) {

        current_state_ = *msg;

    }

    

    void controlLoop() {

        if (!current_state_.connected) {

            RCLCPP_INFO(get_logger(), "等待飞控连接...");

            return;

        }

        

        // 切换到定点模式

        if (current_state_.mode != "OFFBOARD") {

            setMode("OFFBOARD");

        }

        

        // 解锁电机

        if (!current_state_.armed) {

            armDrone(true);

        }

        

        // 保持当前位置

        maintainPosition();

    }

    

    void setMode(const std::string& mode) {

        auto request = std::make_shared<mavros_msgs::srv::SetMode::Request>();

        request->custom_mode = mode;

        mode_client_->async_send_request(request);

    }

    

    void armDrone(bool arm) {

        auto request = std::make_shared<mavros_msgs::srv::CommandBool::Request>();

        request->value = arm;

        arm_client_->async_send_request(request);

    }

    

    void maintainPosition() {

        // 位置保持逻辑

        // 基于FAST-LIO2的定位数据调整

        RCLCPP_DEBUG(get_logger(), "维持位置: x=%.2f, y=%.2f, z=%.2f",

                     current_pose_.pose.position.x,

                     current_pose_.pose.position.y,

                     current_pose_.pose.position.z);

    }

    

    rclcpp::Subscription<geometry_msgs::msg::PoseStamped>::SharedPtr local_pose_sub_;

    rclcpp::Subscription<mavros_msgs::msg::State>::SharedPtr state_sub_;

    rclcpp::Client<mavros_msgs::srv::CommandBool>::SharedPtr arm_client_;

    rclcpp::Client<mavros_msgs::srv::SetMode>::SharedPtr mode_client_;

    rclcpp::TimerBase::SharedPtr timer_;

    

    geometry_msgs::msg::PoseStamped current_pose_;

    mavros_msgs::msg::State current_state_;

};


int main(int argc, char** argv) {

    rclcpp::init(argc, argv);

    rclcpp::spin(std::make_shared<PositionHoldNode>());

    rclcpp::shutdown();

    return 0;

}

```


## 系统集成与测试


创建完整的系统启动脚本`~/ros2_ws/launch/full_system.launch.py`:


```python

from launch import LaunchDescription

from launch.actions import IncludeLaunchDescription, ExecuteProcess

from launch.launch_description_sources import PythonLaunchDescriptionSource

from launch.substitutions import PathJoinSubstitution

from launch_ros.substitutions import FindPackageShare

<"kpo.zhaiLimao.com"><"wap.yunruiwater.cn"><"share.sxyicheng.cn">


def generate_launch_description():

    return LaunchDescription([

        # 启动激光雷达

        IncludeLaunchDescription(

            PythonLaunchDescriptionSource([

                PathJoinSubstitution([

                    FindPackageShare('yushu_l2_driver'),

                    'launch/lidar.launch.py'

                ])

            ])

        ),

        

        # 启动FAST-LIO2

        IncludeLaunchDescription(

            PythonLaunchDescriptionSource([

                PathJoinSubstitution([

                    FindPackageShare('fast_lio'),

                    'launch/mapping.launch.py'

                ])

            ]),

            launch_arguments={

                'config_path': PathJoinSubstitution([

                    FindPackageShare('fast_lio'),

                    'config/YUSHU_L2.yaml'

                ])

            }.items()

        ),

        

        # 启动MAVROS

        IncludeLaunchDescription(

            PythonLaunchDescriptionSource([

                PathJoinSubstitution([

                    FindPackageShare('mavros_config'),

                    'launch/px4.launch.py'

                ])

            ])

        ),

        

        # 启动定点控制节点

        ExecuteProcess(

            cmd=['ros2', 'run', 'px4_control', 'position_hold_node'],

            output='screen'

        )

    ])

```


测试整个系统:


```bash

# 启动完整系统

ros2 launch full_system.launch.py


# 查看所有活跃话题

ros2 topic list


# 查看FAST-LIO2定位精度

ros2 topic echo /Odometry --field pose.pose.position

```


## 性能优化注意事项


针对Jetson Orin Nano平台进行性能优化:


```bash

# 设置CPU性能模式

sudo nvpmodel -m 0  # 最大性能模式

sudo jetson_clocks  # 启用最大时钟频率


# 监控系统资源

sudo apt install -y htop

htop


# 优化ROS2通信

export ROS_DOMAIN_ID=10  # 减少网络冲突

export RCUTILS_CONSOLE_OUTPUT_FORMAT='[{severity} {time}] [{name}]: {message}'

```


通过上述配置,在Jetson Orin Nano平台上成功集成了激光雷达SLAM与无人机控制系统。该系统能够实时处理激光点云数据,通过FAST-LIO2算法提供精准定位,并控制PX4飞控实现稳定的定点悬停功能。这种方案展示了嵌入式AI平台在自主机器人系统中的实际应用潜力。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19545/viewspace-3108757/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-11-01

  • 博文量
    895
  • 访问量
    934688