When using the BSP configuration file for the Plink-Jetson series expansion board or complete system to flash to JetPack 6.0, the following issues may occur:
ros2 run
command and issues with shutting down ROS nodes properly.sudo aptitude install
command, which may remove a large number of ROS components. It is recommended not to use this command.Prepare a virtual machine with Ubuntu 20.04. Reference: Flashing Guide
Mount SSD to home directory. Reference: SSD Mounting Guide
sudo fdisk /dev/nvme0n1
:
Use FishROS to change system sources:
wget http://fishros.com/install -O fishros && . fishros
Choose the source change command, but do not clear third-party sources.
Install Firefox browser and Todesk remote software.
Install JetPack:
For installation issues, see: Troubleshooting Guide
Solution: Install missing dependencies
Check CUDA components with jtop:
Configure cuDNN according to version:
sudo ln -sf libcudnn.so.8.9.4 libcudnn.so.8
sudo ln -sf libcudnn_ops_train.so.8.9.4 libcudnn_ops_train.so.8
sudo ln -sf libcudnn_ops_infer.so.8.9.4 libcudnn_ops_infer.so.8
sudo ln -sf libcudnn_adv_train.so.8.9.4 libcudnn_adv_train.so.8
sudo ln -sf libcudnn_adv_infer.so.8.9.4 libcudnn_adv_infer.so.8
sudo ln -sf libcudnn_cnn_train.so.8.9.4 libcudnn_cnn_train.so.8
sudo ln -sf libcudnn_cnn_infer.so.8.9.4 libcudnn_cnn_infer.so.8
Install ROS2 Humble and VSCode using FishROS:
wget http://fishros.com/install -O fishros && . fishros
Set up VPN for git:
git config --global http.proxy 127.0.0.1:7890
git config --global https.proxy 127.0.0.1:7890
Install dependencies:
sudo apt-get -y update
sudo apt-get -y install git
mkdir autoware_universe
cd autoware_universe/
git clone https://github.com/autowarefoundation/autoware.git
sudo apt update && sudo apt install -y \
build-essential \
cmake \
git \
wget \
ros-dev-tools \
python3-pip \
python3-rosdep \
python3-setuptools \
python3-vcstool \
python3-testresources \
python3-pytest \
python3-pytest-cov \
python3-pytest-repeat \
python3-pytest-rerunfailures \
python3-colcon-common-extensions \
python3-flake8 \
python3-flake8-docstrings \
python3-flake8-blind-except \
python3-flake8-builtins \
python3-flake8-class-newline \
python3-flake8-comprehensions \
python3-flake8-deprecated \
python3-flake8-import-order \
python3-flake8-quotes
sudo rosdep init
rosdep update
# Resolving rosdep update error
sudo mkdir -p /etc/ros/rosdep/sources.list.d/
sudo curl -o /etc/ros/rosdep/sources.list.d/20-default.list https://mirrors.tuna.tsinghua.edu.cn/github-raw/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
export ROSDISTRO_INDEX_URL=https://mirrors.tuna.tsinghua.edu.cn/rosdistro/index-v4.yaml
rosdep update
cd autoware
source amd64.env
sudo apt update
rmw_implementation_dashed=$(eval sed -e "s/_/-/g" <<< "${rmw_implementation}")
sudo apt install ros-${rosdistro}-${rmw_implementation_dashed}
echo '' >> ~/.bashrc && echo "export RMW_IMPLEMENTATION=${rmw_implementation}" >> ~/.bashrc
sudo apt install apt-transport-https
sudo sh -c 'echo "deb [trusted=yes] https://s3.amazonaws.com/autonomoustuff-repo/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/autonomoustuff-public.list'
sudo apt update
sudo apt install ros-${rosdistro}-pacmod3
pip3 install gdown -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
sudo apt install geographiclib-tools
sudo geographiclib-get-geoids egm2008-1
clang_format_version=16.0.0
pip3 install pre-commit clang-format==${clang_format_version} -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
sudo apt install golang
Autoware source installation:
cd autoware
mkdir src
vcs import src < autoware.repos
If vcs import fails, add proxy to URLs in autoware.repos:
Build Autoware:
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release
Troubleshoot OpenCV issues if encountered:
Solution: Resolve GPG key error
Solution: Install missing Python packages
Solution: Manually install missing OpenCV and OpenCV_contrib packages
Manual map download may be required:
Successful build:
Run official example:
cd autoware
source install/setup.bash
ros2 launch autoware_launch planning_simulator.launch.xml map_path:=$HOME/autoware_map/sample-map-planning vehicle_model:=sample_vehicle sensor_model:=sample_sensor_kit
Install CAN dependencies:
sudo apt-get install busybox can-utils
Test CAN connectivity:
sudo busybox devmem 0x0c303018 w 0xc458
sudo busybox devmem 0x0c303010 w 0xc400
sudo busybox devmem 0x0c303008 w 0xc458
sudo busybox devmem 0x0c303000 w 0xc400
sudo modprobe can
sudo modprobe can_raw
sudo modprobe can_dev
sudo modprobe mttcan
sudo ip link set can0 type can bitrate 500000
sudo ip link set can1 type can bitrate 500000
sudo ip link set up can0
sudo ip link set up can1
candump can0
candump can1
Set up CAN auto-start:
sudo mv setup_can.sh /usr/local/bin/setup_can.sh
sudo chmod +x /usr/local/bin/setup_can.sh
sudo gedit /etc/systemd/system/setup-can.service
Add the following content to the service file:
[Unit]
Description=Setup CAN interfaces
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/setup_can.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable setup-can.service
sudo systemctl start setup-can.service
Repository: https://github.com/silly-h/Fp_autoware_humble
Copy the sensor_driver
file into /home/orin/autoware_universe/autoware/src
Sensor driver sources:
Compile in /home/orin/autoware_universe/autoware
:
colcon build --packages-skip fixposition_driver_ros1 fixposition_odometry_converter_ros1
Note: Don't use sudo. If permission issues occur, download and compile the source code according to the driver references.
Modify topics and frame_ids for lidar, camera, and RTK2:
Sensor | Topic | Frame ID |
---|---|---|
LiDAR | /points |
velodyne_link |
IMU | /fixposition/corr_imu |
imu_link |
GPS | /fixposition/nav_sat_fix |
gnss_link |
Camera | /color/image |
camera4/camera_link |
Specific modifications:
fixposition_driver_ros2/src/data_to_ros2.cpp
, change lines 33 and 50 to fixed frame_idfixposition_driver_ros2/src/fixpostion_driver_node.cpp
, set lines 45 and 46 to corresponding rostopicsfixposition_driver_ros2/src/fixpostion_driver_node
deptahi_examples/ros2_src/rgb_publisher
rs_to_velodyne/src/rs_to_velodyne.cpp
Reference: https://autowarefoundation.github.io/autoware-documentation/main/how-to-guides/
Creating Sensor Models:
/autoware_universe/autoware/src/sensor_kit
1.1. /autoware_universe/autoware/src/sensor_kit/sample_sensor_kit_launch/sample_sensor_kit_description
: Set external parameters for sensors.
1.2. /autoware_universe/autoware/src/sensor_kit/sample_sensor_kit_launch/sample_sensor_kit_launch
: Launch sensor drivers.
Note: Use only gnss.launch.xml to launch GNSS and IMU components for VRTK2.
1.3. Compile this module:
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release --packages-select sample_sensor_kit_description sample_sensor_kit_launch
Creating Vehicle Models:
/autoware_universe/autoware/src/vehicle
2.1. /autoware_universe/autoware/src/vehicle/sample_vehicle_launch/sample_vehicle_description/config/mirror.param.yaml
: For point cloud trimming. Set values to 0.0 if the vehicle has no rearview mirrors.
2.2. /autoware_universe/autoware/src/vehicle/sample_vehicle_launch/sample_vehicle_description/config/vehicle_info.param.yaml
: Vehicle physical dimension parameters. Refer to: https://agilexrobotics.gitbook.io/scout_mini/6-chan-pin-chi-cun-product-dimensions
2.3. /autoware_universe/autoware/src/vehicle/sample_vehicle_launch/sample_vehicle_description/urdf/vehicle.xacro
: For vehicle model display in RViz. Adjust RPY and scaling as needed.
2.4. /autoware_universe/autoware/src/vehicle/sample_vehicle_launch/sample_vehicle_launch/launch/vehicle_interface.launch.xml
: Add chassis communication programs:
<include file="$(find-pkg-share can_communication)/launch/can_communication_launch.py"/>
<include file="$(find-pkg-share scout_base)/launch/scout_base.launch.py"/>
2.5. Compile this module:
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release --packages-select sample_vehicle_launch sample_vehicle_description
LiDAR-SLAM Mapping:
UTM to MGRS Map Conversion: Reference: https://autowarefoundation.github.io/autoware-documentation/main/how-to-guides/integrating-autoware/creating-maps/converting-utm-to-mgrs-map/ Additional modifications in src:
gnss_stat_utm.zone = 48; // Set UTM zone to 48
gnss_stat_utm.northup = true; // Use northern hemisphere UTM coordinate system
Creating Lanelet2 Map from MGRS Map: Reference: https://autowarefoundation.github.io/autoware-documentation/main/how-to-guides/integrating-autoware/creating-maps/creating-vector-map/ Tool: https://account.tier4.jp/login?flow=ac5b0de7-dea9-41a7-add2-8c9e74df2f28
Creating Local Map Files:
/home/autoware_map/
map_config.yaml
(refer to soft/map/first.py
for starting point)map_projector_info.yaml
Autoware.Universe overall pipeline: Node Diagram
Modify gnss_poser package for VRTK2 data type:
File: /autoware_universe/autoware/src/universe/autoware.universe/sensing/gnss_poser/gnss_poser_core.cpp
Change line 99:
const bool is_status_fixed = true;
Compile:
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release --packages-select gnss_poser
Modify input point cloud parameters:
Location: /autoware_universe/autoware/src/launcher/autoware_launch/autoware_launch/config/localization/ndt_scan_matcher/pointcloud_preprocessor
Changes:
voxel_grid_filter.param.yaml
: Set all to 0.1random_downsample_filter.param.yaml
: Set to 3000crop_box_filter_measurement_range.param.yaml
: Keep unchangedModify ndt_scan_matcher parameters:
Location: /autoware_universe/autoware/src/launcher/autoware_launch/autoware_launch/config/localization/ndt_scan_matcher
Changes:
Modify sensor messages to ROS local time:
4.1. File: /autoware_universe/autoware/src/universe/autoware.universe/localization/ndt_scan_matcher/src/ndt_scan_matcher_core.cpp
Change line 312:
const rclcpp::Time sensor_ros_time = this->now();
Compile:
```
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release --packages-select ndt_scan_matcher
```
4.2. File: /autoware_universe/autoware/src/universe/autoware.universe/localization/gyro_odometer/src/gyro_odometer_core.cpp
Changes:
latest_vehicle_twist_ros_time_ = this->now();
latest_imu_ros_time_ = this->now();
Compile:
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release --packages-select gyro_odometer
Note: This step encountered issues, possibly due to ROS component problems during environment setup. It's recommended to reinstall the system.
Test command:
source install/setup.bash
ros2 launch autoware_launch autoware.launch.xml map_path:=$HOME/autoware_map/fixposition-map-planning vehicle_model:=sample_vehicle sensor_model:=sample_sensor_kit
fixposition-map-planning file: Download Link
————————————————————————————————————————————————————————————————————————————————————
以下是Autoware安装和配置指南的中文版本:
在使用工控机为 Plink-Jetson 系列产品的扩展载板、整机的 BSP 配置文件刷机到 JetPack 6.0 会出现以下情况:
ros2 run
命令不存在、ROS 节点无法正常关闭等现象。sudo aptitude install
命令删除了大量 ROS 组件造成,推荐不要使用该命令。使用Ubuntu 20.04创建虚拟机。参考:刷写指南
挂载SSD到home目录。参考:SSD挂载指南
若在执行sudo fdisk /dev/nvme0n1
后出现差异:
按“d”删除分区并继续:
使用FishROS更改系统源:
wget http://fishros.com/install -O fishros && . fishros
选择更改源命令,但不要清除第三方源。
安装Firefox浏览器和Todesk远程软件。
安装JetPack:
安装问题解决参考:问题排查指南
解决方法:安装缺失的依赖
使用jtop检查CUDA组件:
根据版本配置cuDNN:
sudo ln -sf libcudnn.so.8.9.4 libcudnn.so.8
sudo ln -sf libcudnn_ops_train.so.8.9.4 libcudnn_ops_train.so.8
sudo ln -sf libcudnn_ops_infer.so.8.9.4 libcudnn_ops_infer.so.8
sudo ln -sf libcudnn_adv_train.so.8.9.4 libcudnn_adv_train.so.8
sudo ln -sf libcudnn_adv_infer.so.8.9.4 libcudnn_adv_infer.so.8
sudo ln -sf libcudnn_cnn_train.so.8.9.4 libcudnn_cnn_train.so.8
sudo ln -sf libcudnn_cnn_infer.so.8.9.4 libcudnn_cnn_infer.so.8
使用FishROS安装ROS2 Humble和VSCode:
wget http://fishros.com/install -O fishros && . fishros
为git设置VPN:
git config --global http.proxy 127.0.0.1:7890
git config --global https.proxy 127.0.0.1:7890
安装依赖项:
sudo apt-get -y update
sudo apt-get -y install git
mkdir autoware_universe
cd autoware_universe/
git clone https://github.com/autowarefoundation/autoware.git
sudo apt update && sudo apt install -y \
build-essential \
cmake \
git \
wget \
ros-dev-tools \
python3-pip \
python3-rosdep \
python3-setuptools \
python3-vcstool \
python3-testresources \
python3-pytest \
python3-pytest-cov \
python3-pytest-repeat \
python3-pytest-rerunfailures \
python3-colcon-common-extensions \
python3-flake8 \
python3-flake8-docstrings \
python3-flake8-blind-except \
python3-flake8-builtins \
python3-flake8-class-newline \
python3-flake8-comprehensions \
python3-flake8-deprecated \
python3-flake8-import-order \
python3-flake8-quotes
sudo rosdep init
rosdep update
# 解决rosdep更新错误
sudo mkdir -p /etc/ros/rosdep/sources.list.d/
sudo curl -o /etc/ros/rosdep/sources.list.d/20-default.list https://mirrors.tuna.tsinghua.edu.cn/github-raw/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
export ROSDISTRO_INDEX_URL=https://mirrors.tuna.tsinghua.edu.cn/rosdistro/index-v4.yaml
rosdep update
cd autoware
source amd64.env
sudo apt update
rmw_implementation_dashed=$(eval sed -e "s/_/-/g" <<< "${rmw_implementation}")
sudo apt install ros-${rosdistro}-${rmw_implementation_dashed}
echo '' >> ~/.bashrc && echo "export RMW_IMPLEMENTATION=${rmw_implementation}" >> ~/.bashrc
sudo apt install apt-transport-https
sudo sh -c 'echo "deb [trusted=yes] https://s3.amazonaws.com/autonomoustuff-repo/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/autonomoustuff-public.list'
sudo apt update
sudo apt install ros-${rosdistro}-pacmod3
pip3 install gdown -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
sudo apt install geographiclib-tools
sudo geographiclib-get-geoids egm2008-1
clang_format_version=16.0.0
pip3 install pre-commit clang-format==${clang_format_version} -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
sudo apt install golang
Autoware源码安装:
cd autoware
mkdir src
vcs import src < autoware.repos
如果vcs导入失败,在autoware.repos中的URL添加代理:
编译Autoware:
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release
如遇到OpenCV问题,可按以下步骤排查:
解决方法:解决GPG密钥错误
解决方法:安装缺失的Python包
解决方法:手动安装缺失的OpenCV和OpenCV_contrib包
手动下载地图可能是必需的:
编译成功:
运行官方示例:
cd autoware
source install/setup.bash
ros2 launch autoware_launch planning_simulator.launch.xml map_path:=$HOME/autoware_map/sample-map-planning vehicle_model:=sample_vehicle sensor_model:=sample_sensor_kit
安装CAN依赖项:
sudo apt-get install busybox can-utils
测试CAN连接:
sudo busybox devmem 0x0c303018 w 0xc458
sudo busybox devmem 0x0c303010 w 0xc400
sudo busybox devmem 0x0c303008 w 0xc458
sudo busybox devmem 0x0c303000 w 0xc400
sudo modprobe can
sudo modprobe can_raw
sudo modprobe can_dev
sudo modprobe mttcan
sudo ip link set can0 type can bitrate 500000
sudo ip link set can1 type can bitrate
继续上面的内容:
sudo ip link set up can0
sudo ip link set up can1
candump can0
candump can1
设置CAN自动启动:
sudo mv setup_can.sh /usr/local/bin/setup_can.sh
sudo chmod +x /usr/local/bin/setup_can.sh
sudo gedit /etc/systemd/system/setup-can.service
在服务文件中添加以下内容:
[Unit]
Description=Setup CAN interfaces
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/setup_can.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable setup-can.service
sudo systemctl start setup-can.service
代码库: https://github.com/silly-h/Fp_autoware_humble
将 sensor_driver
文件复制到 /home/orin/autoware_universe/autoware/src
传感器驱动源码:
在 /home/orin/autoware_universe/autoware
下编译:
colcon build --packages-skip fixposition_driver_ros1 fixposition_odometry_converter_ros1
注意: 不要使用 sudo。如果出现权限问题,请根据驱动参考下载并编译源码。
修改 LiDAR、相机和RTK2的topics和frame_ids:
传感器 | Topic | Frame ID |
---|---|---|
LiDAR | /points |
velodyne_link |
IMU | /fixposition/corr_imu |
imu_link |
GPS | /fixposition/nav_sat_fix |
gnss_link |
相机 | /color/image |
camera4/camera_link |
具体修改:
fixposition_driver_ros2/src/data_to_ros2.cpp
中,将第33和50行修改为固定的frame_id。fixposition_driver_ros2/src/fixposition_driver_node.cpp
中,将第45和46行设置为相应的rostopics。fixposition_driver_ros2/src/fixposition_driver_node
中的第60、61、148-150、190、204行。deptahi_examples/ros2_src/rgb_publisher
中的第49和52行。rs_to_velodyne/src/rs_to_velodyne.cpp
中的第97和231行。参考资料: https://autowarefoundation.github.io/autoware-documentation/main/how-to-guides/
创建传感器模型:
/autoware_universe/autoware/src/sensor_kit
1.1. 在 /autoware_universe/autoware/src/sensor_kit/sample_sensor_kit_launch/sample_sensor_kit_description
下: 设置传感器的外部参数。
1.2. 在 /autoware_universe/autoware/src/sensor_kit/sample_sensor_kit_launch/sample_sensor_kit_launch
下: 启动传感器驱动程序。
注意: 仅使用gnss.launch.xml启动VRTK2的GNSS和IMU组件。
1.3. 编译此模块:
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release --packages-select sample_sensor_kit_description sample_sensor_kit_launch
创建车辆模型:
/autoware_universe/autoware/src/vehicle
2.1. 在 /autoware_universe/autoware/src/vehicle/sample_vehicle_launch/sample_vehicle_description/config/mirror.param.yaml
下: 用于点云裁剪。如果车辆没有后视镜,则将值设置为0.0。
2.2. 在 /autoware_universe/autoware/src/vehicle/sample_vehicle_launch/sample_vehicle_description/config/vehicle_info.param.yaml
下: 车辆的物理尺寸参数。参考: https://agilexrobotics.gitbook.io/scout_mini/6-chan-pin-chi-cun-product-dimensions
2.3. 在 /autoware_universe/autoware/src/vehicle/sample_vehicle_launch/sample_vehicle_description/urdf/vehicle.xacro
下: 用于RViz中的车辆模型显示。根据需要调整RPY和缩放比例。
2.4. 在 /autoware_universe/autoware/src/vehicle/sample_vehicle_launch/sample_vehicle_launch/launch/vehicle_interface.launch.xml
下: 添加底盘通信程序:
<include file="$(find-pkg-share can_communication)/launch/can_communication_launch.py"/>
<include file="$(find-pkg-share scout_base)/launch/scout_base.launch.py"/>
2.5. 编译此模块:
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release --packages-select sample_vehicle_launch sample_vehicle_description
LiDAR-SLAM建图:
UTM到MGRS地图转换: 参考: https://autowarefoundation.github.io/autoware-documentation/main/how-to-guides/integrating-autoware/creating-maps/converting-utm-to-mgrs-map/ 在源码中做出以下额外修改:
gnss_stat_utm.zone = 48; // 将UTM区域设置为48
gnss_stat_utm.northup = true; // 使用北半球的UTM坐标系统
从MGRS地图创建Lanelet2地图: 参考: https://autowarefoundation.github.io/autoware-documentation/main/how-to-guides/integrating-autoware/creating-maps/creating-vector-map/ 工具: https://account.tier4.jp/login?flow=ac5b0de7-dea9-41a7-add2-8c9e74df2f28
创建本地地图文件:
/home/autoware_map/
下创建一个本地地图文件夹map_config.yaml
中设置地图原点(参考 soft/map/first.py
中的起点)map_projector_info.yaml
中更新 mgrs_gridAutoware.Universe总体流程图: 节点图
修改gnss_poser包以适应VRTK2数据类型:
文件: /autoware_universe/autoware/src/universe/autoware.universe/sensing/gnss_poser/gnss_poser_core.cpp
修改第99行:
const bool is_status_fixed = true;
编译:
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release --packages-select gnss_poser
修改输入点云参数:
位置: /autoware_universe/autoware/src/launcher/autoware_launch/autoware_launch/config/localization/ndt_scan_matcher/pointcloud_preprocessor
修改:
voxel_grid_filter.param.yaml
: 全部设置为0.1random_downsample_filter.param.yaml
: 设置为3000crop_box_filter_measurement_range.param.yaml
: 保持不变修改ndt_scan_matcher参数:
位置: /autoware_universe/autoware/src/launcher/autoware_launch/autoware_launch/config/localization/ndt_scan_matcher
修改:
将传感器消息修改为ROS本地时间:
4.1. 文件: /autoware_universe/autoware/src/universe/autoware.universe/localization/ndt_scan_matcher/src/ndt_scan_matcher_core.cpp
修改第312行:
const rclcpp::Time sensor_ros_time = this->now();
编译:
```
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release --packages-select ndt_scan_matcher
```
4.2. 文件: /autoware_universe/autoware/src/universe/autoware.universe/localization/gyro_odometer/src/gyro_odometer_core.cpp
修改:
latest_vehicle_twist_ros_time_ = this->now();
latest_imu_ros_time_ = this->now();
编译:
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release --packages-select gyro_odometer
注意: 这个步骤遇到了问题,可能是环境设置中的ROS组件问题。建议重新安装系统。
测试命令:
source install/setup.bash
ros2 launch autoware_launch autoware.launch.xml map_path:=$HOME/autoware_map/fixposition-map-planning vehicle_model:=sample_vehicle sensor_model:=sample_sensor_kit
fixposition-map-planning文件: 下载链接