• 机器人动力学与参数辨识学习笔记(一)



    近来由于课题需要,老师给报名了睿慕课的《快速搭建“机器人动力学-参数辨识-轨迹规划-运动控制”的完整框架》这个课程,虽然利益不相关但是在这里放上睿慕课学院的链接
    →→→睿慕课学院

    其实我是学习过一些机器人学以及了解过机器人动力学一些知识的,但是考虑到睿慕课学院的课程比较成体系,而且会有一些实践性比较强的练习讲解,所以打算再认真学习学习。

    毕竟这是个付费课程,我也没法把课程内容都搬过来,所以这里尽量记录一些我的理解和练习。
    那么开始

    ❤ 2022.8.1 ❤
    其实我是8.3才开始学的,但是课程是8.1号开始的,所以凑个整。。。
    话说昨天一天都在关心台海局势,无心学习。。。

    第一章 概述

    △ 机器人控制器整体架构介绍

    啊,就是个科普,再加上推销主讲人自家公司的产品,没啥好写的,略

    我打算写一个《从零开始搭建CoDeSys机器人》的文章,但考虑到时间精力的问题可能会拖得比较久。。。嗯。。。具体的再说吧。

    △ 机器人动力学的作用及重要性

    这部分还是以科普为主,主讲人提出了机器人动力学控制的四层塔式架构

    在这里插入图片描述

    △ 机器人动力学应用

    ○ 动力学方程的四种形式

    · 拉格朗日形式

    在这里插入图片描述

    · 牛顿-欧拉形式

    在这里插入图片描述

    上面两种方式是等效的,可以互相转化,拉格朗日形式比较紧凑,但是牛顿-欧拉形式运算速度更快

    · 参数分离形式

    在这里插入图片描述

    · 最小参数集

    在这里插入图片描述

    ○ 机器人动力学参数辨识

    参数辨识主要针对动力学方程的 参数分离形式最小参数集 中的   p \ \boldsymbol{p}  p矩阵,

    · 机器人动力学参数辨识流程

    在这里插入图片描述

    ○ 轨迹规划

    · 最优调速规划

    在这里插入图片描述

    · 最优时间规划

    在这里插入图片描述

    关于轨迹规划这里还看不懂,希望后面能有详细的讲解哈

    △ 预备知识及相关教材

    预备知识主要是一些很基础的高数、线代计算以及力学、控制论的知识(至少主讲人是这样讲的),这里我就不贴了。

    关于教材有这么几本推荐
    在这里插入图片描述

    △ 第一章作业 使用Simscape搭建二连杆模型并操作

    作业要求使用Simulink中的Simscape模块完成,说到Simscape,其实本应在MBD的课程里学会的,但是。。。反正现在得从头学起

    ○ Simscape基本操作学习

    这部分内容就是官方的教程内容
    →→→https://ww2.mathworks.cn/help/physmod/sm/getting-started-with-simmechanics.html

    · 建立模型及参数设置

    首先在命令窗口输入“smnew”,如果没有安装Simscape模块,Matlab会提示安装,如果安装了则会打开如下所示的Simulink界面
    在这里插入图片描述
    在这里插入图片描述

    建立简单连杆模型
    删除用不到的模块后,使用坐标转换模块和刚体模块组成连杆模型。

    刚体模块:
    在这里插入图片描述

    坐标转换模块:
    在这里插入图片描述

    由于刚体坐标系默认位于其重心,需要建立前端至重心,重心至末端两个坐标转换。因此将坐标转
    换模块复制后翻转,将两个B端连接至刚体模块处。

    为什么要这样我也不知道

    在这里插入图片描述
    然后参考表格设置属性
    在这里插入图片描述
    因为属性设置里面有未定义的变量,所以会变红
    在这里插入图片描述

    将模型设置为子系统
    将上述连杆模型的两个坐标转换与刚体选中,右键选择Create Subsystem from Selection将其创建为一个子系统
    在这里插入图片描述
    在这里插入图片描述

    然后双击打开子系统,在conn1上双击,然后这里选择left,让连接点在左边
    在这里插入图片描述
    在这里插入图片描述

    将子系统连接到基坐标上
    在这里插入图片描述
    然后
    在这里插入图片描述
    输入参数窗口
    在这里插入图片描述
    点击播放
    在这里插入图片描述
    然后是这样的效果
    在这里插入图片描述
    上面是建立连杆的基础操作,下面用一个实例来练习

    · 建立简单倒立摆模型

    在这里插入图片描述
    建立模型
    新建一个模板,把刚刚建立的简单连杆模型复制进来,然后在Library Browser中选择Simscape > Multibody >
    Joints
    ,添加一个转动关节,并将各模块连接好如图
    在这里插入图片描述

    然后修改基座刚体模块参数:
    在这里插入图片描述

    · 运行简单倒立摆模型

    运行之前需要进行一些初始配置

    设置重力
    由于转动关节默认绕Z轴转动,为了保证重力与转动轴方向垂直,在本教程中将重力改
    为沿Y轴方向:双击机制配置模块,设置Uniform Gravity > Gravity参数至[0 -9.81 0]
    在这里插入图片描述

    更改倒立摆初始位置
    由于连杆位置由关节决定,双击转动关节,设置State Targets > Position改变位置
    在这里插入图片描述

    设置求解器
    在这里插入图片描述

    以上是资料里面写的,但是我找了半天没找到这个Modeling标签,于是我找了matlab官网的教程,英文原版也是这么写的
    →→→https://ww2.mathworks.cn/help/physmod/sm/gs/model-pendulum.html
    在这里插入图片描述
    这就很奇怪,然后我在我的Simulink(2018b版本)里面找了半天相关的设置,找到了这个
    在这里插入图片描述
    在这里插入图片描述
    看来官方教程的版本和我的不太一样。。。可能是我的版本太旧了吧。。。
    不过总算是找到了

    更新模型
    在菜单标签页Modeling中点击Update Model

    这个选项在我的里面也没有,不过不影响

    最后运行
    这个杆就开始摆起来了(开摆。。。)
    在这里插入图片描述

    · 获取简单倒立摆模型运动状态

    添加传感器模块
    在上一节建立的倒立摆模型中,双击转动关节模块,在Sensing菜单中选择输出Position与Velocity,模块会增加两个信号端口q与w,输出为倒立摆的关节位置与速度。
    在这里插入图片描述

    然后在模型中添加如下两钟模块
    在这里插入图片描述
    双击To Workspace模块,分别设置两个模块的Variable Name为q与w,并通过PS-Simlink Converter模块,连接至关节模块的相应信号端口q与w,将关节位置与速度输出至MATLAB主工作空间。
    在这里插入图片描述

    说起来,虽然我以前用过Simulink来做仿真,但是还是第一次知道Simulink向Matlab输送变量需要这样设置

    · 分析简单倒立摆模型

    得到位置和速度的变化曲线

    figure; % 打开一个新图像 
    hold on; 
    plot(q); % 倒立摆关节位置曲线 
    plot(w); % 倒立摆关节速度曲线
    
    • 1
    • 2
    • 3
    • 4

    结果
    在这里插入图片描述

    关节在0°作为初始角度的相图

    figure; 
    plot(q.data, w.data);
    
    • 1
    • 2

    结果
    在这里插入图片描述

    奇怪 为啥我跟材料里给出的不太一样。。。
    在这里插入图片描述

    然后修改转动关节的初始值可以改变图形

    为转动关节增加阻尼
    双击转动关节模块,修改State Targets > Position为0°,并设置Internal Mechanics >Damping8e-5(N*m)/(deg/s),为倒立摆增加阻尼系数,增加运动过程中的能量消耗,会使得倒立摆震荡幅度随时间逐渐减小
    在这里插入图片描述

    figure; % 打开一个新图像 
    hold on; 
    plot(q); % 倒立摆关节位置曲线 
    plot(w); % 倒立摆关节速度曲线
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    这时候再这样

    figure; 
    plot(q.data, w.data);
    
    • 1
    • 2

    在这里插入图片描述
    嗯。。。有意思

    · 控制简单倒立摆模型

    通过关节对其施加力或力矩来控制模型的运动状态:

    双击转动关节模块,设置Actuation > Torque为Provided by Input,模块会增加一个用于力矩输入的信号端口

    然后添加如下两种模块
    在这里插入图片描述
    连接
    在这里插入图片描述

    双击Sine Wave模块,设置Amplitude0.06,此时模块会产生-0.06N至0.06N的正弦力矩
    在这里插入图片描述

    双击转动关节模块,修改State Targets > Position

    然后还是重复上面的绘图指令

    figure; % 打开一个新图像 
    hold on; 
    plot(q); % 倒立摆关节位置曲线 
    plot(w); % 倒立摆关节速度曲线
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    figure; 
    plot(q.data, w.data);
    
    • 1
    • 2

    在这里插入图片描述

    好了 教程到此结束!

    ○ 第一章作业

    作业要求
    在这里插入图片描述
    在这里插入图片描述
    二连杆如图所示
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    · 搭建二连杆模型

    新建Simscape模板,然后直接把刚才建立的简单连杆模型复制进来,添加旋转关节,另外根据要求,基坐标和世界坐标有个转换关系,所以连接如图

    【!!!】这里其实写错了,基坐标的转换矩阵位置不对,后面已经改正,这里为保证真实记录就不改了

    在这里插入图片描述

    然后就是设置属性。

    在这里遇到一个问题,教程里面给出的是长宽高尺寸和密度,也就是说认为连杆是均质的,但是作业里面给出了杆长和重心位>置以及各截面的惯量,那么该怎么配置呢?
    经过百度我找到了这个教程
    →→→Simscape Multibody Solid和Rigid Transform模块说明 说明
    需要更改一下属性inertia→typecustom,然后在里面设置就可以
    在这里插入图片描述
    ※【这里我非常细心的发现了,材料里给出的转动惯量向量是**[Ixx,Iyy,Izz,Ixy,Ixz,Iyz]**,而要求的输入格式是 Moments of Inertia:[Ixx,Iyy,Izz];Products of Inertia:[Iyz,Ixz,Ixy],是资料里面给错了还是就是需要调整一下呢?我觉得可以问一问老师】
    ※※【但是我看了数据。。。那两个都是0.。。】

    在这里插入图片描述

    而且因为这里直接输入了质量,所以不能再用之前的密度来计算了,要把之前的变量删掉,不然会报错,参考默认设置,直接输入1000(反正用不到)(应该吧。。。)

    然后是重力
    在这里插入图片描述
    然后调整下基座的尺寸
    在这里插入图片描述

    关于基坐标和世界坐标的变换
    关于怎么设置,虽然没查资料,但我觉得是这样
    在这里插入图片描述
    运行
    在这里插入图片描述

    奇怪,怎么是朝向Z+方向的。。。我再调整下

    【!!!】这里其实是因为我把坐标转换模块的方向弄错了,已经在后面改过来了,但是为了保证过程真实,这里就不改了

    在这里插入图片描述
    嗯,这样就对了
    在这里插入图片描述

    这样看不出来是两个杆,我换个颜色
    在这里插入图片描述
    好,完成!

    · 将三维模型赋予二连杆

    根据之前MBD课程的课件,在Solid模块里选择from file
    在这里插入图片描述

    这里我选择from file之后报错了,大概意思是因为改变了物理尺寸,所以重心位置不对了,这里我选择custom试试

    在这里插入图片描述
    然后连杆1
    在这里插入图片描述
    连杆2
    在这里插入图片描述

    运行
    在这里插入图片描述
    emmm。。。。有点小问题,我猜是我的坐标转换模块位置放错了,甚至方向也放错了,怪不得我直接按照要求的参数做不成功,改一改
    在这里插入图片描述
    然后参数改成和资料里一样
    在这里插入图片描述
    运行
    在这里插入图片描述
    诶嘿,还是有问题
    经过观察,发现是第一个连杆的模型重心和参数不匹配,模型的坐标原点并不在中间
    在这里插入图片描述
    将几何中心修改成重心位置试试
    连杆1:
    在这里插入图片描述

    连杆2:
    在这里插入图片描述

    运行
    在这里插入图片描述
    嗯 这样就对了
    好,搞定!

    · 将二连杆模型封装为子系统

    题目要求里说输入为控制(位置/力矩)指令 c,输出为关节角度q、关节速度 qp、关节加速度 qpp、关节力矩 qt 与末端位姿,这里没说要用哪个关节作为控制,而且后面的题目有要求对两个关节同时控制,所以我就把两个关节都引出来
    子系统如下:
    在这里插入图片描述
    主系统如下:
    在这里插入图片描述
    那么,问题来了,怎么输出末端位姿。。。
    我当然知道末端位姿是可以算出来的,但是。。。懒。。。
    所以我找了一些资料,知道这个模块可以计算出坐标
    在这里插入图片描述

    资料在这里
    →→→Simscape Multibody – 使用Transform Sensor 测量运动
    但是文章里只说可以显示坐标,没说可以显示欧拉角,我来试试

    查了一下帮助文档,坐标转换传感器模块是可以显示角度的,在这里选择Axis即可,但是和题目要求的YPR是不是等同我也不太确定
    【这里可以问问老师】
    在这里插入图片描述
    在这里插入图片描述

    修改后的主系统如下,我把角度和坐标放在了一个向量里面
    在这里插入图片描述
    搞定!

    · 关节位置控制

    题目要求将关节 Actuation 设置为位置控制,Damping 设置为 1N*m,控制指令输入设置为幅值 0.5, 频率 1Hz 的正弦信号进行仿真,输出位置及力矩图像(提示:需要更改 Simulink-PS Converter 输入为二阶 Filter Input)
    在这里没有说对哪个关节施加控制,那我就当成对两个关节同时控制了。
    把关节输入修改为位置控制
    在这里插入图片描述
    修改关节阻尼
    在这里插入图片描述

    添加正弦输入模块和转换模块
    在这里插入图片描述
    修改正弦输入参数
    在这里插入图片描述
    然后按照提示修改转换模式
    在这里插入图片描述

    【为什么要这样设置呢???】

    设置运行时间10s,然后运行

    这里报了个错
    在这里插入图片描述
    看了一下,大概是关节力矩设置的问题,我把输入模式改为位置输入之后,就把力矩输入选了none,看来是不行的,于是选成了如下所示
    在这里插入图片描述
    就好了~

    再运行
    OK~
    这样的效果
    在这里插入图片描述
    然后把位置和力矩输出出来

    figure;
    plot(q1,'r')
    hold on
    plot(t1,'b')
    legend('位置','力矩')
    title('关节1位置和力矩')
    
    figure;
    plot(q2,'r')
    hold on
    plot(t2,'b')
    legend('位置','力矩')
    title('关节2位置和力矩')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    得到曲线如图
    在这里插入图片描述
    在这里插入图片描述
    搞定!

    · 关节力矩控制

    〇 将关节 Actuation 设置为力矩控制,Damping 设置为 0.1N*m,控制指令输入设置为常数 0.0,输出关节位置图像

    首先修改关节输入模式
    在这里插入图片描述
    修改阻尼
    在这里插入图片描述
    修改模型
    在这里插入图片描述
    运行程序

    figure;
    plot(q1,'r')
    hold on;
    plot(q2,'b')
    title('关节1、关节2位置图像')
    legend('关节1','关节2')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    得到曲线
    在这里插入图片描述

    〇 将关节 Actuation 设置为力矩控制,Damping 设置为 0.1N*m,关节一控制指令输入设置为常数 1.0,关节二控制指令输入设置为常数 0.3,输出关节位置图像
    和上面差不多,改一下参数
    在这里插入图片描述
    曲线
    在这里插入图片描述
    感觉没什么变化呀

    好吧,第一章的作业就完了,下面等公布答案之后再来订正。

  • 相关阅读:
    Linux文件/目录管理
    css实现水平垂直居中的七种方式
    nodejs微信小程序+python+PHP-维斯公司财务管理系统的设计与实现-计算机毕业设计推荐
    Axios笔记
    AI 与大模型引新安全威胁?亚马逊云科技与领创集团的探索和实践
    试试就逝世
    RecyclerView源码解析(二):结合LinearLayout分析绘制流程
    Python list列表添加元素的3种方法
    FPGA NVMe SSD SQ
    27、Java高级特性——集合、ArrayList集合、LinkedList集合、List接口、ArrayList和LinkedList的区别
  • 原文地址:https://blog.csdn.net/ooorczgc/article/details/126142901