ROS(0)命令及学习资源汇总
ROS安装命令
参考:Ubuntu20.04.4安装ROS Noetic详细教程 - 知乎
安装C++和Python3
sudo apt-get install g++
sudo apt-get install python3
ROS运行小海龟仿真器
roscore | 确定ROS是否运行成功 |
rosrun turtlesim turtlesim_node | 运行小海龟仿真器 |
rosrun turtlesim turtle_teleop_key | 启动小海龟控制 |
工作空间
创建工作空间WorkSpace
mkdir -p ../catkin_ws/src
cd ../catkin_ws/src
catkin_init_workspace
编译工作空间
cd ../catkin_ws
catkin_make
catkin_make install
设置环境变量
source devel/setup.bash
检查环境变量 echo $ROS_PACKAGE_PATH
创建功能包
功能包放到src文件夹中
cd ../catkin_ws/src
catkin_create_pkg 功能包名称test_pkg 依赖std_msgs roscpp rospy
编译功能包
cd ../catkin_ws
catkin_make
source ../catkin_ws/devel/setup.bash
直接配置source
gedit ~/.bashrc
最下方添加 source ~/catkin_ws/devel/setup.bash
广播模型执行命令
执行命令
roscore
rosrun turtlesim turtlesim_node
rosrun 功能包 turtle_tf_broadcaster节点名 __name:=turtle1_tf_broadcaster /turtle1
rosrun 功能包 turtle_tf_broadcaster节点名 __name:=turtle2_tf_broadcaster /turtle2
rosrun 功能包 turtle_tf_listener
rosrun turtlesim turtle_teleop_key
学习资源
机器人命令调试方法整理
机器人use_cam功能包话题
Move_base自主导航原理
Limo机器人命令
差速运动控制
- $ roslaunch limo_base limo_base.launch 启动底盘
- $ roslaunch limo_bringup limo_teleop_keyboard.launch 启动键盘操控
- roslaunch 一次启动多个节点命令
- rosnode list 查看节点
- rosnode info /节点名 查看指定节点信息
- rostopic list 查看话题列表
- rostopic pub -r 10 /cmd_vel geometry_msgs/Twist ''linear: x y z angular:x y z
- rostopic echo /odom 订阅odom话题
机器人发布话题,走圆形
- Publisher(draw_circle)--Message(geometry_msg/Twist)--Topic(cmd_vel)--Message(geometry_msg/Twist)--Subscribe(limo_base_node)
- 移动机器人有节点(subscriber)limo_base_node订阅了Topic(cmd_cel),话题类型Message为geometry_msg/Twist
- 检测机器人的运行速度
- Publisher(limo_base_node)--Message(nav_msgs/Odometry)--Topic(odom)--Message(nav_msgs/Odometry)--Subscriber(limo_subscriber)
移动机器人分布式通信
- 编辑终端配置文件
- $ gedit ~/.bashrc
- 将机器人配置为主机
- ROS_MASTER_URI(机器人IP+默认端口11311)、ROS_HOSTNAME(当前系统主机名)、ROS_IP(当前系统的IP地址)均设置为机器人IP即可
- 将笔记本配置为从机
- ROS_MASTER_URI(设置为机器人IP)、ROS_HOSTNAME和ROS_IP设置为电脑IP
分布式控制
机器人端——$ roslaunch limo_base limo_base.launch
笔记本端——$ roslaunch limo_bringup limo_teletop_keyboard.launch
控制机器人圆周运动
机器人端——$ roslaunch limo_bringup limo_start.launch 订阅者在机器人
笔记本端——$ rosrun limo_demo draw_circle.py 发布者cmd_vel
查看机器人实时位置
机器人端——$ roslaunch limo_bringup limo_start.launch 机器人发布位姿话题
笔记本端——$ roslaunch limo_bringup limo_teletop_keyboard.launch 键盘控制
笔记本端——$ rosrun limo_demo limo_subscriber.py 笔记本订阅机器人的位姿话题
机器视觉原理
图像采集—————————图像分析—————————控制输出
光源强化检测特征 提取图像特征 I/O控制
相机镜头捕捉特征 图像特征分析 运动控制
光学图像转为数字图像 图像数据标定 可视化显示
光源-镜头、图像传感器(CCD/CMOS)、光束控制单元
光学信号转为数字信号
照明 相机(2D/3D)
安装ROS USB相机的驱动包
- sudo apt-get install ros-noetic-usb-cam
- roslaunch usb_cam usb_cam-test.launch
- rqt_image_view
三维结构光相机——RealScene
https://github.com/intel-ros/realsense/releases
安装SDK
$ mkdir build
cd build
cmake ..
make
sudo make install
安装ROS驱动
https://github.com/IntelRealSense/librealsense/releases
$ catkin_make-DCATKIN_ENABLE_TESTING=False -DCMAKE_BUILD_TYPE=Release
catkin_make install
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrcsource ~/.bashrc
点云可视化
roslaunch realsense2_camera rs_rgbd.launch
rosrun rviz rviz
通过rviz可以查看三维点云信息
安装OpenCV
$ sudo apt-get install ros-noetic-vision-opencv libopencv-dev python3-opencv
OpenCV ROS
OpenCV IpIImage <——>CvBridge<->ROS Image Message
获取HSV值
- 启动机器人的摄像头
- roslaunch astra_camera dabai_u3.launch
- 使用rqt查看图像并保存
- rqt_image_view
- 预制了hsv检测工具,检测hsv值
- roscd limo_visions/scripts/ && python hsv_test.py
物体识别与追踪
$ roslaunch limo_visions follow.launch
<launch>
<include file=$(find limo_base)/launch/limo_base.launch/> 启动机器人的底盘
<include file=$(find astra_camera)/launch/dabai_u3.launch/> 启动机器人摄像头
<node name="object_detect" pkg="limo_visions" type="object_detect.py" output="screen"/> 启动机器人跟随控制节点
<node name="follow_object" pkg="limo_visions" type="follow.py" output="screen"/>
</launch>
二维码识别与跟踪
ALVAR——虚拟现实和增强现实的跨平台开源计算机视觉库,由C++编写,提供C++接口
安装ar-track-alvar
$ sudo apt-get install ros-melodic-ar-track-alvar
创建二维码
$ rosrun ar_track_alvar createMarker -s 5 0 (5是二维码的尺寸为5cm,0为保存的内容)
启动摄像头
roslaunch artra_camera dabai_u3.launch
启动二维码识别
roslaunch limo_vision ar_code.launch
查看识别到的二维码的位姿
rostopic echo /ar_pose_marker
二维SLAM地图构建
Gmapping功能包 粒子滤波算法,将定位与建图过程分离,先定位后建图,适合小场景环境下地图信息
基于激光雷达,Rao-Blackwellized粒子滤波算法,二维栅格地图,需要机器人提供里程计信息,OpenSlam开源算法
输出地图话题
nav_msgs/OccupancyGrid
即时定位与地图建模(gmapping) 深度信息、IMU信息、里程计信息->栅格地图
Gmapping中的话题和服务
Topic订阅
名称 类型 描述
tf tf/tfMessage 用于激光雷达坐标系,基坐标系,里程计坐标系之间的变换
scan sensor_msgs/LaserScan 激光雷达扫描数据
Topic发布
map_metadata nav_msgs/MapMetaData 发布地图Meta数据
map nav_msgs/OccupancyGrid 发布地图栅格数据
~entropy std_msgs/Float64 发布机器人姿态分布熵的估计
Service
dynamic_map nav_msgs/GetMap 获取地图数据
Gmapping中的TF变换
必须的TF变换 <scan frame> -> base_link 激光雷达坐标系与基坐标系之间的变换,一般由robot_state_publisher或static_transform_publisher发布
base_link -> odom 基坐标系与里程计坐标系之间的变换,一般由里程计节点发布
发布的TF变换 map -> odom 地图坐标系与机器人历程坐标系之间的变换,估计机器人在地图中的位姿
base_link 固定在机器人的中心;odom 里程计坐标系;map 地图坐标系 表示全局定位过程中的参考系
配置gampping节点
limo_bringup/launch/limo_gampping.launch
<launch>
<node pkg="robot_pose_ekf" name="robot_pose_ekf" type="robot_pose_ekf"> 卡尔曼滤波,对里程计信息做滤波,提高里程计数据稳定性
<param name="output_frame" value="odom">
<param name="base_footprint_frame" value="base_link"/>
</node>
<node pkg="gmapping" type="slam_gmapping name="slam_gmapping" output="screen">
<param> ......
</node>
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find limo_bringup)/rviz/gmapping.rviz">
</node>
</launch>
gmapping 地图构建
roslaunch limo_bringup limo_start.launch pub_odom_tf:=false 启动机器人底盘
roslaunch limo_bringup limo_gmapping.launch 启动建图的gmapping文件
roslaunch limo_bringup limo_teletop_keyboard.launch 启动键盘控制节点
保存地图
cd /agilex_ws/limo_bringup/maps/
rosrun map_server map_saver -f map1 map_saver:地图保存节点 map1:地图文件名
Cartographer功能包 大场景
2016年10月5日,谷歌开源,基于图网络的优化SLAM方法
二维或三维条件下的定位及建图功能
设计目的是在计算资源有限的情况下,实时获取相对较高精度的地图
主要基于激光雷达
后续会支持更多传感器和机器人平台,同时不断增加新的功能
Local SLAM 建立子图(栅格地图),通过匹配算法将位置插入到子图,但会产生累计误差——生成一个一个拼图块
Global SLAM 闭环检测,消除累计误差——完成整个拼图
配置cartographer节点
limo_bringup/launch/limo_cartographer.launch
<launch>
<param name="/use_sim_time" value="false"> 设置当前使用系统的真实时间
订阅雷达数据和完成子图的创建,使用Lua脚本配置算法参数
<node name="cartographer_node" pkg="cartographer_ros" type="cartographer_node" args="-configuration_directory $(find limo_bringup) /param-configuration_basename build_map_2d.lua">
<remap from="horizontal_laser_2d" to="scan" />
</node>
子图合并为占用栅格地图,生成SLAM建图的结果
<node name="cartographer_occupancy_grid_node" pkg="cartographer_ros" type="cartographer_occupancy_grid_node" args="-resolution 0.05" />
rviz上位机,方便实时看到SLAM的过程
<node name="rviz" pkg="rviz" type="rviz" required="true" args="-d $(find limo_bringup)/rviz/cartographer.rviz" />
</launch>
cartographer
roslaunch limo_bringup limo_start.launch pub_odom_tf:=false 启动机器人底盘
roslaunch limo_bringup limo_cartographer.launch 运行cartographer地图构建算法和Rviz上位机
roslaunch limo_bringup limo_teletop_keyboard.launch 运行键盘控制节点
保存地图
rosservice call /finish_trajectory 0 调用服务,告诉cartographer结束建图
rosservice call /write_state "{filename:'${HOME}/agilex_ws/src/limo_ros/limo_bringup/maps/mymap.pbstream'}"
rosrun cartographer_ros cartographer_pbstream_to_ros_map -map_filestem=${HOME}/agilex_ws/src/limo_ros/limo_bringup/maps/mymap
-pbstream_filename=${HOME}/agilex_ws/src/limo_ros/limo_bringup/maps/mymap.pbstream -resolution=0.05
生成地图文件名称;上一步创建好的原始地图数据;生成栅格地图的分辨率,0.05表示5cm
三维SLAM地图构建
RTAB-Map功能包
具有实时约束的全局闭环检测器的RGB-D SLAM方法
基于全局贝叶斯闭环检测器
定位点创建->权值更新->贝叶斯过滤器更新->闭环假设选择->取回->转移
可单独使用RGB-D摄像头建图或和二维/三维激光雷达共同建图
地图构建 rtabmap
roslaunch limo_bringup limo_start.launch pub_odom_tf:=true
roslaunch astra_camera dabai_u3.launch
roslaunch limo_bringup limo_rtabmap_orbbec.launch 启动RTAB算法节点
roslaunch limo_bringup rtabmap_rviz.launch
roslaunch limo_bringup limo_teletop_keyboard.launch
查看建图结果
rtabmap-databaseViewer ~/.ros/rtabmap.db
移动机器人自主导航
目标点、全局最优路径、动态避障、定位粒子云、本地代价地图
原理
Goal -> AMCL -> Path Planner -> move_base -> /cmd_vel+/odom -> Base Controller -> Motor Speeds
导航目标点 AMCL全局定位算法 全局路径规划 本地规划器 运动速度 指令发给底盘,控制机器人电机按照某一速度运动
move_base功能包
Action订阅 move_base/goal move_base_msgs/MoveBaseActionGoal move_base的运动规划目标
move_base/cancel actionlib_msgs/GoalID 取消特定目标的请求
Action发布 move_base/feedback move_base_msgs/MoveBaseActionFeedback 反馈信息,含有机器人底盘的坐标
move_base/status actionlib_msgs/GoalStatusArray 发送到move_base的目标状态信息
move_base/result move_base_msgs/MoveBaseActionResult 此处move_base操作的结果为空
Topic订阅 move_base_simple/goal geometry_msgs/PoseStamped 为不需要追踪目标执行状态的用户,提供一个非action接口
Topic发布 cmd_vel geometry_msgs/Twist 输出到机器人底盘的速度命令
Service ~make_plan nav_msgs/GetPlan 允许用户从move_base获取给定目标的路径规划,但不会执行该路径规划
~clear_unknown_space std_srvs/Empty 允许用户直接清除机器人周围的未知空间。适合于costmap停止很长时间后,在一个全新环境中重新启动时使用
~clear_costmaps std_srvs/Empty 允许用户命令move_base节点清除costmap中的障碍。这可能会导致机器人撞上障碍物,请谨慎使用
蒙特卡罗定位方法
二维环境定位
针对已有地图使用粒子滤波器跟踪一个机器人的姿态
环境信息(Map)传感器数据(Scan)航程信息(Odom)初始位姿(Initial Pose)->运动模型 传感器模型 蒙特卡洛航位推算 采用(重采样)算法 -> 偏航校准(TF)粒子分布(Particle Cloud)位姿优化(Filtered Pose)
移动机器人差速导航
roslaunch limo_bringup limo_start.launch pub_odom_tf:=false
roslaunch limo_bringup limo_navigation_diff.launch
全向导航
roslaunch limo_bringup limo_start.launch pub_odom_tf:=false
roslaunch limo_bringup limo_navigation_mcnamu.launch
阿克曼导航
roslaunch limo_bringup limo_start.launch pub_odom_tf:=false
roslaunch limo_bringup limo_navigation_ackerman.launch
launch文件中包含:里程计滤波节点、amcl定位节点、map_server地图服务器节点、move_base导航节点、rivz可视化节点
相关文章:

ROS(0)命令及学习资源汇总
ROS安装命令 参考:Ubuntu20.04.4安装ROS Noetic详细教程 - 知乎 安装C和Python3 sudo apt-get install g sudo apt-get install python3 ROS运行小海龟仿真器 roscore确定ROS是否运行成功rosrun turtlesim turtlesim_node运行小海龟仿真器rosrun turtlesim turtle_…...

NodeMCU ESP8266开发流程详解(图文并茂)
文章目录 整体架构打开软件setuploop 连接开发板CP2102版本CH340版本 下载结论 整体架构 NodeMCU ESP8266基于Arduino IDE的开发相对来说还是比较容易上手的,我们基本需要以下几个东西; 一台安装好Arduino IDE的PC,并且已经部署环境&#x…...

【最终版】tkinter+matplotlib实现一个强大的绘图系统
文章目录 辅助坐标轴功能实现代码优化源代码 Python绘图系统: 前置源码: Python打造动态绘图系统📈一 三维绘图系统 📈二 多图绘制系统📈三 坐 标 轴 定 制📈四 定制绘图风格 📈五 数据生成导入…...

Postman使用实例
Postman使用实例 实体类Emp package com.example.springboot_postman.pojo;import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import javax.persistence.*; import j…...
【ES的优势和原理及分布式开发的好处与坏处】
文章目录 ES的优势及分布式开发的好处1.ES的优势1.1 优势概述1.2 相关问题1)为什么需要 Elasticsearch?MySQL 不行吗?2)SQL检索的问题:3)ES检索快的原理 2.分布式开发的好处与坏处 ES的优势及分布式开发的好…...
Autosar诊断实战系列23-CanTp半/全双工及相关工程问题思考
本文框架 前言1. CanTp半/全双工基本介绍1.1 差异比较1.2 不同模式下可能发生场景分析1.2.1 当CanTp正在发送1.2.2 当CanTp正在接收2. 相关工程问题思考前言 在本系列笔者将结合工作中对诊断实战部分的应用经验进一步介绍常用UDS服务的进一步探讨及开发中注意事项, Dem/Dcm/C…...

【Pandas】数据分组groupby
本文目标: 应用groupby 进行分组对分组数据进行聚合,转换和过滤应用自定义函数处理分组之后的数据 文章目录 1. 数据聚合1.1 单变量分组聚合1.2 Pandas内置聚合方法1.3 聚合方法使用Numpy的聚合方法自定义方法同时计算多种特征向agg/aggregate传入字典 2. 数据转换…...

【图像处理GIU】图像分割(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

Java中的锁与锁优化技术
文章目录 自旋锁与自适应自旋锁消除锁粗化轻量级锁偏向锁重量级锁 自旋锁与自适应自旋 自旋锁是一种锁的实现机制,其核心思想是当一个线程尝试获取锁时,如果锁已经被其他线程持有,那么这个线程会在一个循环中不断地检查锁是否被释放…...

布局与打包
属性栏直接输入值,比代码更直观方便。 打包:...
UVa11324 - The Largest Clique
Online Judge 题目大意:有一张n个点m条边的图,现对于每一个点u,建立一条边连接它和所有它能到达的点,问满足所有点之间都有边的分量的大小最大是多少 0<n<1000;0<m<50000 思路:根据建新图的规则可知&am…...

【Linux】TCP的服务端(守护进程) + 客户端
文章目录 📖 前言1. 服务端基本结构1.1 类成员变量:1.2 头文件1.3 初始化:1.3 - 1 全双工与半双工1.3 - 2 inet_aton1.3 - 3 listen 2. 服务端运行接口2.1 accept:2.2 服务接口: 3. 客户端3.1 connect:3.2 …...
1.7. 找出数组的第 K 大和原理及C++实现
题目 给你一个整数数组 nums 和一个 正 整数 k 。你可以选择数组的任一 子序列 并且对其全部元素求和。 数组的 第 k 大和 定义为:可以获得的第 k 个 最大 子序列和(子序列和允许出现重复) 返回数组的 第 k 大和 。 子序列是一个可以由其他数…...

基于微信小程序的付费自习室
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 需求分析3.1用户需求分析3.1.1 学生用户3.1.3 管理员用户 4 数据库设计4.4.1 E…...

纪念在CSDN的2048天
时间真快~...

云原生Kubernetes:简化K8S应用部署工具Helm
目录 一、理论 1.HELM 2.部署HELM2 3.部署HELM3 二、实验 1.部署 HELM2 2.部署HELM3 三、问题 1.api版本过期 2.helm初始化报错 3.pod状态为ImagePullBackOff 4.helm 命令显示 no repositories to show 的错误 5.Helm安装报错 6.git命令报错 7.CentOS 7 下git c…...

qml保姆级教程五:视图组件
💂 个人主页:pp不会算法v 🤟 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 QML系列教程 QML教程一:布局组件 文章目录 列表视图ListVi…...
2310d编译不过
struct A {this(int[] data) safe { a data; }int[] a; }void main() safe {int[3] test [1, 2, 3];A a A(test); }应该给data参数加上return scope.或让构造器为模板参数来推导,否则,构造器可以把栈分配切片赋值给全局变量....

CleanMyMac X4.14.1最新版本下载
CleanMyMac X是一个功能强大的Mac清理软件,它的设计理念是提供多个模块,包括垃圾清理、安全保护、速度优化、应用程序管理和文档管理粉碎等,以满足用户的不同需求。软件的界面简洁直观,让用户能够轻松进行日常的清理操作。 使用C…...

芯驰D9评测(3)--建立开发环境
1. 建立交叉编译链接环境 官网下载的SDK包中就有交叉工具链,米尔提供的这个 SDK 中除了包含各种源代码外还提供了必要的交叉工具链,可以直接用于编译应用程序等。 用户可以直接使用次交叉编译工具链来建立一个独立的开发环境,可单独编译…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...