< >
Home » ROS与Matlab入门教程 » ROS与Matlab语言入门教程-在Gazebo中应用力和力矩

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约定。增加门之后,世界如下图所示。

请输入图片描述

注意,当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);

请输入图片描述

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

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

forceVector = [0 0 0]; % Newtons
torqueVector = [0 0 3]; % Newton-meters
applyForce(door2, links{2}, stopTime, forceVector, torqueVector);

请输入图片描述

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

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

请输入图片描述

创建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]);

请输入图片描述

使用“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)

请输入图片描述

用户可以实验将力应用到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'

请输入图片描述

在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]);

请输入图片描述

增加跳动球体

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

使用“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]);

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

请输入图片描述

移除模型和关闭

清除模型:

exampleHelperGazeboCleanupApplyForces;

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

clear

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

rosshutdown

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

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros与matlab语言入门教程