☰
AirSim ROS 封装包(airsim_ros_pkgs)完全指南:从环境搭建、ROS API 到 PD 位置控制
2026/10/10 1:45:36 网站建设 项目流程
  • 自动驾驶
  • 人工智能
  • 深度学习
  • 强化学习
  • 计算机视觉
  • 科研

【免费下载链接】AirSim

Open source simulator for autonomous vehicles built on Unreal Engine / Unity, from Microsoft AI & Research

项目地址:https://gitcode.com/gh_mirrors/ai/AirSim
点击查看免费下载

AirSim 官方在ros/src/airsim_ros_pkgs目录下提供了一个基于 AirSim C++ 客户端库的 ROS 封装包,它让 ROS 1(Kinetic / Melodic / Noetic)程序可以像操作真实无人机一样订阅 AirSim 中的里程计、传感器与图像数据,并发布速度指令、调用起飞/降落/重置等服务,从而无缝衔接基于 ROS 的自主飞行算法。本文以仓库中的官方文档 docs/airsim_ros_pkgs.md 为主体,结合 airsim_ros_pkgs 包 的源码、launch 文件与消息定义,完整讲解环境搭建、编译运行、两个 ROS 节点的完整 API 与 PD 位置控制器原理,读完你就能在自己的机器上跑通 AirSim + ROS 的仿真闭环。

说明:ros/src/airsim_ros_pkgs/README.md仅是跳转占位页,本仓库中该文档的完整正文位于 docs/airsim_ros_pkgs.md,下文内容即以其为骨架展开。

一、包结构总览:两个节点与三类接口

从仓库目录看,该包是一个标准的 catkin 包(package.xml,名称为airsim_ros_pkgs,MIT 许可),其功能可概括为:

  • 一个 ROS 封装节点airsim_node:封装 AirSim 的MultirotorRpcLibClient/CarRpcLibClient(见 airsim_ros_wrapper.h),负责把 AirSim 中的状态、传感器、图像、LIDAR 数据发布到 ROS 话题,并把 ROS 话题上的控制指令下发到 AirSim。
  • 一个简单的 PD 位置控制器节点pd_position_controller_simple_node:监听里程计与 GPS 原点,通过服务接收位置目标,输出速度指令(VelCmd)驱动airsim_node。
  • 消息与服务定义:9 个自定义 msg(msg 目录)与 7 个自定义 srv(srv 目录),在 CMakeLists.txt 中通过add_message_files/add_service_files注册。

从源码 airsim_node.cpp 可以看到入口逻辑:读取私有参数host_ip(默认localhost),构造AirsimROSWrapper,然后按需启动图像与 LIDAR 的异步回调队列 spinner,最后ros::spin()。

二、环境准备:支持平台与依赖安装

官方文档明确说明以下步骤面向Linux;如果 AirSim 运行在 Windows 上,可以在WSL1/WSL2中运行 ROS 封装(详见后文“Windows10 + WSL 方案”);如果不方便在宿主机安装 ROS,还可以用 Docker(见“Docker 方案”)。

前提:GCC 版本 >= 8(用gcc --version检查)。如果默认 GCC 低于 8,需要安装并显式指定:

sudo apt-get install gcc-8 g++-8 gcc-8 --version # 验证安装

按 Ubuntu 版本安装 ROS 及依赖包(核心依赖是 tf2 sensor/geometry 与 mavros 系列):

  • Ubuntu 16.04 + ROS Kinetic
    sudo apt-get install ros-kinetic-tf2-sensor-msgs ros-kinetic-tf2-geometry-msgs ros-kinetic-mavros*
  • Ubuntu 18.04 + ROS Melodic
    sudo apt-get install ros-melodic-tf2-sensor-msgs ros-melodic-tf2-geometry-msgs ros-melodic-mavros*
  • Ubuntu 20.04 + ROS Noetic
    sudo apt-get install ros-noetic-tf2-sensor-msgs ros-noetic-tf2-geometry-msgs ros-noetic-mavros*

安装 catkin_tools(编译工作区用):

sudo apt-get install python-catkin-tools # 或 pip 安装 pip install catkin_tools # Ubuntu 20.04 上推荐从源码安装 pip install "git+https://github.com/catkin/catkin_tools.git#egg=catkin_tools"

从 package.xml 的依赖声明看,该包还依赖cv_bridge、image_transport、geographic_msgs、nav_msgs、sensor_msgs、geometry_msgs、std_srvs、tf2*、mavros_msgs以及运行时依赖joy(手柄控制),这些会在 catkin 编译时自动校验。

三、编译:先编 AirSim,再编 ROS 工作区

第一步:编译 AirSim 本体(封装包直接以源码方式链接 AirSim 的AirLib、MavLinkCom与rpclib,见 CMakeLists.txt 中的add_subdirectory):

git clone https://github.com/Microsoft/AirSim.git cd AirSim ./setup.sh ./build.sh

第二步:把 ROS 环境变量写入~/.bashrc(把melodic换成你实际的 ROS 版本名):

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

第三步:进入ros目录编译工作区:

cd ros catkin build # 或 catkin_make

注意:如果默认 GCC 不是 8 或更高版本,编译会失败,此时需显式指定 gcc-8/g++-8:

catkin build -DCMAKE_C_COMPILER=gcc-8 -DCMAKE_CXX_COMPILER=g++-8

编译产物为两个可执行节点airsim_node与pd_position_controller_simple_node,以及共享库airsim_ros、pd_position_controller_simple、airsim_settings_parser,这些都在 CMakeLists.txt 中通过add_executable/add_library/install声明。

四、运行:启动封装节点与 RViz

确保 AirSim 仿真环境(Unreal/Unity 端)已启动后,运行:

source devel/setup.bash roslaunch airsim_ros_pkgs airsim_node.launch roslaunch airsim_ros_pkgs rviz.launch
  • airsim_node.launch(launch/airsim_node.launch)启动airsim_node,并 include 了 static_transforms.launch,后者用tf的static_transform_publisher发布world_ned -> world_enu的静态变换(旋转参数1.57 0 3.14,频率 100Hz)。
  • rviz.launch(launch/rviz.launch)以包内预置的 rviz/default.rviz 配置启动 RViz,便于可视化 TF、里程计与点云。
  • 常见问题:如果roslaunch airsim_ros_pkgs airsim_node.launch报错,先执行catkin clean再重新编译。

airsim_node.launch支持的关键启动参数:

参数默认值说明
outputlog节点输出方式(log或screen)
publish_clockfalse是否发布 ROS/clock话题
is_vulkantrue(launch 中硬编码为false)是否为 Vulkan 渲染
hostlocalhostAirSim 服务端 IP,映射为节点参数host_ip

launch 内还设置了三个核心定时器参数(见下表),并可通过host参数向节点传递host_ip,供 airsim_node.cpp 读取以连接远程 AirSim 实例。

五、airsim_node 封装节点:完整 ROS API

封装节点围绕“发布感知数据 + 接收控制指令 + 提供服务”三组接口展开。所有带VEHICLE_NAME的话题名,实际会替换为 AirSim settings.json 中配置的车辆名(例如drone_1)。

5.1 发布者(Publishers)

话题消息类型内容说明
/airsim_node/origin_geo_pointairsim_ros_pkgs/GPSYaw全局 NED 坐标系对应的 GPS 坐标,来自 AirSim settings.json 的OriginGeopoint键;源码中由airsim_client_->getHomeGeoPoint("")获取(airsim_ros_wrapper.cpp)
/airsim_node/VEHICLE_NAME/global_gpssensor_msgs/NavSatFix无人机在 AirSim 中的当前 GPS 坐标
/airsim_node/VEHICLE_NAME/odom_local_nednav_msgs/Odometry相对于起飞点的 NED 坐标系里程计(话题名与坐标系类型可配置,见参数表)
/airsim_node/VEHICLE_NAME/CAMERA_NAME/IMAGE_TYPE/camera_infosensor_msgs/CameraInfo相机内参信息
/airsim_node/VEHICLE_NAME/CAMERA_NAME/IMAGE_TYPEsensor_msgs/Image图像,RGB 或 float 类型取决于 settings.json 中请求的图像类型
/tftf2_msgs/TFMessageTF 变换树
/airsim_node/VEHICLE_NAME/altimeter/SENSOR_NAMEairsim_ros_pkgs/Altimeter高度计读数(altitude、pressure、qnh)
/airsim_node/VEHICLE_NAME/imu/SENSOR_NAMEsensor_msgs/ImuIMU 数据
/airsim_node/VEHICLE_NAME/magnetometer/SENSOR_NAMEsensor_msgs/MagneticField磁力计/罗盘磁场矢量
/airsim_node/VEHICLE_NAME/distance/SENSOR_NAMEsensor_msgs/Range距离传感器(如红外测距)读数
/airsim_node/VEHICLE_NAME/lidar/SENSOR_NAMEsensor_msgs/PointCloud2LIDAR 点云,由airsim_client_lidar_.getLidarData(...)获取并转换(airsim_ros_wrapper.cpp)
/airsim_node/VEHICLE_NAME/car_stateairsim_ros_pkgs/CarState车辆状态(位姿/速度/档位/rpm/手刹),见 airsim_ros_wrapper.cpp
/airsim_node/VEHICLE_NAME/environmentairsim_ros_pkgs/Environment环境真值(位置、气压、温度、空气密度、重力),来自simGetGroundTruthEnvironment

里程计话题的命名与坐标系在 airsim_ros_wrapper.cpp 中按以下规则联动:默认world_frame_id=world_ned、odom_frame_id=odom_local_ned;一旦把world_frame_id设为world_enu,odom 名会自动变为odom_local_enu,coordinate_system_enu也自动置为true。

5.2 订阅者(Subscribers)

话题消息类型内容说明
/airsim_node/vel_cmd_body_frameairsim_ros_pkgs/VelCmd机体坐标系速度指令。vehicle_name字段留空即可(源码中 VelCmd 的该字段已被注释掉,见 VelCmd.msg)
/airsim_node/vel_cmd_world_frameairsim_ros_pkgs/VelCmd世界坐标系速度指令
/gimbal_angle_euler_cmdairsim_ros_pkgs/GimbalAngleEulerCmd云台欧拉角设定(含camera_name、vehicle_name)
/gimbal_angle_quat_cmdairsim_ros_pkgs/GimbalAngleQuatCmd云台四元数设定
/airsim_node/VEHICLE_NAME/car_cmdairsim_ros_pkgs/CarControls油门、刹车、转向与档位选择,支持自动/手动变速箱,示例见 scripts/car_joy.py

CarControls消息字段(CarControls.msg)依次为:throttle(油门)、brake(刹车)、steering(转向)、handbrake(手刹)、manual(是否手动档)、manual_gear(手动档位,-1倒档、0空档、>=1前进档)、gear_immediate(是否立即换档)。car_cmd_cb(airsim_ros_wrapper.cpp)在互斥锁保护下将其映射到CarApiBase::CarControls后下发。

速度指令最终在定时器回调中通过get_multirotor_client()->moveByVelocityAsync(x, y, z, vel_cmd_duration_, ...)发送给 AirSim(airsim_ros_wrapper.cpp),单次速度指令持续时间vel_cmd_duration_ = 0.05s。

5.3 服务(Services)

服务请求类型说明
/airsim_node/VEHICLE_NAME/landairsim_ros_pkgs/Land降落指定无人机,请求字段waitOnLastTask
/airsim_node/takeoffairsim_ros_pkgs/Takeoff起飞
/airsim_node/resetairsim_ros_pkgs/Reset重置所有无人机

此外源码还注册了多机相关服务(airsim_ros_wrapper.cpp):all_robots/land、group_of_robots/takeoff、all_robots/vel_cmd_body_frame、all_robots/vel_cmd_world_frame、group_of_robots/vel_cmd_body_frame、group_of_robots/vel_cmd_world_frame等,对应 TakeoffGroup.srv 与 VelCmdGroup.msg(string[] vehicle_names批量下发)。

5.4 参数(Parameters)

参数类型默认值说明
/airsim_node/world_frame_idstringworld_ned在 airsim_node.launch 中设置;设为world_enu自动切换到 ENU 坐标系
/airsim_node/odom_frame_idstringodom_local_ned里程计坐标系名;world_frame_id为world_enu时自动默认odom_local_enu
/airsim_node/coordinate_system_enuboolfalse是否使用 ENU 坐标系;world_frame_id设为world_enu时自动置 true
/airsim_node/update_airsim_control_every_n_secdouble0.01s控制定时器回调周期:更新里程计/状态并下发控制指令。当前 RPClib 到 Unreal 引擎的接口最高约 50Hz,ROS 定时器回调会以最大可能速率运行,官方建议不要改动此参数
/airsim_node/update_airsim_img_response_every_n_secdouble0.01s图像定时器回调周期:接收 AirSim 所有相机的图像。实际速度取决于请求的图像数量与分辨率,同样建议不要改动
/airsim_node/publish_clockdoublefalse为true时发布 ROS/clock话题(仿真时钟同步)

launch 文件里实际设置的默认值为:update_airsim_img_response_every_n_sec=0.05、update_airsim_control_every_n_sec=0.01、update_lidar_every_n_sec=0.01(见 airsim_node.launch)。图像与 LIDAR 的回调队列在 airsim_node.cpp 中分别通过img_async_spinner_与lidar_async_spinner_异步驱动,避免阻塞主控制回路。

六、PD 位置控制器节点:原理与 API

封装包的第二个节点是“简单 PD 位置控制器”(pd_position_controller_simple_node),对应源码 pd_position_controller_simple.cpp 与头文件 pd_position_controller_simple.h。

6.1 工作原理(源码级解读)

  1. 订阅airsim_node发布的里程计/airsim_node/VEHICLE_NAME/odom_local_ned和原点 GPS/airsim_node/home_geo_point,在airsim_odom_cb与home_geopoint_cb中分别缓存当前位置与 GPS 原点(并用GeodeticConverter::setHome初始化大地坐标转换,见 pd_position_controller_simple.cpp)。
  2. 通过服务/airsim_node/VEHICLE_NAME/gps_goal或/airsim_node/VEHICLE_NAME/local_position_goal接收目标点。GPS 目标会先由geodetic2Ned(...)(ETH 库)或EarthUtils::GeodeticToNedFast(...)(AirLib 快速近似)转换为 NED 局部坐标(pd_position_controller_simple.cpp)。
  3. 定时器回调(默认 0.01s)中计算误差:位置误差target - current,偏航误差用math_common::angular_dist求最小角距;然后按vel = kp * error + kd * prev_error计算速度指令,其中比例项用当前误差、微分项用上一拍误差(pd_position_controller_simple.cpp)。
  4. 通过enforce_dynamic_constraints对水平速度、垂直速度与偏航速率做限幅,最后把VelCmd发布到/airsim_node/VEHICLE_NAME/vel_cmd_world_frame,由airsim_node转发给 AirSim(pd_position_controller_simple.cpp)。
  5. 当三维欧氏距离误差小于reached_thresh_xyz且偏航角差小于reached_yaw_degrees时,判定“到达目标”,此后保持在目标位姿悬停。

6.2 PD 参数(Parameters)

在 position_controller_simple.launch 中配置,均属节点私有参数(~):

参数类型默认值(launch 示例)说明
/pd_position_node/kp_xdouble0.30x 方向比例增益
/pd_position_node/kp_ydouble0.30y 方向比例增益
/pd_position_node/kp_zdouble0.30z 方向比例增益
/pd_position_node/kp_yawdouble0.30偏航比例增益
/pd_position_node/kd_xdouble0.05x 方向微分增益
/pd_position_node/kd_ydouble0.05y 方向微分增益
/pd_position_node/kd_zdouble0.05z 方向微分增益
/pd_position_node/kd_yawdouble0.05偏航微分增益
/pd_position_node/reached_thresh_xyzdouble0.1m判定“到达”的三维欧氏距离阈值
/pd_position_node/reached_yaw_degreesdouble5.0°判定“到达”的偏航角差阈值
/pd_position_node/update_control_every_n_secdouble0.01s控制更新周期

头文件中定义的代码级默认值(pd_position_controller_simple.h)为:kp=0.5、kd=0.1、reached_thresh_xyz=0.5、reached_yaw_degrees=5.0;launch 文件会用更保守的一组值覆盖。

6.3 控制器服务与订阅

类型名称说明
服务/airsim_node/VEHICLE_NAME/gps_goal目标 GPS 位置 + 偏航,请求字段latitude/longitude/altitude/yaw/vehicle_name,高度为绝对高度(SetGPSPosition.srv)。async=false且 30 秒内到达时返回success=true
服务/airsim_node/VEHICLE_NAME/local_position_goal目标局部位置 + 偏航,请求字段x/y/z/yaw/vehicle_name,坐标系为全局 NED(SetLocalPosition.srv),z为 NED 下方向(向下为正)
订阅/airsim_node/origin_geo_point监听airsim_node发布的起点 GPS 坐标(用于 GPS→NED 转换)
订阅/airsim_node/VEHICLE_NAME/odom_local_ned监听airsim_node发布的里程计
发布/vel_cmd_world_frame向airsim_node发送速度指令

此外源码还提供了local_position_goal/override与gps_goal/override两个“覆盖式”服务(pd_position_controller_simple.cpp),可无视“正在执行上一个目标”的互斥逻辑,直接改写目标点。

6.4 全局动态约束参数

在 dynamic_constraints.launch 中配置(DynamicConstraints::load_from_rosparams从全局命名空间读取,见 pd_position_controller_simple.cpp):

参数类型launch 示例值说明
/max_vel_horz_absdouble(launch 中被注释)最大水平速度(米/秒)
/max_vel_vert_absdouble2.0(launch 中重复声明,后值覆盖前值)最大垂直速度(米/秒)
/max_yaw_rate_degreedouble1.0最大偏航角速度(度/秒)

注意:dynamic_constraints.launch中第 3、4 行重复声明了max_vel_vert_abs(依次为10.0与2.0),按 rosparam 语义后者生效。头文件中的代码级默认值(pd_position_controller_simple.h)为:max_vel_horz_abs=1.0、max_vel_vert_abs=0.5、max_yaw_rate_degree=10.0。该 launch 还定义了云台角度限幅参数(gimbal_front_center_max/min_pitch/yaw/roll)。限幅逻辑在enforce_dynamic_constraints中对速度矢量按范数等比缩放实现。

6.5 一键启动组合

  • airsim_all.launch:依次 includeairsim_node.launch+dynamic_constraints.launch+position_controller_simple.launch,一次拉起封装节点、动态约束与 PD 控制器,是无人机闭环控制的推荐入口。
  • airsim_with_simple_PD_position_controller.launch:与airsim_all.launch内容相同,等价别名。
  • airsim_car_with_joy_control.launch:车模式 + 手柄控制,启动joy_node与car_joy,并预置world_frame_id=world_enu、coordinate_system_enu=true。
  • airsim_car_with_joy_control_auto.launch:同上,但car_joy的manual_transmission设为false,即自动变速箱模式。

七、车辆(Car)手柄控制:car_joy.py 实战

对于地面车辆,包内提供了 Python 脚本 scripts/car_joy.py,把 ROS 的joy话题事件翻译成CarControls并发布到/airsim_node/drone_1/car_cmd(默认话题,可通过~car_control_topic覆盖)。

脚本关键逻辑:

  • 摇杆axes[1]控制油门/刹车(正值给油门、负值给刹车,~throttle_brake_sign可反转),axes[2]经~max_curvature(默认 0.75)缩放后控制转向,~steer_sign(默认 -1)决定转向方向。
  • 按键 0~5 分别对应前进、倒车、空档、驻车、降档、升档(索引均可通过私有参数配置;~nuetral_button_index为兼容旧版拼写的别名)。
  • 档位语义:-1倒档、0空档、>=1前进档;手动模式(~manual_transmission=true)下用升/降档键逐级换挡,自动模式(false)下直接挂到~auto_gear_max(默认 5)。
  • 驻车时置handbrake=true并把档位置 0;发布频率由~update_rate_hz(默认 20Hz)控制,数据用互斥锁保护以支持异步回调。

使用前需先运行rosrun joy joy_node提供手柄原始数据。

八、Windows10 + WSL1/WSL2 方案

官方文档提供了在 Windows 上运行 ROS 封装的两条路径:一是用 WSL 跑封装节点、Windows 跑 AirSim;二是用 Docker。

8.1 WSL1 与 WSL2 的选择

  • WSL2是较新版本,在/home/...原生文件系统上工作时比 WSL1 快很多(远快于/mnt/...下的 Windows 挂载盘),官方强烈推荐用它编译代码。
  • 安装完成后可在 WSL1 / WSL2 之间自由切换。

8.2 设置步骤

  1. 按微软官方指引启用 WSL 并安装 Linux 发行版;确保所选 Ubuntu 版本支持你要装的 ROS 版本。
  2. 进入 Ubuntu 子系统后,按前面“环境准备”与“编译”章节的 Linux 步骤执行即可。

8.3 WSL 中运行图形程序(X11)

可以在 Windows 上安装VcXsrv后在 WSL 中运行 XWindows 应用(包括 SITL):

  1. 从开始菜单运行XLaunch。
  2. 第一个弹窗选Multiple Windows,第二个弹窗选Start no client,第三个弹窗只勾选Clipboard;不要选Native Opengl(若连不上再选Disable access control)。
  3. 设置 DISPLAY 环境变量:WSL1 下为127.0.0.1:0;WSL2 下用下面的命令自动探测:
    export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0

    把该行加入~/.bashrc可免去重复执行。WSL2 下还可能需要为公共网络关闭防火墙或添加例外,否则 VcXsrv 无法与 WSL2 通信。

  4. 建议在 WSL 内安装 VSCode 进行代码编辑;Windows Defender 会拖慢 WSL 磁盘性能,可自行权衡是否关闭。

8.4 WSL 与 Windows 的文件互访

  • 在 WSL 内访问 Windows 盘:ls /mnt/c/Users/<username>/Documents
  • 在 Windows 资源管理器地址栏访问 WSL 文件:\\wsl$\<distribution name>,例如\\wsl$\Ubuntu-18.04

8.5 在 Windows 跑 AirSim、WSL 跑 ROS 封装

  1. 设置宿主机 IP:WSL1 用export WSL_HOST_IP=127.0.0.1;WSL2 用export WSL_HOST_IP=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')。
  2. 像 Linux 一样启动封装,并通过host参数指定该 IP:
source devel/setup.bash roslaunch airsim_ros_pkgs airsim_node.launch output:=screen host:=$WSL_HOST_IP roslaunch airsim_ros_pkgs rviz.launch

host参数最终进入节点的host_ip参数(见 airsim_node.cpp),驱动MultirotorRpcLibClient/CarRpcLibClient连接对应 IP 上的 AirSim RPC 服务。

九、Docker 方案

仓库 tools/Dockerfile-ROS 提供了一个基于ubuntu:18.04的镜像定义:创建免密 sudo 用户testuser,并通过 tools/install_ros_deps.sh 安装 ROS 依赖。

构建镜像:

cd tools docker build -t airsim-ros -f Dockerfile-ROS .

运行容器(把<your-AirSim-folder-path>换成你的 AirSim 目录绝对路径):

docker run --rm -it --net=host -v <your-AirSim-folder-path>:/home/testuser/AirSim airsim-ros:latest bash

命令把宿主机 AirSim 目录挂载到容器内/home/testuser/AirSim,宿主上的源码改动会即时反映到容器内,方便开发调试。随后按“编译”章节步骤在容器内编译并运行 ROS 封装即可。

十、典型使用流程小结

  1. 启动 AirSim 仿真(Unreal/Unity 端),并在其 settings.json 中配置车辆与相机、设置OriginGeopoint。
  2. 按本文第二、三节完成 GCC/ROS/catkin_tools 安装与catkin build编译。
  3. roslaunch airsim_ros_pkgs airsim_all.launch一次性启动封装节点 + PD 控制器 + 动态约束。
  4. 用rosservice call调用起飞与位置目标服务,或在 RViz 中观察里程计、TF 与传感器话题。
  5. 需要手柄驾驶车辆时,改用airsim_car_with_joy_control.launch(或_auto版本)。

相关参考资料:docs/airsim_ros_pkgs.md(本文文档主体)、ros/src/airsim_ros_pkgs(包源码)、airsim_tutorial_pkgs(配套的仿真教程包)、docs/code_structure.md(仓库结构总览)。

  • 自动驾驶
  • 人工智能
  • 深度学习
  • 强化学习
  • 计算机视觉
  • 科研

【免费下载链接】AirSim

Open source simulator for autonomous vehicles built on Unreal Engine / Unity, from Microsoft AI & Research

项目地址:https://gitcode.com/gh_mirrors/ai/AirSim
点击查看免费下载
上一篇:Google Cloud KMS Python 示例库实战指南:密钥创建、加密解密与权限配置(python-docs-samples)
下一篇:如何构建币安交易信号生成器:技术指标与模式识别完整指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询