matlab转矩方向,ROS与Matlab语言入门教程-在Gazebo中应用力和力矩

本例程演示应用力和力矩到Gazebo仿真器中的模型的一些方法。首先,使用门作为图解验证了三种力矩应用的方法;其次,两个TurtleBot创建模型演示了混合模型的力;最后,对象属性(此处,边界)通过基本的球体验证。

预备知识:"4.2开始使用Gazebo和仿真的TurtleBot","5.1从Gazebo读取模型和仿真属性","5.2在Gazebo中增加、建立和删除对象"。

连接到Gazebo

在用户的Linux计算机启动Gazebo,如果用户使用"4.2开始使用Gazebo和仿真的TurtleBot"的虚拟机,则使用“Gazebo Empty world”。初始化ROS,必须使用虚拟机的IP地址替换如下指令中的示例IP地址(192.168.1.1),创建“theExampleHelperGazeboCommunicator”的示例。

ipaddress = '192.168.1.1'

rosinit(ipaddress)

gazebo = ExampleHelperGazeboCommunicator();

增加移动通道

本小结演示三种不同的方法,应用关节力矩,此处使用了门。在仿真器中创建一个门并产生三个实例,指定产生的位置(m)和方向(rad)。

doormodel = ExampleHelperGazeboModel('hinged_door','gazeboDB');

door1 = spawnModel(gazebo,doormodel,[-1.5 2.0 0]);

door2 = spawnModel(gazebo,doormodel,[-1.5 0.5 0],[0 0 pi]);

door3 = spawnModel(gazebo,doormodel,[-1.5 -2.5 0]);

Gazebo中的所有单位采用SI约定。增加门之后,世界如下图所示。

6d3ed406c88a040f7741a05ae001cc9b.png

注意,当Gazebo仿真被闲置时,可移动的物体通常会偏移。所以,如果用户看到门没有控制指令却缓慢移动,这是正常的现象。之所以发生这样的现象,是因为现实中的摩擦力大于Gazebo仿真器中的理想设置。

获取第一个门链接的关节的句柄并显示:

[links, joints] = getComponents(door1)

输出类似如下:

links =

'hinged_door::frame'

'hinged_door::door'

'hinged_door::handles'

joints =

'hinged_door::handle'

'hinged_door::hinge'

'hinged_door::world_joint'

对于第一个门,直接应用力矩到“hinge”关节。

使用“jointTorque”应用力矩到第一个门,这将让第一个门在仿真期间保持打开。头两行定义了应用力矩的停止时间和作用力参数。“joints”单元数组的第二个项是“hinged_door::hinge”,在“jointTorque”调用中使用

stopTime = 5; % Seconds

effort = 3.0; % Newton-meters

jointTorque(door1, joints{2}, stopTime, effort);

a92fa72facc25ad79ed8dadd9bc3508d.png

第二种方法是应用力矩到门的链环而不是铰链接合,该方法并不清洁,因为应用力矩到链环的质量的中心(此处是门),并不是应用于旋转轴。该方法同样产生力矩使门移动。

使用“applyForce”函数,“links”的第二项是“hinged_door::door”,在调用“applyForce”时使用它。

forceVector = [0 0 0]; % Newtons

torqueVector = [0 0 3]; % Newton-meters

applyForce(door2, links{2}, stopTime, forceVector, torqueVector);

3691440fa83366e6d7b33d85d2bc7721.png

用户可以直接应用力(而不是力矩)到门的质心,命令如下:

forceVector = [0 -2 0]; % Newtons

applyForce(door2, links{2}, stopTime, forceVector);

注意,力总是从世界坐标系应用,而不是对象坐标系。当用户应用力,它持续的作用于y的负方向。这不会导致一个持续对门的力矩。

对于第三个门,手动定义一个铰链角度,没有使用力或者力矩。

使用while循环为门创建一个摆动行为,使用“ExampleHelperGazeboSpawnedModel”类的“setConfig”函数。

angdelta = 0.1; % Radians

dt = 0; % Seconds

angle = 0; % Radians

tic

while (toc < stopTime)

if angle > 1.5 || angle < 0 % In radians

angdelta = -angdelta;

end

angle = angle+angdelta;

setConfig(door3,joints{2},angle);

pause(dt);

end

709b82d7838d73b64149339d7a99fefe.png

创建TurtleBot对象以操控

本小节展示TurtleBot的创建以及从外部操纵,展示了一个更加复杂的对象的简单控制。通过从数据库(GazeboDB)增加一个“GazeboModel”创建另一个TurtleBot,该生产的机器人是“TurtleBot Create”而不是“kobuki”。应用外部的力矩到它的右轮。注意,生产“Create”需要连接到互联网。

botmodel = ExampleHelperGazeboModel('turtlebot','gazeboDB');

bot = spawnModel(gazebo,botmodel,[1,0,0]);

最初生产的TurtleBot面向x轴的零度角,使用如下的命令更改方向到pi/2(90°)

setState(bot,'orientation',[0 0 pi/2]);

a720e7ae7351742b5642cdcce7dc9c20.png

使用“applyForce”,从“ExampleHelperGazeboSpawnedModel”对象应用外部力矩让TurtleBot Creat的右轮移动。

[botlinks, botjoints] = getComponents(bot)

botlinks =

'turtlebot::rack'

'turtlebot::create::base'

'turtlebot::create::left_wheel'

'turtlebot::create::right_wheel'

'turtlebot::kinect::link'

botjoints =

'turtlebot::create::left_wheel'

'turtlebot::create::right_wheel'

'turtlebot::create_rack'

'turtlebot::kinect_rack'

“botjoints”的第二项是“turtlebot::create::right_wheel”,在调用“jointTorque”时使用“botjoints{2}”。

turnStopTime = 1; % Seconds

turnEffort = 0.2; % Newton-meters

jointTorque(bot, botjoints{2}, turnStopTime, turnEffort)

6f3c9c30477e7ebd8568200d87a2284b.png

用户可以实验将力应用到TurtleBot的基而不是轮子。

使用“spawnModel”创建第二个“TurtleBot Create”:

bot2 = spawnModel(gazebo,botmodel,[2,0,0]);

[botlinks2, botjoints2] = getComponents(bot2)

botlinks2 =

'turtlebot::rack'

'turtlebot::create::base'

'turtlebot::create::left_wheel'

'turtlebot::create::right_wheel'

'turtlebot::kinect::link'

botjoints2 =

'turtlebot::create::left_wheel'

'turtlebot::create::right_wheel'

'turtlebot::create_rack'

'turtlebot::kinect_rack'

1d85fd1be8dd9c42d0763d763b954241.png

在y方向应用力到基,看到基几乎不移动,力作用于轮子的垂直方向上。

“botlinks2”的第一项是“turtlebot::create::base”,在调用“applyForce”时使用“botlinks2{1}”。

applyForce(bot2,botlinks2{1},2,[0 1 0]);

在x方向上应用力,机器人更快速的运动。

applyForce(bot2,botlinks2{1},2,[1 0 0]);

应用力矩到TurtleBot的基让它旋转。

applyForce(bot2,botlinks2{1},2,[0 0 0],[0 0 1]);

f1bb48228c853aaae9df8615d6201f3a.png

增加跳动球体

本小节示范创建两个球体并公开“弹力”属性。

使用“ExampleHelperGazeboModel”类在仿真中创建两个球体,通过“addLink”指定弹力参数。

bounce = 1; % Unitless coefficient

maxCorrectionVelocity = 10; % Meters per second

ballmodel = ExampleHelperGazeboModel('ball');

addLink(ballmodel,'sphere',0.2,'color',[0.3 0.7 0.7 0.5],'bounce',[bounce maxCorrectionVelocity]);

生产两个球体,一个在另一个的上方,以阐明弹力。

spawnModel(gazebo,ballmodel,[0 1 2]);

spawnModel(gazebo,ballmodel,[0 1 3]);

在增加球体之后,整个界面如下图所示。

343305ce5a42a67fb44059e8768b04de.png

移除模型和关闭

清除模型:

exampleHelperGazeboCleanupApplyForces;

当用户完成工作后,清楚工作空间中的发布器、订阅器和其它有关ROS的对象是个良好的习惯。

clear

建议当完成ROS网络有关的工作之后,使用“rosshutdown”指令关闭全局节点和断开与Gazebo的连接。

rosshutdown

当用户已经完成操作,在虚拟机上关闭Gazebo窗口。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值