做网站前台和后台是什么,想在自己的网站做支付,互联网编程技术,wordpress网站 添加微信支付1. 为什么要在旭日x3上折腾Navigation2#xff1f; 如果你手头有一块地平线旭日x3开发板#xff0c;又对机器人自主导航感兴趣#xff0c;那你肯定想过让它自己“走”起来。我之前也是这么想的#xff0c;但真动手的时候#xff0c;发现网上大部分教程都是针对x86电脑的&a…1. 为什么要在旭日x3上折腾Navigation2如果你手头有一块地平线旭日x3开发板又对机器人自主导航感兴趣那你肯定想过让它自己“走”起来。我之前也是这么想的但真动手的时候发现网上大部分教程都是针对x86电脑的直接照搬到ARM架构的旭日x3上十有八九会踩坑。不是编译报错就是依赖库找不到跑起来也卡得不行。所以我花了些时间把在旭日x3上从零部署ROS2 Foxy和Navigation2的完整流程摸了一遍总结出了这套混合部署方案。说白了就是一部分用现成的二进制包省事另一部分自己从源码编译针对ARM优化既保证了稳定性又能榨干这块开发板的性能。旭日x3板子性能不错但毕竟是嵌入式设备资源有限。直接全部源码编译光是下载和编译依赖就能耗上大半天还可能因为内存不足编译失败。全部用二进制包呢有些包版本可能不对或者没有为ARM架构做优化导航性能上不去。我实测下来这套“二进制源码”的混搭方案是最稳的从系统准备到让机器人跑出第一个导航路径顺利的话一两个小时就能搞定。这篇文章我就带你一步步走通把过程中容易卡住的地方和优化参数都交代清楚。2. 基础环境搭建为ROS2 Foxy铺路在开始安装Navigation2之前我们必须先把它的“地基”——ROS2 Foxy环境给搭结实了。旭日x3板子默认的系统可能是Ubuntu 20.04 Server版很多东西需要我们自己装。2.1 系统准备与ROS2 Foxy安装首先确保你的系统是Ubuntu 20.04 Focal。打开终端先更新一下软件源列表这个习惯能避免很多后续的版本冲突问题。sudo apt update sudo apt upgrade -y接下来安装ROS2 Foxy。官方提供了二进制安装方式这对ARM设备来说是最省心的。我们设置好软件源然后直接安装核心的ROS2包。注意这里我们选择安装ros-foxy-desktop它包含了ROS基础、GUI工具和常用的功能包对于后续调试导航非常有帮助。# 设置软件源 sudo apt install software-properties-common -y 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 echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null # 安装ROS2 Foxy桌面版 sudo apt update sudo apt install ros-foxy-desktop -y安装完成后别忘了把ROS2的环境变量加到你的bashrc里这样每次打开终端都不用再手动source了。echo source /opt/ros/foxy/setup.bash ~/.bashrc source ~/.bashrc现在你可以测试一下ROS2核心是否安装成功。打开第一个终端运行ros2 run demo_nodes_cpp talker再打开第二个终端运行ros2 run demo_nodes_py listener如果能看到talker在发布消息listener在接收并打印恭喜你ROS2 Foxy的基础环境已经就绪了。这个步骤虽然简单但却是后面所有工作的基石一定要确保测试通过。2.2 关键依赖项的安装与配置有了ROS2我们还需要为Navigation2准备一些额外的依赖。Navigation2依赖一些数学计算库和通信中间件在ARM平台上有些包可能需要特别处理。首先安装一些通用的开发工具和编译依赖sudo apt install -y build-essential cmake git libbullet-dev python3-colcon-common-extensions python3-flake8 python3-pip python3-pytest-cov python3-rosdep python3-setuptools python3-vcstool wget接下来是重头戏——初始化rosdep。这个工具用于自动安装工作空间中包的依赖。在旭日x3上直接运行sudo rosdep init和rosdep update很可能会因为网络问题失败。我踩过这个坑后来发现一个很有效的方法修改rosdep的源。我们先安装rosdepsudo apt install python3-rosdep -y然后在运行rosdep init之前我们先备份并替换掉它默认的源文件。创建一个新的配置文件内容使用国内可访问的源sudo sh -c echo yaml https://ghproxy.com/https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml osx-homebrew yaml https://ghproxy.com/https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml yaml https://ghproxy.com/https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml yaml https://ghproxy.com/https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml gbpdistro https://ghproxy.com/https://raw.githubusercontent.com/ros/rosdistro/master/releases/foxy.yaml foxy # 其他distro按需添加 /etc/ros/rosdep/sources.list.d/20-default.list现在再执行初始化和更新速度会快很多sudo rosdep init rosdep update这一步完成后你的旭日x3就已经具备了编译复杂ROS2包的基本能力。这些依赖看起来琐碎但少装一个都可能让后面的编译过程错误百出务必耐心完成。3. Navigation2的混合部署实战环境准备好我们就可以开始安装Navigation2了。就像开头说的纯二进制安装简单但可能不优化纯源码编译又太耗时耗力。我的方案是核心导航算法和关键包从源码编译确保针对ARM优化而一些通用的工具、仿真和机器人模型则直接安装二进制包。这样既能控制编译时间又能保证导航栈的运行效率。3.1 二进制安装部分快速搭建基础框架我们先通过apt命令把能直接安装的稳定部分搞定。这主要包括Navigation2的核心功能包、启动工具以及一个常用的测试机器人模型这里用TurtleBot3举例。打开终端执行以下命令sudo apt install ros-foxy-navigation2 ros-foxy-nav2-bringup -y这条命令会安装Navigation2的主要二进制包和启动相关文件。接下来我们安装TurtleBot3的仿真和描述文件。这里有个小细节在Ubuntu 20.04上通配符*的解析方式有变化直接用ros-foxy-turtlebot3*可能会报错。我推荐使用下面这个更稳妥的命令sudo apt install ~ros-foxy-turtlebot3-.* -y这个命令会安装所有以ros-foxy-turtlebot3-开头的包包括机器人模型、Gazebo仿真节点等。安装完成后你可以快速验证一下基础功能是否正常。尝试启动一个简单的导航测试节点ros2 run nav2_bringup bringup如果系统没有报错提示你缺少某些参数文件那是正常的因为这只是一个启动框架。我们更关心的是这些二进制包提供的库文件和接口是否已经就位。通过二进制安装我们瞬间就获得了Navigation2的运行时环境省去了大量编译时间这是混合部署策略带来的第一个好处。3.2 源码编译部分针对ARM架构的深度优化二进制包提供了“能用”的基础但要“好用”尤其是想在旭日x3上获得更流畅的建图和路径规划体验我们需要从源码编译一些关键组件。源码编译允许我们针对ARM架构进行优化并可以灵活地调整一些编译选项。首先为Navigation2的源码创建一个独立的工作空间。这样做的好处是隔离性好不会污染你其他的ROS2项目。mkdir -p ~/nav2_ws/src cd ~/nav2_ws/src然后从GitHub上克隆Navigation2的foxy开发分支。这个分支的代码是与ROS2 Foxy版本兼容的。git clone https://github.com/ros-planning/navigation2.git --branch ros-foxy-devel克隆完成后退回工作空间根目录使用rosdep自动安装所有缺失的依赖。这是至关重要的一步能解决大部分“找不到头文件”或“链接库缺失”的错误。cd ~/nav2_ws rosdep install -y -r -q --from-paths src --ignore-src --rosdistro foxyrosdep会分析src目录下所有包的package.xml文件然后自动安装系统依赖。这个过程需要联网如果之前配置好了源速度会很快。完成后就可以开始编译了。对于旭日x3这种四核A53的板子我建议使用colcon进行编译并开启并行编译以加快速度colcon build --symlink-install --parallel-workers 2这里有几个参数解释一下--symlink-install会创建符号链接而不是直接复制文件这样你在源码目录修改后安装目录会自动更新方便开发调试。--parallel-workers 2将并行编译的线程数设为2对于旭日x3的4核CPU来说设为2可以避免编译时内存不足导致卡死是我实测比较稳定的值。编译过程可能需要20到40分钟取决于网络和板子的状态。编译成功后记得source一下当前工作空间的安装文件source ~/nav2_ws/install/setup.bash为了让这个环境永久生效同样可以把这行命令加到你的~/.bashrc文件里放在ROS2系统环境变量的下一行。这样你就拥有了一个针对旭日x3优化过的Navigation2源码版本。后续如果你想修改算法参数或者调试代码直接在这个工作空间里操作即可。4. 参数调优与性能提升技巧环境搭好了包也装好了但直接跑默认配置在旭日x3上可能会感觉反应迟钝或者规划路径不够平滑。这是因为默认参数是针对性能更强的x86平台设置的。下面我分享几个针对ARM平台特别是旭日x3的调优经验主要围绕降低计算负载和提高实时性两个目标。4.1 关键算法节点的参数调整Navigation2的核心是几个算法节点比如controller_server控制器服务器、planner_server规划器服务器和bt_navigator行为树导航器。在资源有限的嵌入式设备上调整它们的运行频率和算法复杂度立竿见影。首先找到你的参数配置文件。如果你用的是nav2_bringup包里的默认配置它通常位于/opt/ros/foxy/share/nav2_bringup/params目录下。我建议把这些配置文件复制到你的用户目录进行修改避免污染系统文件。mkdir -p ~/nav2_params cp /opt/ros/foxy/share/nav2_bringup/params/nav2_params.yaml ~/nav2_params/用文本编辑器打开这个nav2_params.yaml文件。我们重点关注以下几项全局代价地图更新频率默认的update_frequency和publish_frequency可能在3.0到5.0 Hz。对于旭日x3如果同时运行SLAM可以适当降低到1.0-2.0 Hz能显著减少CPU占用。global_costmap: global_frame: map robot_base_frame: base_link update_frequency: 1.0 publish_frequency: 1.0 width: 10.0 height: 10.0 resolution: 0.05同样地调整local_costmap的更新频率。局部代价地图用于实时避障频率不能太低但可以从默认的5.0 Hz降到3.0 Hz在大多数场景下依然够用。规划器与控制器参数SmacPlanner和RegulatedPurePursuitController是常用的规划和控制算法。可以增加路径搜索的迭代次数限制max_iterations但减少每次迭代的复杂度或者降低max_planning_time让规划器在超时前返回一个可能次优但可用的路径这比卡死要好。planner_server: ros__parameters: expected_planner_frequency: 0.5 # 降低期望的规划器调用频率 SmacPlanner: max_iterations: 1000 # 根据性能调整 max_planning_time: 2.0 # 设置超时单位秒行为树导航器行为树bt_navigator的tick_rate定义了行为树的执行频率。默认可能是10Hz或20Hz在旭日x3上可以尝试降低到5Hz这能在几乎不影响导航逻辑判断的前提下减少不必要的调度开销。这些调整没有绝对的最优值需要你根据自己机器人的传感器数据频率和实际运行场景进行测试。一个基本原则是在保证导航功能正常不撞墙、能到达目标点的前提下尽可能降低频率和复杂度。4.2 系统层面的优化建议除了算法参数系统层面的配置也能带来不小的性能提升。旭日x3运行的是Linux系统我们可以从以下几个方面入手CPU调度策略默认的CFS调度器可能不适合实时任务。你可以尝试为关键的ROS2节点如controller_server设置更高的静态优先级。这需要用到chrt命令但操作需谨慎不当的设置可能导致系统不稳定。一个更安全的方法是使用taskset将导航相关的进程绑定到特定的CPU核心上避免核心间的切换开销。# 启动节点后查找其PID然后绑定到CPU0和CPU1 taskset -cp 0,1 PID内存与Swap确保系统有足够的可用内存。如果物理内存紧张可以适当增加swap空间。虽然swap速度慢但能防止在编译或运行大型代价地图时因OOM内存溢出而被系统杀死。# 创建一个4GB的swap文件如果已有可跳过 sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 使其永久生效可写入/etc/fstabROS2通信优化ROS2默认的DDS中间件是Fast DDS。在嵌入式平台上可以尝试切换为资源占用更少的Cyclone DDS。安装并设置为默认的RMW实现有时能降低通信延迟和CPU使用率。sudo apt install ros-foxy-rmw-cyclonedds-cpp export RMW_IMPLEMENTATIONrmw_cyclonedds_cpp这些系统级优化是锦上添花建议你在算法参数调优之后再进行。每次只改变一个变量然后测试导航效果和系统负载可以用htop命令观察这样才能准确知道是哪个改动带来了提升。5. 实战测试让TurtleBot3在仿真中动起来理论说再多不如实际跑一遍。我们用前面安装好的TurtleBot3仿真环境配合我们部署好的Navigation2完成一个完整的建图与导航流程。这个测试不需要真实的机器人在旭日x3板子上就能全部完成非常适合验证我们的部署是否成功。5.1 启动仿真环境与SLAM建图首先我们启动一个包含TurtleBot3机器人的Gazebo仿真世界。打开第一个终端运行export TURTLEBOT3_MODELwaffle_pi ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py这个命令会启动Gazebo仿真器并在一个简单的室内环境中加载一个TurtleBot3 Waffle Pi模型。如果一切正常你应该能看到Gazebo的图形界面如果你在板子上装了桌面环境的话里面有一个小车。接下来启动SLAM节点进行建图。打开第二个终端export TURTLEBOT3_MODELwaffle_pi ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:True这里我们使用Cartographer作为SLAM算法。然后打开第三个终端启动键盘遥控节点用来控制机器人移动扫描整个环境export TURTLEBOT3_MODELwaffle_pi ros2 run turtlebot3_teleop teleop_keyboard按照终端里的提示使用键盘上的W、A、S、D键控制机器人前后左右移动尽量让机器人走遍整个地图的每个角落。同时你可以在第四个终端启动RVIZ2来可视化建图过程ros2 launch turtlebot3_cartographer rviz2.launch.py在RVIZ2中添加Map显示并选择/map话题。你应该能看到随着机器人移动地图被逐渐构建出来。当觉得地图构建得比较完整时就可以保存地图了。停止键盘控制节点在它的终端里按CtrlC然后运行ros2 run nav2_map_server map_saver_cli -f ~/my_first_map这会在你的家目录下生成my_first_map.pgm地图图像和my_first_map.yaml地图配置文件两个文件。5.2 加载地图并执行自主导航建图完成后我们关闭SLAM相关节点在之前的终端里按CtrlC开始测试导航功能。首先启动仿真世界和导航栈但这次我们使用之前保存的地图。打开一个新的终端依次启动# 终端1启动仿真环境 export TURTLEBOT3_MODELwaffle_pi ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py # 终端2启动Navigation2并指定地图文件 export TURTLEBOT3_MODELwaffle_pi ros2 launch nav2_bringup bringup_launch.py use_sim_time:True map:~/my_first_map.yaml # 终端3启动RVIZ2进行导航可视化 ros2 launch nav2_bringup rviz_launch.py在RVIZ2界面中你需要先点击顶部的“2D Pose Estimate”按钮然后在地图上点击并拖拽给出机器人当前在地图中的初始位置和朝向一个巨大的绿色箭头。这一步非常重要如果定位不准导航会完全失败。给出初始位姿后再点击“Navigation2 Goal”按钮在地图上任意位置点击设定一个目标点。你会看到机器人开始规划出一条从当前位置到目标点的全局路径绿色线然后沿着这条路径开始移动同时紫色的局部代价地图和红色的局部规划轨迹也会出现。如果遇到仿真中的障碍物它会自动进行局部避障。如果机器人成功规划路径并开始移动那么恭喜你旭日x3上的Navigation2导航栈已经成功部署并运行起来了这个过程涵盖了从环境启动、定位、全局规划、局部控制到避障的完整导航链条。你可以多尝试设置几个不同的目标点观察机器人的行为。如果发现规划路径很奇怪或者撞墙了可以回到第四节的参数调优部分针对性地调整代价地图的膨胀半径、规划器的权重等参数。