小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
ABB机器人与ROS2联调(文本教程)(ABB-ROS2-Moveit)
-
在这段时间因为导师要求需要实现ABB与机器人的联调(动力学与运动学都需要,但是感觉gazebo实现还有点困难,暂时先尝试了moveit方向)。
目前来说全部联调过程均参考了网上方案,所以只是给如果同样需要使用ABB机器人与ROS联调的朋友们提供一个简单的方向,代码以及细节不一一讲解(目前我自己也没有完全搞明白)
首先尝试的是ROS1版本的melodic与abb联调,这个可以参考网络上现有的中文教程,在此提供我参考的几个教程链接(不能完全按照上面的方法,可能有一点细节需要改动)https://blog.csdn.net/zhangrelay/article/details/52687545 https://blog.csdn.net/qq_31393391/article/details/107433289?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-107433289-blog-52381597.pc_relevant_recovery_v2&spm=1001.2101.3001.4242.1&utm_relevant_index=3 https://blog.csdn.net/u014697321/article/details/106434289#comments_12532558
实现ROS1与ABB联调后,主要由于这段时间学的ros2(感觉ros2的结构和代码更加清晰,ros1没有学明白),并且melodic在之后不会再更新,同时参考网上ABB机器人闭环控制的要求需要EGM(如下图),故考虑实现ROS2与ABB机器人的联调。
在搜索的过程中,发现有大佬已经完成了ROS2与ABB的联调过程,目前更新版本为rolling,但是与我使用的humble尝试后没有区别,链接如下:
https://github.com/PickNikRobotics/abb_ros2
详细操作步骤可以完全按照Getting Started中所描述的进行。
对此简单复述下(没有明白的话可以直接去github上面仔细看)
第一步先下载源代码并编译安装,整个过程无任何问题(和常规的源码安装一样,下载后VCS安装其他功能包,然后rosdep check 一下需要的依赖,最后用小鱼的rosdepc install就行,rolling与humble版本无影响)安装时有个需要注意的地方,前提条件是已经安装了moveit,针对源码安装moveit出现的问题我在下面链接中有提到,二进制安装不会出现缺少moveit环境的问题
https://fishros.org.cn/forum/topic/763/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8roslaunch-%E8%B0%83%E7%94%A8%E4%B8%8D%E5%90%8C%E5%B7%A5%E4%BD%9C%E7%A9%BA%E9%97%B4%E7%9A%84%E5%8A%9F%E8%83%BD%E5%8C%85/18?_=1668264938770
之后尝试moveit仿真应该不会出现问题,接下来就是进行ABB配置与ROS2配置
将下载好的rspag文件解压后(robotstudio目前尝试了6.08版本不行,下载的2022版本)主要修改ROB_1中Remote Address即可,其他部分一般不会出问题,如果RWS端口不确定也可以参考github上面提供的方法查找,目前测试过方法无问题。
同理在ROS2的robot description file中我们可以看到启动节点完成RWS通讯还需要知道rws_port与rws_ip,默认rws_port为80,rws_ip为电脑ip地址(注意不是虚拟示教器的127.0.0.1!)
上述配置好后可以先启动ABB程序(移至main后点播放一样的按钮即可,然后会提示等待连接),再启动ros2 launch文件,如下
ros2 launch abb_bringup abb_control.launch.py description_package:=abb_irb1200_support description_file:=irb1200_5_90.xacro launch_rviz:=false moveit_config_package:=abb_irb1200_5_90_moveit_config use_fake_hardware:=false rws_ip:=192.168.123.77 rws_port:=80
其中rws_ip 改为自己电脑ip即可
之后再启动rviz和gazebo,这个也可以直接调用写好的roslaunch文件ros2 launch abb_bringup abb_moveit.launch.py robot_xacro_file:=irb1200_5_90.xacro support_package:=abb_irb1200_support moveit_config_package:=abb_irb1200_5_90_moveit_config moveit_config_file:=abb_irb1200_5_90.srdf.xacro
之后就可以尝试ABB与rviz之间是否真正通讯,moveit随机生成一个目标位置并执行,可以看到ABB可视化界面中机械臂跟随运动,对此完成ABB机器人与ROS2的联调过程。
由于我目前还才完成联调过程,后面会使用代码实现目标点和其他要求的自动动作,并且尝试实现闭环控制(ROS1中不能实现闭环控制),后续过程也会和大家一起努力。
-
@空白 顺便催更下小鱼关于机械臂的教程(moveit api以及相关事例)看英文文档很痛苦
-
@空白 感谢分享,催更已收到哈,目前这块教程确实少的可怜,我加把劲,一起努力!
-
前辈您好:
我也是和您一样,拟使用ROS2建立Moveit2与ABB(IRB1600)的连接。
和您文中到的阶段差不多,我也成功建立了从Moveit2到Robotstudio里的虚拟IRB1600(Robotware6.08与6.14.00.01都成功了),但移植到实体机械臂上的时候,总是在报41830机械臂硬件系统无法发送UpdUc信息的错误。
当然还会有41822无法接受到上位机UdpUc信息的警告(这个我猜测是未建立连接的错误,若41830可解决,这个亦可解决)。
在此想咨询前辈:
1、是否成功的控制了实际的ABB机械臂?
2、是否也遇到了上述报错?
3、上述41830错误是只要运行ABB的RAPID代码就会延迟1s左右出现,此时无论ROS2那边是否发起连接,是否从模拟环境转到实际机械臂需要额外修改的配置文件?(机械臂的URDF与SRDF我都已经换成了IRB1600的了)PS:
1、实际机械臂ABB的EGM模组已经额外购买安装了;
2、实际机械臂的Robotware版本为6.14.00.01
3、ROS2版本为Iron
4、IRB1600是标准的六轴工业臂,无额外加轴或负载;以下是正常运行的仿真信息与报错信息
正常连接maple@maple-virtual-machine:~$ ros2 launch abb_bringup abb_control.launch.py description_package:=abb_irb1600_support description_file:=irb1600_10_12.xacro launch_rviz:=false moveit_config_package:=abb_irb1600_10_12_moveit_config use_fake_hardware:=false rws_ip:=10.189.140.136 [INFO] [launch]: All log files can be found below /home/maple/.ros/log/2023-07-12-10-39-23-301877-maple-virtual-machine-8611 [INFO] [launch]: Default logging verbosity is set to INFO [INFO] [ros2_control_node-1]: process started with pid [8616] [INFO] [robot_state_publisher-2]: process started with pid [8618] [INFO] [spawner-3]: process started with pid [8620] [INFO] [spawner-4]: process started with pid [8622] [robot_state_publisher-2] [WARN] [1689129563.750335791] [kdl_parser]: The root link base_link has an inertia specified in the URDF, but KDL does not support a root link with an inertia. As a workaround, you can add an extra dummy link to your URDF. [robot_state_publisher-2] [INFO] [1689129563.750440292] [robot_state_publisher]: got segment base [robot_state_publisher-2] [INFO] [1689129563.750521252] [robot_state_publisher]: got segment base_link [robot_state_publisher-2] [INFO] [1689129563.750533369] [robot_state_publisher]: got segment flange [robot_state_publisher-2] [INFO] [1689129563.750542839] [robot_state_publisher]: got segment link_1 [robot_state_publisher-2] [INFO] [1689129563.750551914] [robot_state_publisher]: got segment link_2 [robot_state_publisher-2] [INFO] [1689129563.750561160] [robot_state_publisher]: got segment link_3 [robot_state_publisher-2] [INFO] [1689129563.750570210] [robot_state_publisher]: got segment link_4 [robot_state_publisher-2] [INFO] [1689129563.750579187] [robot_state_publisher]: got segment link_5 [robot_state_publisher-2] [INFO] [1689129563.750588108] [robot_state_publisher]: got segment link_6 [robot_state_publisher-2] [INFO] [1689129563.750596960] [robot_state_publisher]: got segment tool0 [ros2_control_node-1] [INFO] [1689129563.759028902] [resource_manager]: Loading hardware 'ABBMultiInterfaceHardware' [ros2_control_node-1] [INFO] [1689129563.766998498] [resource_manager]: Initialize hardware 'ABBMultiInterfaceHardware' [ros2_control_node-1] [INFO] [1689129563.852748278] [ABBSystemHardware]: Robot controller description: [ros2_control_node-1] ============================================================ [ros2_control_node-1] = Summary of robot controller at '10.189.140.136:80' [ros2_control_node-1] ============================================================ [ros2_control_node-1] # General Information: [ros2_control_node-1] |- RobotWare version: 6.08.00.00 [ros2_control_node-1] |- System name: IRB_1600_10kg_1.2m [ros2_control_node-1] |- System type: Virtual Controller [ros2_control_node-1] |- Options: [ros2_control_node-1] |- RobotWare Base [ros2_control_node-1] |- English [ros2_control_node-1] |- 689-1 Externally Guided Motion (EGM) [ros2_control_node-1] |- UDPUC Driver [ros2_control_node-1] |- Drive System IRB 120/140/260/360/910SC/1200/1400/1520/1600/1660ID [ros2_control_node-1] |- ADU-790A in position X3 [ros2_control_node-1] |- ADU-790A in position Y3 [ros2_control_node-1] |- ADU-790A in position Z3 [ros2_control_node-1] |- Axis Calibration [ros2_control_node-1] |- IRB 1600-10/1.2 [ros2_control_node-1] [ros2_control_node-1] # Mechanical Units: [ros2_control_node-1] |- Unit: ROB_1 [ros2_control_node-1] [ros2_control_node-1] # Mechanical Unit Groups: [ros2_control_node-1] |- N/A (only for MultiMove systems) [ros2_control_node-1] ============================================================ [ros2_control_node-1] [INFO] [1689129563.852792740] [ABBSystemHardware]: Configuring EGM interface... [ros2_control_node-1] [INFO] [1689129563.852883541] [ABBSystemHardware]: Configuring EGM for mechanical unit group on port 6511 [ros2_control_node-1] [INFO] [1689129563.867502416] [resource_manager]: Successful initialization of hardware 'ABBMultiInterfaceHardware' [ros2_control_node-1] [WARN] [1689129563.867709761] [controller_manager]: [Deprecated]: Automatic activation of all hardware components will not be supported in the future anymore. Use hardware_spawner instead. [ros2_control_node-1] [INFO] [1689129563.867822275] [resource_manager]: 'configure' hardware 'ABBMultiInterfaceHardware' [ros2_control_node-1] [INFO] [1689129563.867830015] [resource_manager]: Successful 'configure' of hardware 'ABBMultiInterfaceHardware' [ros2_control_node-1] [INFO] [1689129563.867837397] [resource_manager]: 'activate' hardware 'ABBMultiInterfaceHardware' [ros2_control_node-1] [INFO] [1689129563.867853642] [ABBSystemHardware]: Connecting to robot... [ros2_control_node-1] [INFO] [1689129564.368014796] [ABBSystemHardware]: Not connected to robot... [ros2_control_node-1] [INFO] [1689129565.368461517] [ABBSystemHardware]: Not connected to robot... [spawner-4] [INFO] [1689129565.973728146] [spawner_joint_trajectory_controller]: Waiting for '/controller_manager' services to be available [spawner-3] [INFO] [1689129565.990071817] [spawner_joint_state_broadcaster]: Waiting for '/controller_manager' services to be available [ros2_control_node-1] [INFO] [1689129566.369010847] [ABBSystemHardware]: Not connected to robot... [ros2_control_node-1] [INFO] [1689129567.305496260] [ABBSystemHardware]: Connected to robot [ros2_control_node-1] [INFO] [1689129567.305574934] [ABBSystemHardware]: ros2_control hardware interface was successfully started! [ros2_control_node-1] [INFO] [1689129567.305585904] [resource_manager]: Successful 'activate' of hardware 'ABBMultiInterfaceHardware' [ros2_control_node-1] [INFO] [1689129567.310303851] [controller_manager]: update rate is 250 Hz [ros2_control_node-1] [INFO] [1689129567.310438338] [controller_manager]: RT kernel is recommended for better performance [ros2_control_node-1] [INFO] [1689129567.400565923] [controller_manager]: Loading controller 'joint_trajectory_controller' [spawner-4] [INFO] [1689129567.415595360] [spawner_joint_trajectory_controller]: Loaded joint_trajectory_controller [ros2_control_node-1] [INFO] [1689129567.416202532] [controller_manager]: Loading controller 'joint_state_broadcaster' [ros2_control_node-1] [INFO] [1689129567.426816858] [controller_manager]: Configuring controller 'joint_trajectory_controller' [ros2_control_node-1] [INFO] [1689129567.427018662] [joint_trajectory_controller]: No specific joint names are used for command interfaces. Using 'joints' parameter. [ros2_control_node-1] [INFO] [1689129567.427105302] [joint_trajectory_controller]: Command interfaces are [position velocity] and state interfaces are [position velocity]. [ros2_control_node-1] [INFO] [1689129567.427128183] [joint_trajectory_controller]: Using 'splines' interpolation method. [spawner-3] [INFO] [1689129567.427298317] [spawner_joint_state_broadcaster]: Loaded joint_state_broadcaster [ros2_control_node-1] [INFO] [1689129567.431965610] [joint_trajectory_controller]: Action status changes will be monitored at 20.00 Hz. [ros2_control_node-1] [INFO] [1689129567.435177565] [controller_manager]: Configuring controller 'joint_state_broadcaster' [ros2_control_node-1] [INFO] [1689129567.435225859] [joint_state_broadcaster]: 'joints' or 'interfaces' parameter is empty. All available state interfaces will be published [spawner-4] [INFO] [1689129567.443496874] [spawner_joint_trajectory_controller]: Configured and activated joint_trajectory_controller [spawner-3] [INFO] [1689129567.451358331] [spawner_joint_state_broadcaster]: Configured and activated joint_state_broadcaster [INFO] [spawner-4]: process has finished cleanly [pid 8622] [INFO] [spawner-3]: process has finished cleanly [pid 8620]
实际机械臂连接
maple@maple-virtual-machine:~$ ros2 launch abb_bringup abb_control.launch.py description_package:=abb_irb1600_support description_file:=irb1600_10_12.xacro launch_rviz:=false moveit_config_package:=abb_irb1600_10_12_moveit_config use_fake_hardware:=false rws_ip:=10.189.140.12 [INFO] [launch]: All log files can be found below /home/maple/.ros/log/2023-07-12-10-43-35-659335-maple-virtual-machine-9011 [INFO] [launch]: Default logging verbosity is set to INFO [INFO] [ros2_control_node-1]: process started with pid [9016] [INFO] [robot_state_publisher-2]: process started with pid [9018] [INFO] [spawner-3]: process started with pid [9020] [INFO] [spawner-4]: process started with pid [9022] [robot_state_publisher-2] [WARN] [1689129816.093032645] [kdl_parser]: The root link base_link has an inertia specified in the URDF, but KDL does not support a root link with an inertia. As a workaround, you can add an extra dummy link to your URDF. [robot_state_publisher-2] [INFO] [1689129816.093116631] [robot_state_publisher]: got segment base [robot_state_publisher-2] [INFO] [1689129816.093164184] [robot_state_publisher]: got segment base_link [robot_state_publisher-2] [INFO] [1689129816.093172570] [robot_state_publisher]: got segment flange [robot_state_publisher-2] [INFO] [1689129816.093180311] [robot_state_publisher]: got segment link_1 [robot_state_publisher-2] [INFO] [1689129816.093187438] [robot_state_publisher]: got segment link_2 [robot_state_publisher-2] [INFO] [1689129816.093194769] [robot_state_publisher]: got segment link_3 [robot_state_publisher-2] [INFO] [1689129816.093201942] [robot_state_publisher]: got segment link_4 [robot_state_publisher-2] [INFO] [1689129816.093209117] [robot_state_publisher]: got segment link_5 [robot_state_publisher-2] [INFO] [1689129816.093216141] [robot_state_publisher]: got segment link_6 [robot_state_publisher-2] [INFO] [1689129816.093223215] [robot_state_publisher]: got segment tool0 [ros2_control_node-1] [INFO] [1689129816.098424145] [resource_manager]: Loading hardware 'ABBMultiInterfaceHardware' [ros2_control_node-1] [INFO] [1689129816.104218773] [resource_manager]: Initialize hardware 'ABBMultiInterfaceHardware' [ros2_control_node-1] [WARN] [1689129818.107661442] [ABBHardwareInterfaceUtilities]: Failed to establish RWS connection to the robot controller (waiting indefinitely), reason: 'Failed to collect general system info' [spawner-4] [INFO] [1689129818.697917155] [spawner_joint_trajectory_controller]: Waiting for '/controller_manager' services to be available [spawner-3] [INFO] [1689129818.732989817] [spawner_joint_state_broadcaster]: Waiting for '/controller_manager' services to be available [spawner-4] [INFO] [1689129820.712809011] [spawner_joint_trajectory_controller]: Waiting for '/controller_manager' services to be available [spawner-3] [INFO] [1689129820.751684380] [spawner_joint_state_broadcaster]: Waiting for '/controller_manager' services to be available [ros2_control_node-1] [WARN] [1689129821.110718473] [ABBHardwareInterfaceUtilities]: Failed to establish RWS connection to the robot controller (waiting indefinitely), reason: 'Failed to collect general system info' [spawner-4] [INFO] [1689129822.727772717] [spawner_joint_trajectory_controller]: Waiting for '/controller_manager' services to be available [spawner-3] [INFO] [1689129822.769059037] [spawner_joint_state_broadcaster]: Waiting for '/controller_manager' services to be available [ros2_control_node-1] [WARN] [1689129824.113744158] [ABBHardwareInterfaceUtilities]: Failed to establish RWS connection to the robot controller (waiting indefinitely), reason: 'Failed to collect general system info' [spawner-4] [INFO] [1689129824.744069858] [spawner_joint_trajectory_controller]: Waiting for '/controller_manager' services to be available [spawner-3] [INFO] [1689129824.787293213] [spawner_joint_state_broadcaster]: Waiting for '/controller_manager' services to be available [spawner-4] [ERROR] [1689129826.760465664] [spawner_joint_trajectory_controller]: Controller manager not available [spawner-3] [ERROR] [1689129826.802841821] [spawner_joint_state_broadcaster]: Controller manager not available [ERROR] [spawner-4]: process has died [pid 9022, exit code 1, cmd '/opt/ros/iron/lib/controller_manager/spawner joint_trajectory_controller -c /controller_manager --ros-args']. [ERROR] [spawner-3]: process has died [pid 9020, exit code 1, cmd '/opt/ros/iron/lib/controller_manager/spawner joint_state_broadcaster --controller-manager /controller_manager --ros-args']. [ros2_control_node-1] [WARN] [1689129827.116410557] [ABBHardwareInterfaceUtilities]: Failed to establish RWS connection to the robot controller (waiting indefinitely), reason: 'Failed to collect general system info' [ros2_control_node-1] [WARN] [1689129830.120605662] [ABBHardwareInterfaceUtilities]: Failed to establish RWS connection to the robot controller (waiting indefinitely), reason: 'Failed to collect general system info' ^C[WARNING] [launch]: user interrupted with ctrl-c (SIGINT) [robot_state_publisher-2] [INFO] [1689129831.757217191] [rclcpp]: signal_handler(signum=2) [ros2_control_node-1] [INFO] [1689129831.757245258] [rclcpp]: signal_handler(signum=2) [INFO] [robot_state_publisher-2]: process has finished cleanly [pid 9018] [ros2_control_node-1] [WARN] [1689129833.122248436] [ABBHardwareInterfaceUtilities]: Failed to establish RWS connection to the robot controller (waiting indefinitely), reason: 'Failed to collect general system info' [ros2_control_node-1] terminate called after throwing an instance of 'std::runtime_error' [ros2_control_node-1] what(): Failed to establish RWS connection to the robot controller [ros2_control_node-1] Stack trace (most recent call last): [ros2_control_node-1] #18 Object "", at 0xffffffffffffffff, in [ros2_control_node-1] #17 Object "/opt/ros/iron/lib/controller_manager/ros2_control_node", at 0x558c5341de04, in _start [ros2_control_node-1] #16 Source "../csu/libc-start.c", line 392, in __libc_start_main_impl [0x7f7fea029e3f] [ros2_control_node-1] #15 Source "../sysdeps/nptl/libc_start_call_main.h", line 58, in __libc_start_call_main [0x7f7fea029d8f] [ros2_control_node-1] #14 Object "/opt/ros/iron/lib/controller_manager/ros2_control_node", at 0x558c5341d8b2, in main [ros2_control_node-1] #13 Object "/opt/ros/iron/lib/libcontroller_manager.so", at 0x7f7feac14128, in controller_manager::ControllerManager::ControllerManager(std::shared_ptr<rclcpp::Executor>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::NodeOptions const&) [ros2_control_node-1] #12 Object "/opt/ros/iron/lib/libcontroller_manager.so", at 0x7f7feac0fe91, in controller_manager::ControllerManager::init_resource_manager(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) [ros2_control_node-1] #11 Object "/opt/ros/iron/lib/libhardware_interface.so", at 0x7f7feaa8661a, in hardware_interface::ResourceManager::load_urdf(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) [ros2_control_node-1] #10 Object "/opt/ros/iron/lib/libhardware_interface.so", at 0x7f7feaaab25d, in [ros2_control_node-1] #9 Object "/opt/ros/iron/lib/libhardware_interface.so", at 0x7f7feaaa15ab, in hardware_interface::System::initialize(hardware_interface::HardwareInfo const&) [ros2_control_node-1] #8 Object "/home/maple/abb_ros2_ws/install/abb_hardware_interface/lib/libabb_hardware_interface.so", at 0x7f7fdcf6ee27, in abb_hardware_interface::ABBSystemHardware::on_init(hardware_interface::HardwareInfo const&) [ros2_control_node-1] #7 Object "/home/maple/abb_ros2_ws/install/abb_hardware_interface/lib/libabb_hardware_interface.so", at 0x7f7fdcf90341, in abb::robot::utilities::establishRWSConnection(abb::robot::RWSManager&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) [ros2_control_node-1] #6 Object "/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30", at 0x7f7fea4ae517, in __cxa_throw [ros2_control_node-1] #5 Object "/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30", at 0x7f7fea4ae2b6, in std::terminate() [ros2_control_node-1] #4 Object "/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30", at 0x7f7fea4ae24b, in [ros2_control_node-1] #3 Object "/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30", at 0x7f7fea4a2bbd, in [ros2_control_node-1] #2 Source "./stdlib/abort.c", line 79, in abort [0x7f7fea0287f2] [ros2_control_node-1] #1 Source "../sysdeps/posix/raise.c", line 26, in raise [0x7f7fea042475] [ros2_control_node-1] #0 | Source "./nptl/pthread_kill.c", line 89, in __pthread_kill_internal [ros2_control_node-1] | Source "./nptl/pthread_kill.c", line 78, in __pthread_kill_implementation [ros2_control_node-1] Source "./nptl/pthread_kill.c", line 44, in __pthread_kill [0x7f7fea096a7c] [ros2_control_node-1] Aborted (Signal sent by tkill() 9016 1000) [ERROR] [ros2_control_node-1]: process has died [pid 9016, exit code -6, cmd '/opt/ros/iron/lib/controller_manager/ros2_control_node --ros-args --params-file /tmp/launch_params_cgq8rsj4 --params-file /home/maple/abb_ros2_ws/install/abb_bringup/share/abb_bringup/config/abb_controllers.yaml'].
PS:
1、IP不一致是网络更换了
2、Robotware6.14.00.01的虚拟连接成功,与正常的连接命令行输出类似谢谢您的宝贵意见!
-
@22225067 请问现在解决了吗?我也遇到了同样的问题
-
@22225067 请问配置新的ABB机械臂要修改robot_specific_config中的那些文件,我尝试修改了一下moveit2配置已知不能成功,可以解惑一下吗
-
@空白 这个具体怎么操作的呀?可以有讲解的嘛?可以联系一下嘛?呜呜呜