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窗口。
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号