• .NET6: 开发基于WPF的摩登三维工业软件 (10) - 机器人


    基于前文介绍的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/

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

  • 相关阅读:
    GSAP动画
    纳米TiO-聚苯乙烯微球复合物/聚苯乙烯中空微球表面包覆Fe3O4/二氧化钛核壳粒子的制备方式
    Android OpenCV(六十八):决策树
    Windows实时运动控制软核(一):LOCAL高速接口测试之C#
    「大屏」上车跑出加速度,哪些供应商在「领跑」娱乐中控
    异步过渡方案—Generator
    vue页面和 iframe多页面无刷新方案和并行存在解决方案
    如何在Go中使用操作符进行数学运算
    FFplay文档解读-38-视频过滤器十三
    Linux 内核提权漏洞
  • 原文地址:https://www.cnblogs.com/anycad/p/anycad-robot-rapid-cax.html