Home » ROS与Matlab入门教程 » ROS与Matlab语言入门教程-在Gazebo中增加、建立和移除对象

ROS与Matlab语言入门教程-在Gazebo中增加、建立和移除对象

本例程探索如何深层次地与MATLAB中的Gazebo仿真器交互。主题包括创建简单的模型、增加链接和加入模型、将模型连接在一起和应用力到物体。

预备知识:"4.2 开始使用Gazebo和仿真的TurtleBot","5.1从Gazebo读取模型和仿真属性"。

连接到Gazebo

在用户的Linux计算机启动Gazebo,如果使用"4.2开始使用Gazebo和仿真的TurtleBot"中的虚拟机,则使用“Gazebo Empty world”。使用下面的指令初始化ROS,需要用虚拟机的IP地址代替示例IP地址(192.168.1.1),创建一个“ExampleHelperGazeboCommunicator”类的实例。

ipaddress = '192.168.1.1'
rosinit(ipaddress)
gazebo = ExampleHelperGazeboCommunicator();

产生一个简单的球体

使用“ExampleHelperGazeboModel”类创建一个模型,下面的代码创建了一个球体,使用“addLink”定义属性,使用“spawnModel”函数产生球体。

ball = ExampleHelperGazeboModel('Ball')
spherelink = addLink(ball,'sphere',1,'color',[0 0 1 1])
spawnModel(gazebo,ball,[8.5,0,1]);

这些指令的输出类似如下所示:

ball =
ExampleHelperGazeboModel with properties:
Name: 'Ball'
ModelObj: [1x1 org.apache.xerces.dom.DocumentImpl]
Links: []
Joints: []
spherelink =
link0

所有Gazebo命令的单位都是SI单位,根据用户的视野,可能需要缩小才能看见球体,因为它被放置在[8.5,0,1],下面是该场景的图片。

请输入图片描述

建立和产生保龄球木柱

创建x和y向量表示保龄球木柱的位置(m)。

x = [1.5 1.5 1.5 1.5 2.5 2.5 2.5 3.5 3.5 4.5];
y = [-1.5 -0.5 0.5 1.5 -1 0 1 -0.5 0.5 0];

使用“ExampleHelperGazeboModel”对象定义保龄球木柱的基本模型,使用“addLink”创建圆柱和球体。

pin = ExampleHelperGazeboModel('BowlPin');
link1 = addLink(pin,'cylinder',[1 0.2],'position',[0,0,0.5])
link2 = addLink(pin,'sphere',0.2,'position',[0,0, 1.2],'color',[0.7 0 0.2 1])

“addLink”的输出产生一个变量包含了链接分配的命名。这些变量创建了接头。
使用“addJoint”定义两个链接之间的关系,此处,他们被旋转关节连接在一起。

joint = addJoint(pin,link1,link2,'revolute',[0 0],[0 0 1])

“addJoint”函数的参数依次是对象、父、子、类型、限制和坐标。

定义了一个“bowlPin”之后,用户可以使用先前的“ExampleHelperGazeboModel”创建10个保龄球木柱。下面的“for”循环使用x和y向量在Gazebo产生了模型。

for i = 1:10
spawnModel(gazebo,pin,[x(i),y(i),0.7]);
pause(1);
end

增加木柱之后,如下图所示。

请输入图片描述

移除模型

如果TurtleBot存在于场景中,则移除它。查看模型列表,移除名称为“mobile_base”的模型。

if ismember('mobile_base',getSpawnedModels(gazebo))
removeModel(gazebo,'mobile_base');
end

产生内置(嵌入)的模型

为纽泽西护栏创建一个“ExampleHelperGazeboModel”,该对象在Gazebo网站查找给模型。

barrier = ExampleHelperGazeboModel('jersey_barrier','gazeboDB');

使用“spawnModel”创建两个纽泽西护栏,

spawnModel(gazebo,barrier,[1.5,-3,0]); % Right barrier
pause(1);
spawnModel(gazebo,barrier,[1.5,3,0]); % Left barrier

注意,用户需要连接到互联网以生成模型,该模型为包含在这些例程中。然而,如果如果用户之前已经在Gazebo仿真中创建了模型,它已经缓存了,那么用户没有网络连接也能创建。

创建之后如下图所示。

请输入图片描述

应用推力到球体

通过“ExampleHelperGazeboSpawnedModel”类,获取球体的句柄。

spawnedBall = ExampleHelperGazeboSpawnedModel(ball.Name,gazebo)

为力的应用定义参数,此处持续时间设置为1秒,力的向量设置为x方向-75N。

duration = 1; % Seconds
forcevec = [-75 0 0]; % Newtons

使用“applyForce”函数,应用力到模型。

applyForce(spawnedBall, spherelink, duration, forcevec);
pause(5);

下面的图表示碰撞和后果。

请输入图片描述

请输入图片描述

移除模型并关闭

为了清除干净,删除本例程创建的所有模型。

exampleHelperGazeboCleanupBowling;

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

clear

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

rosshutdown

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

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

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


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