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