基于前文介绍的Ribbon界面、插件化、MVVM模式等内容,我们搭建了一个软件雏形。本文将综合之前的内容在RapidCAX框架中集成Robot组件,实现一个简单的机器人正向模拟模块。

1 目标

基于MVVM模式在RapidCAX中增加以下的机器人交互界面:

  • 加载机器人模型后,在左侧的目录树里面显示机器人模型的名称
  • 在目录树中选中机器人节点后,在右侧的属性面板中显示机器人的配置参数
  • 修改机器人的关节参数,更新机器人模型,实现正向模拟

2 整体设计

总体上采用插件机制,即机器人模块Rapid.Robot.Plugin依赖主程序Rapid.CAX.exe,主程序动态加载机器人模块。

模块内采用MVVM架构,以分离界面和逻辑实现。

命名约定:

  • ProjectBrowser:项目目录树
  • PropertyView: 属性面板

交互过程

  • 点击加载机器人命令由RobotViewModel处理,加载模型并显示
  • RobotViewModel监听ProjectBrowerViewModel的选择修改,并创建PropertyView和PropertyViewModel
  • 修改属性后,RobotPropertyView通知RobotModel更改机器人关节参数,并更新视图

3 具体实现

Rapid.Robot.Plugin项目创建,Ribbon界面创建过程这里不再赘述,可以参考之前的内容创建。

3.1 机器人描述

单模型多机械臂的结构设计,详细参照 样例模型

3.2 模型加载

MachineTemplate类实现,具体参考代码实现。

加载后创建RobotModel对象。

//RobotViewModel.cs

    var template = AnyCAD.Robot.MachineTemplate.Load(dlg.FileName, (int progress) =>
{
//TODO:
}); if (template == null)
{
MessageBox.Show("打开配置文件失败");
return;
} var robot = template.CreateInstance();
viewer3d.ShowSceneNode(robot); mRobotControl = new RobotModel(robot);
viewer3d.ShowSceneNode(mRobotControl.TrackingPath); var treeNode = new BrowserTreeNode { DisplayName = mRobotControl.Name, Tag = mRobotControl };
MainWindow.Instance()?.ProjectBrowser.TreeNodes.Add(treeNode);

3.3 动态创建属性

RobotViewModel收到选择了机器人后,动态创建RobotPropertyView并挂接到属性面板上。

//RobotViewModel.cs
void OnSelectionChagned(object? sender, PropertyChangedEventArgs e)
{
var pbCtrl = MainWindow.Instance()?.ProjectBrowserCtrl;
if (pbCtrl == null)
return; var node = (BrowserTreeNode)pbCtrl.SelectedItem;
if(node == null)
return ; if(node.Tag == mRobotControl && mRobotControl!=null)
{
var panel = MainWindow.Instance()?.PropertyPanel;
if(panel != null)
panel.Content = new RobotPropertyView(mRobotControl);
}
}

3.4 机器人关节修改

机器人控制和模拟在《一种机器人运动模拟装置》一文中做了比较详细的介绍,这里不再赘述。

以更改参数A属性为例,ViewModel部分代码如下:

//RobotPropertyViewModel.cs
private uint mBaseOffset = 1; //用来调整轴的起始位置偏移 public double A { get => mRobot.GetVariable(mArmIndex, 0+ mBaseOffset); set=> SetProperty(0 + mBaseOffset, value, nameof(A)); } Vector3 mFinalPosition = new Vector3(0);
void SetProperty(uint idx, double val, string name)
{
var old = mRobot.GetVariable(mArmIndex, idx);
var delta = val - old;
if(SetProperty(ref old, val, name))
{
// 更新关节参数
mRobot.AddVariable(mArmIndex, idx, delta); var viewer3D = MainWindow.Instance()?.Viewer3D;
viewer3D?.RequestDraw(EnumUpdateFlags.Scene); // 计算末端点的位置
var trf = mRobot.GetFinalPosition(mArmIndex);
mFinalPosition.x = mFinalPosition.y = mFinalPosition.z = 0;
mFinalPosition.applyMatrix4(trf); // 增加路径点
mRobot.AddTrackingPoint(mFinalPosition); // 更新界面
OnPropertyChanged(nameof(FinalPositionX));
OnPropertyChanged(nameof(FinalPositionY));
OnPropertyChanged(nameof(FinalPositionZ));
}
}

4 总结

本文涉及的内容主要是前文几部分的综合应用,这里主要列举了关键的代码实现,详细的代码实现可以从gitee上Rapid.CAX项目上下载。

最终效果如下:

https://www.bilibili.com/video/BV1Pu411q7JK/

希望本文可以对大家开发机器人应用有所启发~

.NET6: 开发基于WPF的摩登三维工业软件 (10) - 机器人的更多相关文章

  1. .NET6: 开发基于WPF的摩登三维工业软件 (2)

    在<.NET6: 开发基于WPF的摩登三维工业软件 (1)>我们创建了一个"毛坯"界面,距离摩登还差一段距离.本文将对上一阶段的成果进行深化,实现当下流行的暗黑风格UI ...

  2. .NET6: 开发基于WPF的摩登三维工业软件 (7)

    做为一个摩登的工业软件,提供可编程的脚本能力是必不可少的能力.脚本既可以方便用户进行二次开发,也对方便对程序进行自动化测试.本文将结合AnyCAD对Python脚本支持的能力和WPF快速开发带脚本编辑 ...

  3. .NET6: 开发基于WPF的摩登三维工业软件

    MS Office和VisualStudio一直引领着桌面应用的时尚潮流,大型的工业软件一般都会紧跟潮流,搭配着Ribbon和DockPanel风格的界面.本文将介绍WPF下两个轻量级的Ribbon和 ...

  4. .NET6: 开发基于WPF的摩登三维工业软件 (8) - MVVM

    基于WPF开发界面的一个很大优势是可以方便地基于MVVM设计模式开发应用.本文从应用的角度基于MVVM实现参数化管材的创建界面. 1 MVVM MVVM是Model-View-ViewModel的简写 ...

  5. 封装:简要介绍自定义开发基于WPF的MVC框架

    原文:封装:简要介绍自定义开发基于WPF的MVC框架 一.目的:在使用Asp.net Core时,深感MVC框架作为页面跳转数据处理的方便,但WPF中似乎没有现成的MVC框架,由此自定义开发一套MVC ...

  6. (转)基于 WPF + Modern UI 的 公司OA小助手 开发总结

    原文地址:http://www.cnblogs.com/rainlam163/p/3365181.html 前言: 距离上一篇博客,整整一个月的时间了.人不能懒下来,必须有个阶段性的总结,算是对我这个 ...

  7. 基于 WPF + Modern UI 的 公司OA小助手 开发总结

    前言: 距离上一篇博客,整整一个月的时间了.人不能懒下来,必须有个阶段性的总结,算是对我这个阶段的一个反思.人只有在总结的过程中才会发现自己的不足. 公司每天都要在OA系统上上班点击签到,下班点击签退 ...

  8. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇二:基于OneNote难点突破和批量识别

    篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...

  9. 快速开发基于 HTML5 网络拓扑图应用

    采用 HT 开发网络拓扑图非常容易,例如<入门手册>的第一个小例子麻雀虽小五脏俱全:http://www.hightopo.com/guide/guide/core/beginners/e ...

随机推荐

  1. kubernetes基础——1.基本概念

    一.kubernetes特性 自动装箱,自我修复,水平扩展,服务发现和负载均衡,自动发布和回滚,密钥和配置管理,存储编排,批量处理执行. 二.kubernetes cluster Masters * ...

  2. 07.python语法入门--流程控制

    分支结构 什么是分支结构 为什么要用分支结构 如何使用分支结构 if语法 if应用案例 循环结构 什么是循环结构 为什么要用循环结构 如何使用循环结构 while循环语法 while循环应用案例 fo ...

  3. Solution -「AGC 003D」「AT 2004」Anticube

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个数 \(a_i\),要求从中选出最多的数,满足任意两个数之积都不是完全立方数.   \(n\le10^5\) ...

  4. CoRR 2018 | Horovod: Fast and Easy Distributed Deep Learning in Tensorflow

    将深度学习模型的训练从单GPU扩展到多GPU主要面临以下问题:(1)训练框架必须支持GPU间的通信,(2)用户必须更改大量代码以使用多GPU进行训练.为了克服这些问题,本文提出了Horovod,它通过 ...

  5. TCP三次握手原理

    本文主要讲述的是 1.TCP协议三次握手原理,以及为什么要三次握手,两次握手带来的不利后果. 2.TCP协议四次挥手原理,为什么要四次挥手. TCP协议三次握手原理: 首先,给张图片,建立TCP三次握 ...

  6. Burp intruder暴力攻击web口令

    实验目的 利用Burp intruder功能爆破出后台登陆密码admin. 实验原理 1)Burp Suite是Web应用程序测试的最佳工具之一,其多种功能可以帮我们执行各种任务.请求的拦截和修改,扫 ...

  7. 使用 matplotlib 显示彩色图像

    详细说明见代码注释 """ 介绍如何使用 matplotlib 输入.输出 彩色图像,并简要介绍如何将数组表示形式的图像数据显示为图像 """ ...

  8. 帆软思迈特软件Smartbi两家区别在哪里?

    简单介绍下,从前端展现市场来看,国内这几年帆软算是做的比较好的一家公司,整体市场营销,以及产品易用性也是不错.思迈特公司也是一家专门从事做数据分析平台的公司,也有接近20年的历史,早期从银行.金融证券 ...

  9. Linux性能优化实战CPU篇之软中断(三)

    一.软中断 1,中断的定义 a>定义 举例:你点了一份外卖,在无法获知外卖进度的情况下,配送员送外卖是不等人的,到了发现没人取会直接走,所以你只能苦苦等着,时不时去门口看送到没有,无法干别的事情 ...

  10. WCF学习笔记——Day1:一个WCF demo

    Visual Studio2017,使用IIS托管.文中涉及一些WCF的基本概念,e.g.服务契约.托管等.可以先阅读<WCF服务编程>第一章. 1.新建一个WCF服务库(WCF Serv ...