kuka协作机器人LBR系列 issy15R930导入到ros2_rviz(带外观文件)

news2025/2/25 9:34:06

     kuka协作机器人LBR系列 issy15R930导入到ros2_rviz(带外观文件)外观文件未调整好,外观仍需进一步研究,外观文件dae与轮廓(碰撞)文件STL并未完全对应起来。在blender里面看了一下UR机器人的文件,是对应的,本人导出的两种文件总是存在各中角度差。需要进一步研究。

    本文参考了以下两篇文章,和UR的包,本文未详细论述的地方,也可以按参考文章中的相关章节进行操作。

【ROS2机器人入门到实战】RVIZ2可视化移动机器人模型_rviz移动模型-CSDN博客

Solidworks模型转换到URDF格式并配置Moveit的详细教程_sw_urdf_exporter将soildwork的模型导为urdf文件怎么安装-CSDN博客 如何下载kuka机器人模型,可以在xpert上注册账号下载,也可以联系本人帮忙下载。

1.solidworks安装sw2urdf插件

Releases · ros/solidworks_urdf_exporter · GitHub

我用的solidworks是2023版SP5,经过验证,该sw2urdf插件是完全可以使用的。

 安装好后,还不太好找在哪里,具体位置如上图

2.solidworks安装导出dae文件的插件

Simlab 3D Plugins - Collada exporter for SolidWorks

 这个插件要收费,不过可以试用一个月。安装好后如下图

3.建立机器人模型的轴和坐标系

在建立坐标系的时候可以先隐藏相关的组件,按下图建立六个轴的基准轴和坐标系,底座也要建立一个坐标系。

    可以使用两点生成轴,也可以通过一个圆心点和那个圆面生成。效果都差不多。我都是建在凹坑里面,建到凸台上也是可以的。 建好后如下图

4.sw2urdf插件配置

这些个都要写,不要搞成自动生成,差别太大,不行的。

 

 

 

load configuration..是指你导出后,在urdf文件中有个CSV文件,可以选用上次的配置。因为每次进来都是自动生成轴,想修改很麻烦,每次都点击这么多。

点击Preview and export..按钮,导出前进行确认和配置,关键类型选择有限旋转的这个。如果不配置角度的话,rviz中轴操作无法进行。怎么配置这个角度,可以参考下一节。

 这里面的颜色就保持默认就好,好像改了也没有太大效果。点击导出urdf和meshes文件即可。

导出后大概就是这样的,如下图。 

 

5.轴关节限值配置

在kuka xpert上下载MA_LBR_iisy_zh.pdf这个文件,不会下载的可以找我要。在目录里面找到issy15R930轴数据。

把这个相关的角度计算成弧度,第一个185就是185/360*3.14=1.61,其他的类似。

第四步导出模型的时候要跟这个图片的零点位置差不多,这些角度就是上图的姿态为零点的。

6.建立ros2编译文件工程

 6.1建pyhton格式的文件工程

ros2 pkg create issy15r930 --build-type ament_python 

 

 在生成的工程目录里面复制meshes和urdf文件从第四步得到的那个文件,launch文件夹是自己建的,可以用命令,也可以界面上直接操作,怎么方便怎么来。

6.2 lauch文件说明

 就搞了这么一个launch文件,里面比较重要的就是urdf_name这一条,主要要跟urdf中的对应。

import os
from launch import LaunchDescription
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node
from launch_ros.substitutions import FindPackageShare


def generate_launch_description():
    package_name = 'issy15r930'
    urdf_name = "issy15r930.urdf"

    ld = LaunchDescription()
    pkg_share = FindPackageShare(package=package_name).find(package_name) 
    urdf_model_path = os.path.join(pkg_share, f'urdf/{urdf_name}')

    robot_state_publisher_node = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        arguments=[urdf_model_path]
        )

    joint_state_publisher_node = Node(
        package='joint_state_publisher_gui',
        executable='joint_state_publisher_gui',
        name='joint_state_publisher_gui',
        arguments=[urdf_model_path]
        )

    rviz2_node = Node(
        package='rviz2',
        executable='rviz2',
        name='rviz2',
        output='screen',
        )

    ld.add_action(robot_state_publisher_node)
    ld.add_action(joint_state_publisher_node)
    ld.add_action(rviz2_node)

    return ld

6.3 meshes文件说明

dae文件怎么导出,见第7节说明,和STL放一个文件夹就行。不用太费事。主要是urdf文件中要写对文件地址就好。

6.4 urdf文件说明

这个名字要和launch文件里面对应。

<?xml version="1.0" encoding="utf-8"?>

<!-- This URDF was automatically created by SolidWorks to URDF Exporter! Originally created by Stephen Brawner (brawner@gmail.com) 

     Commit Version: 1.6.0-4-g7f85cfe  Build Version: 1.6.7995.38578

     For more information, please see http://wiki.ros.org/sw_urdf_exporter -->

<robot

  name="issy15r930">

  <link

    name="base_link">

    <inertial>

      <origin

        xyz="3.7076E-05 -0.018098 0.082416"

        rpy="0 0 0" />

      <mass

        value="7.2283" />

      <inertia

        ixx="0.052936"

        ixy="2.5994E-05"

        ixz="-5.0195E-05"

        iyy="0.040376"

        iyz="0.0027943"

        izz="0.051987" />

    </inertial>

    <visual>

      <origin

        xyz="0 0 0"

        rpy="0 0 0" />

      <geometry>

        <mesh

          filename="package://issy15r930/meshes/base_link.dae" />

      </geometry>

      <material

        name="">

        <color

          rgba="0.79216 0.81961 0.93333 1" />

      </material>

    </visual>

    <collision>

      <origin

        xyz="0 0 0"

        rpy="0 0 0" />

      <geometry>

        <mesh

          filename="package://issy15r930/meshes/base_link.STL" />

      </geometry>

    </collision>

  </link>

  <link

    name="link1">

    <inertial>

      <origin

        xyz="0.0082771 -0.010407 0.10376"

        rpy="0 0 0" />

      <mass

        value="6.0436" />

      <inertia

        ixx="0.034011"

        ixy="0.00069966"

        ixz="-0.0020617"

        iyy="0.033685"

        iyz="0.0026113"

        izz="0.030166" />

    </inertial>

    <visual>

      <origin

        xyz="0 0 0"

        rpy="0 0 0" />

      <geometry>

        <mesh

          filename="package://issy15r930/meshes/link1.dae" />

      </geometry>

      <material

        name="">

        <color

          rgba="0.79216 0.81961 0.93333 1" />

      </material>

    </visual>

    <collision>

      <origin

        xyz="0 0 0"

        rpy="0 0 0" />

      <geometry>

        <mesh

          filename="package://issy15r930/meshes/link1.STL" />

      </geometry>

    </collision>

  </link>

  <joint

    name="joint1"

    type="revolute">

    <origin

      xyz="0 0 0.172"

      rpy="0 0 0" />

    <parent

      link="base_link" />

    <child

      link="link1" />

    <axis

      xyz="0 0 1" />

    <limit

      lower="-1.61"

      upper="1.61"

      effort="0"

      velocity="0" />

  </joint>

  <link

    name="link2">

    <inertial>

      <origin

        xyz="-0.035772 0.16784 0.08072"

        rpy="0 0 0" />

      <mass

        value="10.123" />

      <inertia

        ixx="0.26037"

        ixy="0.048481"

        ixz="0.0009505"

        iyy="0.043052"

        iyz="-0.0044562"

        izz="0.27629" />

    </inertial>

    <visual>

      <origin

        xyz="0 0 0"

        rpy="0 0 0" />

      <geometry>

        <mesh

          filename="package://issy15r930/meshes/link2.dae" />

      </geometry>

      <material

        name="">

        <color

          rgba="0.79216 0.81961 0.93333 1" />

      </material>

    </visual>

    <collision>

      <origin

        xyz="0 0 0"

        rpy="0 0 0" />

      <geometry>

        <mesh

          filename="package://issy15r930/meshes/link2.STL" />

      </geometry>

    </collision>

  </link>

  <joint

    name="joint2"

    type="revolute">

    <origin

      xyz="0.058615 -0.074125 0.126"

      rpy="1.5708 0 0.66908" />

    <parent

      link="link1" />

    <child

      link="link2" />

    <axis

      xyz="0 0 1" />

    <limit

      lower="-2"

      upper="0.43"

      effort="0"

      velocity="0" />

  </joint>

  <link

    name="link3">

    <inertial>

      <origin

        xyz="0.020571 -0.0055652 0.093536"

        rpy="0 0 0" />

      <mass

        value="4.3819" />

      <inertia

        ixx="0.018095"

        ixy="0.0010427"

        ixz="-0.0029257"

        iyy="0.021705"

        iyz="0.00078561"

        izz="0.018661" />

    </inertial>

    <visual>

      <origin

        xyz="0 0 0"

        rpy="0 0 0" />

      <geometry>

        <mesh

          filename="package://issy15r930/meshes/link3.dae" />

      </geometry>

      <material

        name="">

        <color

          rgba="0.79216 0.81961 0.93333 1" />

      </material>

    </visual>

    <collision>

      <origin

        xyz="0 0 0"

        rpy="0 0 0" />

      <geometry>

        <mesh

          filename="package://issy15r930/meshes/link3.STL" />

      </geometry>

    </collision>

  </link>

  <joint

    name="joint3"

    type="revolute">

    <origin

      xyz="-0.080235 0.37655 0.0255"

      rpy="3.1416 0 0" />

    <parent

      link="link2" />

    <child

      link="link3" />

    <axis

      xyz="0 0 1" />

    <limit

      lower="-1.3"

      upper="1.3"

      effort="0"

      velocity="0" />

  </joint>

  <link

    name="link4">

    <inertial>

      <origin

        xyz="-0.0527 0.0075768 0.11883"

        rpy="0 0 0" />

      <mass

        value="4.3253" />

      <inertia

        ixx="0.031922"

        ixy="0.001207"

        ixz="0.012121"

        iyy="0.040091"

        iyz="-0.0017531"

        izz="0.019873" />

    </inertial>

    <visual>

      <origin

        xyz="0 0 0"

        rpy="0 0 0" />

      <geometry>

        <mesh

          filename="package://issy15r930/meshes/link4.dae" />

      </geometry>

      <material

        name="">

        <color

          rgba="0.79216 0.81961 0.93333 1" />

      </material>

    </visual>

    <collision>

      <origin

        xyz="0 0 0"

        rpy="0 0 0" />

      <geometry>

        <mesh

          filename="package://issy15r930/meshes/link4.STL" />

      </geometry>

    </collision>

  </link>

  <joint

    name="joint4"

    type="revolute">

    <origin

      xyz="0.10722 -0.028729 0.12"

      rpy="1.5708 1.2545 1.309" />

    <parent

      link="link3" />

    <child

      link="link4" />

    <axis

      xyz="0 0 1" />

    <limit

      lower="-1.57"

      upper="1.57"

      effort="0"

      velocity="0" />

  </joint>

  <link

    name="link5">

    <inertial>

      <origin

        xyz="0.012242 0.00015735 0.07472"

        rpy="0 0 0" />

      <mass

        value="2.4287" />

      <inertia

        ixx="0.0066893"

        ixy="-1.3173E-05"

        ixz="-0.00073951"

        iyy="0.007692"

        iyz="-9.693E-06"

        izz="0.0069254" />

    </inertial>

    <visual>

      <origin

        xyz="0 0 0"

        rpy="0 0 0" />

      <geometry>

        <mesh

          filename="package://issy15r930/meshes/link5.dae" />

      </geometry>

      <material

        name="">

        <color

          rgba="0.79216 0.81961 0.93333 1" />

      </material>

    </visual>

    <collision>

      <origin

        xyz="0 0 0"

        rpy="0 0 0" />

      <geometry>

        <mesh

          filename="package://issy15r930/meshes/link5.STL" />

      </geometry>

    </collision>

  </link>

  <joint

    name="joint5"

    type="revolute">

    <origin

      xyz="-0.086604 0.012492 0.256"

      rpy="1.5708 -1.4484 1.4275" />

    <parent

      link="link4" />

    <child

      link="link5" />

    <axis

      xyz="0 0 1" />

    <limit

      lower="-0.95"

      upper="0.95"

      effort="0"

      velocity="0" />

  </joint>

  <link

    name="link6">

    <inertial>

      <origin

        xyz="0.0099764 0.0026101 0.050237"

        rpy="0 0 0" />

      <mass

        value="1.366" />

      <inertia

        ixx="0.0022647"

        ixy="-0.00025613"

        ixz="-0.00021904"

        iyy="0.0031711"

        iyz="-5.7372E-05"

        izz="0.0035946" />

    </inertial>

    <visual>

      <origin

        xyz="0 0 0"

        rpy="0 0 0" />

      <geometry>

        <mesh

          filename="package://issy15r930/meshes/link6.dae" />

      </geometry>

      <material

        name="">

        <color

          rgba="0.79216 0.81961 0.93333 1" />

      </material>

    </visual>

    <collision>

      <origin

        xyz="0 0 0"

        rpy="0 0 0" />

      <geometry>

        <mesh

          filename="package://issy15r930/meshes/link6.STL" />

      </geometry>

    </collision>

  </link>

  <joint

    name="joint6"

    type="revolute">

    <origin

      xyz="0.080493 0.0010481 0.0875"

      rpy="-1.5708 -1.5554 -1.5578" />

    <parent

      link="link5" />

    <child

      link="link6" />

    <axis

      xyz="0 0 1" />

    <limit

      lower="-1.91"

      upper="1.91"

      effort="0"

      velocity="0" />

  </joint>

</robot>

这个文件里面啊,视觉这块,要跟dae对应meshes文件里面的文件。其他的提示找不到的时候都要检查要对应的。7个link里面都是要修改过来的。 

6.5 setup文件说明

增加4跟5中的内容

from setuptools import find_packages, setup
from glob import glob
import os

package_name = 'issy15r930'

setup(
    name=package_name,
    version='0.0.0',
    packages=find_packages(exclude=['test']),
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
        (os.path.join('share', package_name, 'launch'), glob('launch/*.launch.py')),
        (os.path.join('share', package_name, 'urdf'), glob('urdf/**')),
        (os.path.join('share', package_name, 'meshes'), glob('meshes/**')),
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='cheni',
    maintainer_email='cheni@todo.todo',
    description='TODO: Package description',
    license='TODO: License declaration',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
        ],
    },
)

7.导出dae文件

需要单独打开某个零件,一个一个导出成dae格式,如下图。这个地方可能就是外观和轮廓模型不能对应一致的问题所在。urdf插件肯定处理了什么,这边不知道怎么对应。

 文件导出到urdf导出的meshes文件中即可,一起复制到虚拟机的工程目录中即可。

8.编译调试

用这个命令编译

这个命令去引用

这个命令去加载 

效果如下:

这个就是只有外观的模型,没太在一起,完全可以控制来回转。

 这个是这个碰撞的模型,这个urdf插件导出来的,是可以的,没有任何问题。

 两个一起显示就是这样的,外观文件没有对其碰撞文件

9.问题分析

打开ur机器人的dae文件和STL文件,是可以对应的,在blender里面,这个距离是我拉开的,导入是完全重合的。

 对比我导入的dae和stl模型,两者就不太对应。还需要进一步研究。

 测试了移动原点也是不行的,通过这个插件搞了一下工件中心的原点对齐,也是不行的。还需要进一步确认原因。

xpert下载一次5元icon-default.png?t=N7T8https://item.taobao.com/item.htm?app=chrome&bxsign=scdqor6QWU28XNc9OWfCSkU-CHUI-AJuCDWIGWPTosGsbY2Hq5KZcxkBJDupu_V5lItJnPJnOciY07uys5r9R9Ywfte7ZaUVQ7ACg7y6MYkfdzRmk6S9w1zIPPabV-As4cP&cpp=1&id=769766514957&price=5&shareUniqueId=25609527507&share_crt_v=1&shareurl=true&short_name=h.5FtsLWRmcGNYWrz&sourceType=item,item&sp_abtk=gray_1_code_simpleAndroid2&sp_tk=UUdTcFdsMlhXRlQ=&spm=a2159r.13376460.0.0&suid=9815284f-7724-4861-b99f-05be8c53f351&tbSocialPopKey=shareItem&tk=QGSpWl2XWFT&un=8e550dfe9bde5d682040bd82ddc2e1ea&un_site=0&ut_sk=1.ZQ%20rL9czjnsDANpS6QQfKorD_21646297_1708938056189.Copy.1 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1473952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot教程(二)——过滤器、拦截器

过滤器 过滤器可以在调用控制器方法之前进行一些操作&#xff0c;过滤器类一般放在filter包下。 配置类注册 使用过滤器时&#xff0c;要实现Filter接口&#xff0c;并重写doFilter方法&#xff1a; class TestFilter : Filter {override fun doFilter(request: ServletReq…

苹果发布iPhone 16:革命性创新重新定义智能手机体验

&#xff08;苹果总部&#xff0c;加利福尼亚州&#xff0c;2024年2月23日&#xff09;——今天&#xff0c;全球领先的科技公司苹果公司再次震撼世界&#xff0c;宣布推出iPhone 16&#xff0c;这款革命性的智能手机重新定义了人们对于手机的期望和体验。 iPhone 16的发布代表…

数字孪生的技术开发平台

数字孪生的开发平台可以基于各种软件和硬件工具来实现&#xff0c;这些平台提供了丰富的功能和工具&#xff0c;帮助开发人员构建、部署和管理数字孪生系统&#xff0c;根据具体的需求和技术要求&#xff0c;开发人员可以选择合适的平台进行开发工作。以下列举了一些常见的数字…

再探二分法

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读二分查找题目思路解法左闭右闭式写法左闭右开式写法 二分查找 题目 给定一个…

十六:网络编程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 01、网络编程概述02、网络通信要素概述03、通信要素1&#xff1a;IP和端口号3.1、IP的理解与InetAddress类的实例化3.2、端口号的理解 04、通信要素2&#xff1a;网…

主从复制实现Redis集群

主从复制实现Redis集群实验 (一主二从): 实验环境: 使用Docker 搭建 Redis 版本 5.0.5 打开一个终端窗口&#xff0c;在其中运行如下命令创建一个名为redis-master的Redis容器。注意&#xff0c;它的端口是6379 (本地的端口:映射到容器的端口) docker run -itd--name redis-m…

【wails】(6):使用wails做桌面应用开发,使用gin+go-chatglm.cpp进行本地模型运行,在windows上运行成功

1&#xff0c;整体架构说明 主要使用&#xff0c;参考的开源项目是&#xff1a; https://github.com/wailsapp/wails 前端项目&#xff1a; https://github.com/Chanzhaoyu/chatgpt-web 运行模型&#xff1a; https://github.com/Weaxs/go-chatglm.cpp 参考代码&#xff1a; h…

【VSCode】SSH Remote 通过跳板机连开发机提示“bash行1 powershell未找到命令”

需求背景 因为需要&#xff0c;在家我需要挂上公司VPN然后SSH连到跳板机&#xff0c;然后再从跳板机SSH进开发机。 问题背景 跳板机进开发机输入完密码显示 bash行1 powershell未找到命令VSCode SSH Remote跳板机配置请自行搜素其他文章config配置 注意其中ssh.exe地址请根据…

消息中间件篇之RabbitMQ-延时队列

一、延时队列 延迟队列&#xff1a;进入队列的消息会被延迟消费的队列。 场景&#xff1a;超时订单、限时优惠、定时发布。 延迟队列死信交换机TTL&#xff08;生存时间&#xff09;。 二、死信交换机 当一个队列中的消息满足下列情况之一时&#xff0c;可以成为死信&#xf…

React Hooks概述及常用的React Hooks介绍

Hook可以让你在不编写class的情况下使用state以及其他React特性 useState ● useState就是一个Hook ● 通过在函数组件里调用它来给组件添加一些内部state,React会在重复渲染时保留这个state 纯函数组件没有状态&#xff0c;useState()用于设置和使用组件的状态属性。语法如下…

Yolov8有效涨点:YOLOv8-AM,添加多种注意力模块提高检测精度,含代码,超详细

前言 2023 年&#xff0c;Ultralytics 推出了最新版本的 YOLO 模型。注意力机制是提高模型性能最热门的方法之一。 本次介绍的是YOLOv8-AM&#xff0c;它将注意力机制融入到原始的YOLOv8架构中。具体来说&#xff0c;我们分别采用四个注意力模块&#xff1a;卷积块注意力模块…

【嵌入式——QT】SpinBox

QSpinBox用于整数的显示和输入&#xff0c;一般显示十进制数&#xff0c;也可以显示二进制、十六进制数&#xff0c;而且可以在显示框中增加前缀和后缀。QDoubleSpinBox用于浮点数的显示和输入&#xff0c;可以设置显示小数位数&#xff0c;也可以设置显示的前缀和后缀。 样式…

安装淘宝镜像cnpm报错

npm 安装淘宝镜像报错 npm install -g cnpm --registryhttps://registry.npm.taobao.org 安装报 The operation was rejected by your operating system. npm ERR! Its possible that the file was already in use (by a text editor or antivirus), npm ERR! or that you la…

CSS 入门手册(二)

目录 12-Overflow 13-下拉菜单 14-提示框 14.1 显示位置&#xff08;左右&#xff09; 14.2 显示位置(上下) 14.3 添加箭头 14.4 淡入效果 15-图片 16-列表 17-表格 17.1 表格宽度和高度 17.2 文字对齐 17.3 表格颜色 18-计数器 19-导航栏 19.1 导航栏UI优化 …

顺序表的列题(力扣)和旋转数组

文章目录 一.删除有序数组中的重复项&#xff08;取自力扣&#xff09; 二.合并两个有序数组&#xff08;取自力扣&#xff09; 三.旋转数组&#xff08;多解法&#xff09; 前言 见面我们说到了顺序表今天来分享几个有关于顺序表的题目 一.删除有序数组中的重复项&#xff…

【JavaSE】实用类——枚举类型、包装类、数学类

目录 Java API枚举优势代码示例 包装类作用包装类和基本数据类型的对应关系包装类的构造方法包装类的常用方法装箱和拆箱 留一个问题大家猜猜看包装类的特点 Math类Random类代码示例 Java API Java API(Java Application Programming Interface) 即Java应用程序编程接口&#…

MySQL-事务,properties文件解析,连接池

1.事务机制管理 1.1 Transaction事务机制管理 默认情况下是执行一条sql语句就保存一次&#xff0c;那么比如我们需要三条数据同时成功或同时失败就需要开启事务机制了。开启事务机制后执行过程中发生问题就会回滚到操作之前&#xff0c;相当于没有执行操作。 1.2 事务的特征 事…

【Python笔记-设计模式】责任链模式

一、说明 旨在将请求沿着处理者链进行发送。收到请求后&#xff0c;每个处理者均可对请求进行处理&#xff0c;或将其传递给链上的下个处理者。 (一) 解决问题 将请求的发送者和接受者解耦&#xff0c;并使请求随着处理对象链传递&#xff0c;优化系统内部处理逻辑 (二) 使…

springboot+vue前后端分离适配cas认证的跨域问题

0. cas服务搭建参考:CAS 5.3服务器搭建_cas-overlay-CSDN博客 1. 参照springsecurity适配cas的方式, 一直失败, 无奈关闭springssecurity认证 2. 后端服务适配cas: 参考前后端分离项目(springbootvue)接入单点登录cas_前后端分离做cas单点登录-CSDN博客 1) 引入maven依赖 …

shell的基本介绍

一. 什么是shell Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程 序设计语言。shell是解释执行的。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问…