












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


总体上采用插件机制,即机器人模块Rapid.Robot.Plugin依赖主程序Rapid.CAX.exe,主程序动态加载机器人模块。
模块内采用MVVM架构,以分离界面和逻辑实现。
命名约定:
交互过程
Rapid.Robot.Plugin项目创建,Ribbon界面创建过程这里不再赘述,可以参考之前的内容创建。
单模型多机械臂的结构设计,详细参照 样例模型
由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);
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);
}
}
机器人控制和模拟在《一种机器人运动模拟装置》一文中做了比较详细的介绍,这里不再赘述。
以更改参数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));
}
}
本文涉及的内容主要是前文几部分的综合应用,这里主要列举了关键的代码实现,详细的代码实现可以从gitee上Rapid.CAX项目上下载。
最终效果如下:
https://www.bilibili.com/video/BV1Pu411q7JK/
希望本文可以对大家开发机器人应用有所启发~
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。