Matlab机械手碰撞检测应用
本文包含三个部分:
- Matlab碰撞检测的实现
- URDF文件的制作
- 机械手STL文件添加夹爪
一.Matlab碰撞检测的实现
首先上代码
%% 检测在结构环境中机器人是否与物体之间发生碰撞情况,如何避免?
% https://www.mathworks.com/help/robotics/ug/check-for-environmental-collisions-with-manipulators.html
%% 构建环境
% Create two platforms
clc
clear
platform1 = collisionBox(0.5,0.5,0.25);
platform1.Pose = trvec2tform([-1 0 0.2]);
worldCollisionArray = {platform1};
%% 创建figure对象显示环境:可以直接用exampleHelperVisualizeCollisionEnvironment(worldCollisionArray);
ax=gca;
% 显示桌子1并上色
[~, patchObj]=show(platform1,'Parent', ax);
patchObj.FaceColor = [1 0.6 0.9];
axis([-0.8,1,-0.8,1.2,0,1.4])%调整图框范围
view(141,22)%调节视角
hold on
%% 添加机器人模型:可更改为DH方向构建。
robot=importrobot("E:\3D\3D抓取\yaskawaGP12\urdf\yaskawaGP12.urdf");
robot.Gravity=[0 0 -9.81];
robot.DataFormat="column";
%robot = loadrobot("kinovaGen3","DataFormat","column","Gravity",[0 0 -9.81]);
show(robot,homeConfiguration(robot),"Parent",ax, 'Frames','off');startConfig=[3;1;0.8;0;0;pi];%关结空间
endConfig=[3;1;0.2;0;0;pi];
endEffector="link6";
%% 使用梯形速度规划从起点到终点的轨迹【关节空间】
q= trapveltraj([startConfig,endConfig],60,"EndTime",2);hold on
axis([-1.8,1,-1.8,1.2,0,2.2])%调整图框范围
view(141,22)%调节视角
axis on
hold on
title('机器人根据起点和终点位姿直接梯形速度的运动')
for i = 1:2:length(q)show(robot,q(:,i),"PreservePlot",false);%false 不留下重影poseNow = getTransform(robot, q(:,i), endEffector);%正运动学plot3(poseNow(1,4), poseNow(2,4), poseNow(3,4),'b.','MarkerSize',5)drawnow
end%%
% 初始化输出
inCollision = false(length(q),1); %===> zeros(length(q),1)
isConfigInCollision=false(length(q),1);
worldCollisionPairIdx = cell(length(q),1); % 元胞数组,保存与环境碰撞的部件和关节配置的索引
for i = 1:length(q)isConfigInCollision(i) = checkCollision(robot,q(:,i),Exhaustive='on');[inCollision(i),sepDist] = checkCollision(robot,q(:,i),worldCollisionArray,"IgnoreSelfCollision","on","Exhaustive","on");% sepDist为输出是机器人身体与世界碰撞对象之间的距离--->存储为矩阵[bodyIdx,worldCollisionObjIdx] = find(isnan(sepDist)); % 找到碰撞的部件。距离是空NaN,则发生碰撞worldCollidingPairs = [bodyIdx,worldCollisionObjIdx]; worldCollisionPairIdx{i} = worldCollidingPairs; %机器人部件索引第一列,环境物体索引第二列
end
isSelfCollision = any(isConfigInCollision);
isTrajectoryInCollision = any(inCollision);
%% 检测到碰撞并可视化构型,第一个和最后一个检测到的碰撞
collidingIdx1 = find(inCollision,1);%第一个:构型索引19
if(collidingIdx1)%collidingIdx2 = find(inCollision,1,"last");%最后一个:构型索引172% Identify the colliding rigid bodies.找到机器人中的碰撞部分collidingBodies1 = worldCollisionPairIdx{collidingIdx1}*[1 0]';%取碰撞的机器人部件第一列的=矩阵乘以[1,0]'%具体看矩阵维度% collidingBodies2 = worldCollisionPairIdx{collidingIdx2}*[1 0]';% Identify the colliding world bodies.找到环境中的碰撞部分collidingworld1 = worldCollisionPairIdx{collidingIdx1}*[0 1]';%取碰撞的机器人部件第一列的=矩阵乘以[1,0]'%具体看矩阵维度% collidingworld2 = worldCollisionPairIdx{collidingIdx2}*[0 1]';%% 显示环境,并将碰撞进行可视化exampleHelperHighlightCollisionBodies(robot,collidingBodies1 +1,ax);% hold on[~, patchObj]=show(worldCollisionArray{collidingworld1(1)},"Parent"',ax);patchObj.FaceColor = [1 0.8 0];title('发生碰撞的部分构型显示','Color', 'r')
elsetitle('未发生碰撞','Color', 'g')
end
代码中首先创建platform1箱体、robot机器手模型,后根据起点、终点规划轨迹,再图像化显示,然后进入正题判断碰撞,碰撞分自碰撞与外部碰撞;
此功能需要安装Robotics System Toolbox,下载路径:Robotics Toolbox - Peter Corke
下载后双击安装即可。
上面代码的urdf文件可以使用C:\Program Files\MATLAB\R2022a\toolbox\robotics\robotmanip\robotModels\roboturdf内的替代;
注意:loadrobot函数加载的模型文件与importrobot不同,后者需要URDF文件。
此部分可参考博客:Robotics System Toolbox中的机器人运动(6)-碰撞检测-CSDN博客
二.URDF文件制作
此处第一次接触,较艰难
参考博客:特别章节-0.1 SolidWorks导出机械臂的URDF模型各个关节坐标系设置_sw2urdf导入模型如何正确设置坐标系-CSDN博客
Solidworks_to_URDF导出教程 - 知乎
还有SW的安装:SolidWorks 2022 SP5.0 软件下载+安装教程XL
SW还需要安装转URDF插件:sw_urdf_exporter - ROS Wiki,下载后安装即可
补充:
注意图中每一处的选择,JointName内的名称不能与link1相同,JointType内需要选择对应部件,还有机械手是关节型的,link应一级一级展开
然后正常导出即可。
三.机械手STL文件添加夹爪
思路是把导出URDF里的STL文件link6加上夹爪就好,碰撞检测时就可以带夹爪判断了。
修改STL文件废了些时间,实际完全可以用Matlab写一个程序实现
目前用的时Meshlab软件修改,在文件-导入网格,打开对应文件。
右侧部件鼠标右击出现菜单,对部件的平移旋转等需要用矩阵操作,做这个的应该都了解矩阵
这就是操作界面,修改数值然后右下角Apply,注意前三个数值单位是米;
注意机械手上的link6部件不能动,动了其与机械手相对位置就不同了;
这样机械手抓取碰撞检测就完成了,后面还有Matlab导出DLL在C#语言调用的部分,问题不大,有一个Matlab函数返回多个参数需要在函数第一个参数设置返回数量,超过1则返回MWArray[]
RobotCollision matlab = new RobotCollision();
MWArray robot;
public Form1()
{InitializeComponent();robot = matlab.MyLoadRobot(@"E:\3D\3D抓取\yaskawaGP12\urdf\yaskawaGP12.urdf");
}private void button1_Click(object sender, EventArgs e)
{double z = double.Parse(textBox2.Text);MWArray boxSize = (MWNumericArray)new double[] { 0.5, 0.5, 0.25 };MWArray boxPose = (MWNumericArray)new double[] { -1, 0, 0.2 };MWArray box = matlab.GetBox(boxSize, boxPose);MWArray robotPose = new MWNumericArray(6, 2, new double[] { 3, 3, 1, 1, 0.8, z, 0, 0, 0, 0, Math.PI, Math.PI });MWArray result = matlab.RobotCollisionCheck(robot, box, robotPose);textBox1.Text = result.ToString();
}
相关资源下载:【免费】机械手碰撞检测相关资料资源-CSDN文库
相关文章:
Matlab机械手碰撞检测应用
本文包含三个部分: Matlab碰撞检测的实现URDF文件的制作机械手STL文件添加夹爪 一.Matlab碰撞检测的实现 首先上代码 %% 检测在结构环境中机器人是否与物体之间发生碰撞情况,如何避免? % https://www.mathworks.com/help/robotics/ug/che…...
【前端】几种常见的跨域解决方案代理的概念
几种常见的跨域解决方案&代理的概念 一、常见的跨域解决方案1. 服务端配置CORS(Cross-Origin Resource Sharing):2. Nginx代理3. Vue CLI配置代理:4 .uni-app在manifest.json中配置代理来解决:5. 使用WebSocket通讯…...
服务器有多少线程?发起一个请求调用第三方服务,是新增加一个请求吗?如果服务器线程使用完了怎么办?
目录 1. 服务器有多少线程? (1)服务器类型 (2)配置参数 (3)硬件资源 2. 发起一个请求调用第三方服务,是新增加一个线程吗? (1)同步调用 (2)异步调用 (3)HTTP 客户端 3. 如果服务器线程使用完了怎么办? (1)请求被拒绝 (2)性能下降 (3)解决方案…...
【Spring AI】基于SpringAI+Vue3+ElementPlus的QA系统实现一
整理不易,请不要吝啬你的赞和收藏。 1. 前言 这是 SpringAI 系列的第二篇文章,这篇文章将介绍如何基于 RAG 技术,使用 SpringAI Vue3 ElementPlus 实现一个 Q&A 系统。本文使用 deepseek 的 DeepSeek-V3 作为聊天模型,使用…...
前端快速生成接口方法
大家好,我是苏麟,今天聊一下OpenApi。 官网 : umijs/openapi - npm 安装命令 npm i --save-dev umijs/openapi 在根目录(项目目录下)创建文件 openapi.config.js import { generateService } from umijs/openapi// 自…...
【Qt 常用控件】多元素控件(QListWidget、QTabelWidgt、QTreeWidget)
**View和**Widget的区别? **View的实现更底层,**Widget是基于**View封装实现的更易用的类型。 **View使用MVC结构 MVC是软件开发中 经典的 软件结构 组织形式,软件设计模式。 M(model)模型。管理应用程序的核心数据和…...
java 读取sq3所有表数据到objectNode
1.实现效果:将sq3中所有表的所有字段读到objectNode 对象中,兼容后期表字段增删情况,数据组织形式如下图所示: 代码截图: 代码如下: package com.xxx.check.util;import java.sql.*; import java.util.Arr…...
react redux用法学习
参考资料: https://www.bilibili.com/video/BV1ZB4y1Z7o8 https://cn.redux.js.org/tutorials/essentials/part-5-async-logic AI工具:deepseek,通义灵码 第一天 安装相关依赖: 使用redux的中间件: npm i react-redu…...
C++20中的std::atomic_ref
一、std::atomic_ref 我们在学习C11后的原子操作时,都需要提前定义好std::atomic变量,然后才可以在后续的应用程序中进行使用。原子操作的优势在很多场合下优势非常明显,所以这也使得很多开发者越来习惯使用原子变量。 但是,在实…...
encodeURI(),encodeURIComponent()区别
encodeURI(),encodeURIComponent()区别 encodeURI(): 对整个url(链接/网络链接)进行编码。 对中文,完全编码。 对英文不带空格则不会编码,带空格则会对空格编码。 解码:decodeURI() 例如: let ChineseUrl "htt…...
Selenium:网页frame与多窗口处理
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、多窗口处理 1.1、多窗口简介 点击某些链接,会重新打开⼀个窗⼜,对于这种情况,想在新页⾯上操作,就 得先切换窗…...
自动驾驶---如何打造一款属于自己的自动驾驶系统
在笔者的专栏《自动驾驶Planning决策规划》中,主要讲解了行车的相关知识,从Routing,到Behavior Planning,再到Motion Planning,以及最后的Control,笔者都做了相关介绍,其中主要包括算法在量产上…...
开源机器人+具身智能 解决方案+AI
开源机器人、具身智能(Embodied Intelligence)以及AI技术的结合,可以为机器人领域带来全新的解决方案。以下是这一结合的可能方向和具体方案: 1. 开源机器人平台 开源机器人平台为开发者提供了灵活的基础架构,可以在此基础上结合具身智能和AI技术。以下是一些常用的开源机…...
【web自动化】指定chromedriver以及chrome路径
selenium自动化,指定chromedriver,以及chrome路径 对应这篇文章,可以点击查看,详情 from selenium import webdriverdef get_driver():# 获取配置对象option webdriver.ChromeOptions()option.add_experimental_option("de…...
高等代数笔记—线性变换
latex花体字母与花体数字 https://blog.csdn.net/weixin_39589455/article/details/133846783 https://blog.csdn.net/orz_include/article/details/123645710线性变换 线性空间 V V V到自身的映射称为 V V V的一个变换,最基本的是线性变换。 定义:变换…...
Kickstart自动化安装过程中自动选择较小的磁盘安装操作系统
Kickstart自动化安装过程中自动选择较小的磁盘安装操作系统 需求 在实际生成操作过程中,一般会遇到物理服务器存在多块盘的情况。 安装过程中,磁盘的标签是随机分配的,并不是空间较小的盘,就会使用较小的磁盘标签 而需求往往需要…...
2024BaseCTF_week4_web上
继续!冲冲冲 目录 圣钥之战1.0 nodejs 原型 原型链 原型链污染 回到题目 flag直接读取不就行了? 圣钥之战1.0 from flask import Flask,request import jsonapp Flask(__name__)def merge(src, dst):for k, v in src.items():if hasattr(dst, __geti…...
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡 背景 前端开发接口请求,调试,联调,接入数据,前端必不可少工具,postman是一个非常好…...
内网穿透的应用-Ubuntu本地Docker搭建pichome文件管理系统打造个人云相册
文章目录 前言1.关于pichome2.本地部署pichome3.简单使用pichome4. 安装内网穿透5.配置pichome公网地址6. 配置固定公网地址 前言 你是不是也经常遇到这样的尴尬:手机、电脑里堆满了照片和视频,想找一张特定的图片时却像在大海捞针一样无从下手…...
深度学习之神经网络框架搭建及模型优化
神经网络框架搭建及模型优化 目录 神经网络框架搭建及模型优化1 数据及配置1.1 配置1.2 数据1.3 函数导入1.4 数据函数1.5 数据打包 2 神经网络框架搭建2.1 框架确认2.2 函数搭建2.3 框架上传 3 模型优化3.1 函数理解3.2 训练模型和测试模型代码 4 最终代码测试4.1 SGD优化算法…...
DeepSeek AI R1推理大模型API集成文档
DeepSeek AI R1推理大模型API集成文档 引言 随着自然语言处理技术的飞速发展,大语言模型在各行各业的应用日益广泛。DeepSeek R1作为一款高性能、开源的大语言模型,凭借其强大的文本生成能力、高效的推理性能和灵活的接口设计,吸引了大量开发…...
怎麼使用靜態住宅IP進行多社媒帳號管理
隨著社交媒體平臺的多樣化,很多人發現一個社媒帳號已經無法滿足需求。以下是幾個常見場景: 企業需求:企業可能需要在不同平臺上運營多個品牌帳號,為每個市場地區單獨設立帳號。個人需求:一些自由職業者或內容創作者可…...
【Elasticsearch】Bucket Selector Aggregation
Elasticsearch 的Bucket Selector Aggregation是一种强大的管道聚合功能,用于根据条件过滤聚合结果中的桶(buckets)。它允许用户通过编写脚本来动态决定哪些桶应该被保留,哪些应该被过滤掉。以下是对Bucket Selector Aggregation的…...
CEF132 编译指南 MacOS 篇 - 启程:认识 CEF (一)
1. 引言 在当今的软件开发领域,将 Web 技术融入桌面应用程序已成为一种趋势。开发者们寻求一种方式,既能充分利用原生应用的性能,又能享受 Web 开发带来的高效和灵活性。Chromium Embedded Framework (CEF) 应运而生,它是一个基于…...
Python 操作 MongoDB 教程
一、引言 在当今数字化时代,数据的存储和管理至关重要。传统的关系型数据库在处理一些复杂场景时可能会显得力不从心,而 NoSQL 数据库应运而生。MongoDB 作为一款开源的、面向文档的 NoSQL 数据库,凭借其高性能、高可扩展性和灵活的数据模型…...
长安汽车发布“北斗天枢2.0”计划,深蓝汽车普及全民智驾
2月9日,长安汽车智能化战略“北斗天枢2.0”计划暨深蓝汽车全场景智能驾驶解决方案发布会在重庆盛大召开。此次发布会标志着长安汽车正式迈入智能化战略的新纪元,携手众多“中国智驾合伙人”,共同开启全民智驾元年。 发布会上,长安…...
SpringBoot速成(七)注册实战P2-P4
1.创建 数据库创建 依赖引入 <!-- mybatis起步依赖--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency> <…...
大语言模型RAG,transformer
1、RAG技术流总结 第一张图是比较经典的RAG知识图谱,第二张图是更加详细扎实的介绍图。 1.1 索引 坦白来说这部分的技术并不是大模型领域的,更像是之前技术在大模型领域的应用;早在2019年我就做过faiss部分的尝试,彼时索引技术已…...
Crowdin 在线本地化平台调用硅基流动AI预翻译
平台介绍 硅基流动(AI服务平台) 官网:https://siliconflow.cn/zh-cn/ 官方介绍 我主要使用:云服务平台 SilliconCloud 此平台已经将热门的开源大语言模型部署,花钱买额度,就能使用 API 最近有上线 Deep…...
第5章 数据库系统(选择|案例|论文)(重点★★★★★)
5.1 数据库管理系统1 数据库是长期存储在计算机内的、有组织的、可共享的数据集合,数据库系统是指在计算机信息系统中引入数据库后的系统,一般由数据库、数据库管理系统 (DataBaseManagement System,DBMS)、应用系统、数据库管理员(DataBase…...
linux部署node服务
1、安装nvm管理node版本 # 下载、解压到指定目录 wget https://github.com/nvm-sh/nvm/archive/refs/tags/v0.39.1.tar.gz tar -zxvf nvm-0.39.0.tar.gz -C /opt/nvm # 配置环境 vim ~/.bashrc~:这是一个路径简写符号,代表当前用户的主目录。在大多数 …...
【AI赋能】蓝耘智算平台实战指南:3步构建企业级DeepSeek智能助手
蓝耘智算平台实战指南:3步构建企业级DeepSeek智能助手 引言:AI大模型时代的算力革命 在2025年全球AI技术峰会上,DeepSeek-R1凭借其开源架构与实时推理能力,成为首个通过图灵测试的中文大模型。该模型在语言理解、跨模态交互等维…...
hyperf知识问题汇总
1、简单说下 hyperf(什么是 hyperf) 答:hyperf 是一个依赖swoole扩展的 php 开源开发框架,它由黄朝辉团队设计创建维护,具备简洁而强大的组件和超强的并发性能,而且还支持微服务架构,例如&…...
【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA
【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA data source1: BH coordination tabledata source2:BH layer tableprocess 1:Collect BH List To Layer Tableprocess 2:match Reduced Level from "Layer"+"BH"data source1: BH coordination…...
DeepSeek-R1技术革命:用强化学习重塑大语言模型的推理能力
引言:低成本高性能的AI新范式 在2025年1月,中国AI公司DeepSeek发布了两个标志性模型——DeepSeek-R1-Zero与DeepSeek-R1,以仅600万美元的训练成本实现了与OpenAI O1系列(开发成本约5亿美元)相当的推理性能,…...
SQLite 约束
SQLite 约束 SQLite 是一种轻量级的数据库管理系统,它以其简洁的设计和高效的性能在众多数据库系统中脱颖而出。在SQLite中,约束是一种用于确保数据完整性和一致性的机制。本文将详细介绍SQLite中的各种约束,包括它们的用途、语法以及在实际应用中的注意事项。 1. 约束概述…...
Vue.js 状态管理库Pinia
Pinia Pinia :Vue.js 状态管理库Pinia持久化插件-persist Pinia :Vue.js 状态管理库 Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。 要使用Pinia ,先要安装npm install pinia在main.js中导入Pinia 并使用 示例…...
qwen2.5-vl-7B视觉大模型 私有化部署webUI
服务器选用:算力云 部署qwen2.5-vl-7B,24g显卡跑不起图,单问问题就占20g左右。有能力可以用大点的显卡 一、下载模型 Qwen2.5-VL-7B-Instruct 有conda ,可以在conda下操作,不知道conda的同学可以参考本博主之前的文章…...
Spring Boot 线程池自定义拒绝策略:解决任务堆积与丢失问题
如何通过自定义线程池提升系统稳定性 背景 在高并发系统中,线程池管理至关重要。默认线程池可能导致: 资源浪费(创建过多线程导致 OOM)任务堆积(队列满后任务被拒绝)任务丢失(默认拒绝策略丢…...
C++17 新特性解析
C++17 是 C++ 标准的一个重要更新,它在 C++11/14 的基础上引入了许多新特性,进一步简化了代码编写、提升了性能和类型安全性。以下是 C++17 的主要特性分类介绍: 一、语言核心改进 1. 结构化绑定(Structured Bindings) 允许将元组、结构体或数组的成员直接解包到变量中。…...
支持向量机相关文献
根据最新的研究动态和文献综述,当前支持向量机(SVM)的研究方向和内容主要集中在以下几个方面: 1. 提高训练效率 并行计算与分布式计算:随着数据规模的增加,SVM的训练时间往往较长,难以满足实时…...
线上hbase rs 读写请求个数指标重置问题分析
问题描述: 客户想通过调用hbase的jmx接口获取hbase的读写请求个数,以此来分析HBase读写请求每日增量。 但是发现生产,测试多个集群,Hbase服务指标regionserver读写请求个数存在突然下降到0或者大幅度下降情况。 需要排查原因: 某个Region的读写请求数:会发现经常会重置为…...
USB子系统学习(四)用户态下使用libusb读取鼠标数据
文章目录 1、声明2、HID协议2.1、描述符2.2、鼠标数据格式 3、应用程序4、编译应用程序5、测试6、其它 1、声明 本文是在学习韦东山《驱动大全》USB子系统时,为梳理知识点和自己回看而记录,全部内容高度复制粘贴。 韦老师的《驱动大全》:商…...
WPF 设置宽度为 父容器 宽度的一半
方法1:使用 绑定和转换器 实现 创建类文件 HalfWidthConverter public class HalfWidthConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value is double width){return width / 4…...
网络工程师 (30)以太网技术
一、起源与发展 以太网技术起源于20世纪70年代,最初由Xerox公司的帕洛阿尔托研究中心(PARC)开发。最初的以太网采用同轴电缆作为传输介质,数据传输速率为2.94Mbps(后发展为10Mbps),主要用于解决…...
2025.2.11
1> 制作一个闹钟软件 .h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLabel> #include <QLineEdit> #include <QPushButton> #include <QTime> #include <QTimer> #include <QTimeEdit> #include <QDa…...
HTML应用指南:利用POST请求获取接入比亚迪业态的充电桩位置信息
在新能源汽车快速发展的今天,充电桩的分布和可用性成为了影响用户体验的关键因素之一。比亚迪作为全球领先的新能源汽车制造商,不仅在车辆制造方面取得了卓越成就,也在充电基础设施建设上投入了大量资源。为了帮助用户更方便地找到比亚迪充电桩的位置,本篇文章,我们将探究…...
系统URL整合系列视频四(需求介绍补充)
视频 系统URL整合系列视频四(需求补充说明) 视频介绍 (全国)大型分布式系统Web资源URL整合需求(补充)讲解。当今社会各行各业对软件系统的web资源访问权限控制越来越严格,控制粒度也越来越细。…...
PRC框架-Dubbo
RPC框架 RPC(Remote Procedure Call,远程过程调用)框架是一种允许客户端通过网络调用服务器端程序的技术。以下是常见的RPC框架及其特点: 1. 基于HTTP/REST的RPC框架 特点:简单易用,与Web开发无缝集成&am…...
Win10环境借助DockerDesktop部署最新MySQL9.2
Win10环境借助DockerDesktop部署最新MySQL9.2 前言 作为一杆主要撸Java的大数据平台开发攻城狮,必不可少要折腾各种组件,环境和版本一直是很头疼的事情。虽然可以借助Anaconda来托管Python的环境,也可以使用多个虚拟机来部署不同的环境&…...