Matlab机器人工具箱(3-2):五自由度机械臂(轨迹规划)

轨迹规划可以分为关节空间的轨迹规划笛卡尔空间的轨迹规划

  • 关节空间规划:用时小,计算量少
    [q,qt,qtt]=jtraj(q1,q2,t);
    返回关节的位置、速度、加速度
    使用五次多项式插值

  • 笛卡尔空间规划:对于直线、圆形等末端轨迹形状要求严格的场合
    Ts=ctraj(T1,T2,length(t));
    返回末端位姿
    使用带抛物线过渡的直线规划(对位姿矩阵的3个位置量)

  • 所用函数:
    p = transl(Ts);
    轨迹的位移部分

01 关节空间轨迹规划

绘制图为:

  1. 机械臂位置及其运动过程
  2. 关节 位置&速度&加速度 随时间变化曲线
  3. 末端执行器轨迹(x-y视图)
  4. 带轨迹标记的运动过程
% RoboticToolbox v10
% 关节空间轨迹规划
clc
 clear
%模型导入
    mdl_5dof    
    du = pi/180;   

%% 运动学轨迹
    % 改
    t=[0:0.1:8];%8秒完成轨迹,步长0.05
    
    %产生位姿矩阵法1:直接给出关节角度
    T1 = bot.fkine([20 50 -30 -25 -10]*du);%生成一个位姿
    T2 = bot.fkine([70 10 -60 -50 30]*du);%生成一个位姿
    
    %产生位姿矩阵法2:描述位置
    %T1 = transl(0.2,0.2,0.2)*trotx(pi/4);%位移*旋转,创建齐次变换
    %T2 = transl(0.2,-0.1,0.1)*trotx(pi/2);
    %T1 = transl(300)*trotz(pi/4);%位移*旋转,创建齐次变换
    %T2 = transl(200)*trotz(pi/2);    
    
    %关节角度
    q1 = bot.ikine(T1,'mask',[1 1 1 1 0 1]); %如果是[1 1 1 1 1 0],则最后一个关节角度一直是0
    q2 = bot.ikine(T2,'mask',[1 1 1 1 0 1],'q0',q1); 
    
    %关节空间运动规划
    [q,qt,qtt]=jtraj(q1,q2,t);
   
    %笛卡尔运动规划
    %Ts=ctraj(T1,T2,length(t));
    
    bot.plot(q)%绘制轨迹
 %% 画图
    figure('name','关节随时间变化')
    subplot(3, 1, 1);
    plot(t, q,'LineWidth',1.5) %绘制关节角随时间的变化
    grid on;
    xlabel('时间(s)');ylabel('关节角度(rad)')
    set(gca,'YLim',[-3 2]);
    set(gca,'YTick',[-3,-2:2:2]);%设置要显示坐标刻度
    legend('关节1','关节2','关节3','关节4','关节5','location','northeastoutside')

    subplot(3,1,2);
    plot(t, qt,'LineWidth',1.5) %绘制关节角速度随时间的变化
    grid on;
    xlabel('时间(s)');ylabel('角速度(rad/s)')
    set(gca,'YLim',[-0.3 0.3]);
    set(gca,'YTick',[-0.3:0.15:0.3]);%设置要显示坐标刻度
    legend('关节1','关节2','关节3','关节4','关节5','location','northeastoutside')

    subplot(3, 1, 3);
    plot(t, qtt,'LineWidth',1.5) %绘制关节角加速度随时间的变化,如图2
    grid on;
    xlabel('时间(s)');ylabel('角加速度(rad/s^2)')
    set(gca,'YLim',[-0.12 0.12]);
    set(gca,'YTick',[-0.12:0.06:0.12]);%设置要显示坐标刻度
    legend('关节1','关节2','关节3','关节4','关节5','location','northeastoutside')

%%    
    %末端执行器轨迹(x-y视图)
    figure('name','末端执行器轨迹(x-y视图)')
    T = bot.fkine(q); %得到笛卡尔轨迹
    p = transl(T);%轨迹的位移部分
    plot(p(:,1),p(:,2),'LineWidth',1.5) %绘制xy平面内的末端轨迹,如图3
    xlabel('X轴(mm)');ylabel('Y轴(mm)')
    %title('末端执行器轨迹(x-y视图)')
    
    
    %带轨迹标记的运动过程
    figure('name',
### 页面调度轮转算法(Round Robin Algorithm) #### 定义与原理 轮转调度算法是一种常见的进程调度方法,在页面调度中同样适用。此算法的核心在于将固定长度的间片分配给各个任务,确保每个任务都能获得一定的处理机间[^4]。 当一个任务被加载到内存并开始运行,它会得到预先设定好的间片用于执行。如果在这个间段内未能完成,则会被暂停并将剩余部分重新加入就绪队列末端继续等待下一次调度机会。这种机制可以有效防止某些长间运行的任务独占CPU资源而造成其他短小任务长期得不到响应的情况发生[^5]。 #### 实现方式 为了实现上述逻辑,通常需要遵循以下几个方面: - **初始化阶段**:创建一个用来保存待处理任务列表的数据结构——通常是双向链表或者环形缓冲区形式的队列; - **设置合理的间片大小**:这取决于具体应用场景以及系统负载情况等因素综合考量的结果; - **核心循环体设计**: - 从队首取当前要被执行的任务; - 启动计器监控实际消耗了多少个单位间内该作业占用处理器工作; - 如果超了预定限额则强制中断其活动状态,并将其余下的指令序列送回原处排队等候下次调用; 以下是Python语言描述的一个简化版伪代码示例: ```python import time class Task: def __init__(self, name, burst_time): self.name = name self.burst_time = burst_time def round_robin(tasks, quantum): queue = tasks.copy() while queue: task = queue.pop(0) if task.burst_time > quantum: print(f"Executing {task.name} for {quantum} units.") task.burst_time -= quantum queue.append(task) # Put back to the end of the queue. yield f"{task.name}: Remaining Time={task.burst_time}" else: print(f"Executing and completing {task.name}.") yield f"{task.name}: Completed." ``` 这段程序模拟了一个简单的RR调度过程,其中`tasks`参数是一个由多个Task对象组成的列表,代表即将参与竞争计算资源的一系列候选者;`quantum`则是指定了单次允许的最大连续运作周期数。每当有一个新成员加入进来之后都会自动排在最后面依次轮流接受服务直到全部结束为止. #### 性能特点分析 对于轮转算法而言,最重要的两个影响因素分别是平均周转间和上下文切换开销。较小的间片有助于提高系统的交互性和多道程序度,但也增加了额外管理成本因为频繁地改变正在工作的线程会导致更多的寄存器保存/恢复动作。反之较大的值虽然减少了这类损耗却可能引发饥饿现象使得一些轻量级的小型事务迟迟无法真正意义上启动起来.
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值