主要内容

在凉亭中施加力和力矩

这个例子说明了将力和力矩应用到Gazebo®模拟器模型的一系列方法。首先,以门为例,从三种不同的角度考察扭矩的应用。其次,两个TurtleBot®Create模型演示了复合模型的强迫作用。最后,使用基本球检查对象属性(在本例中是弹跳)。

先决条件:开始使用凉亭和模拟乌龟机器人在凉亭中添加、构建和删除对象

连接到露台

在您的Linux®机器上,启动Gazebo。如果您正在使用的虚拟机开始使用凉亭和模拟乌龟机器人,点击露台空桌面世界。

通过替换初始化ROSipaddress使用虚拟机的IP地址。的实例ExampleHelperGazeboCommunicator类。

rosinit (“http://192.168.233.133:11311”
使用NodeURI http://192.168.233.1:53907/初始化全局节点/matlab_global_node_68978
露台= ExampleHelperGazeboCommunicator;

添加移动门

本节演示应用关节力矩的三种不同的方法。在这种情况下,使用门。

创建一个门模型并在模拟器中生成三个实例。指定刷出位置和方向(单位为米和弧度)。

doormodel = ExampleHelperGazeboModel (“hinged_door”“gazeboDB”);door1 = spawnModel(凉亭,门模型,[-1.5 2.0 0]);door2 = spawnModel(gazebo,doormodel,[-1.5 0.5 0],[0 0 pi]);door3 = spawnModel(凉亭,门模型,[-1.5 -2.5 0]);

凉亭中的所有单位都使用SI约定指定。随着门的增加,世界看起来像这样:

注意:当露台模拟处于闲置状态时,可移动的物品经常会漂移。如果你看到门在没有命令的情况下缓慢移动,这种行为是正常的。之所以会出现这种情况,是因为现实世界中的摩擦往往比Gazebo模拟器的理想设置更大。

检索第一个门的连接和关节的把手并显示它们。

[链接,关节]= getComponents(door1)
链接=3×1细胞{'hinged_door::frame'} {'hinged_door::door'}}
关节=3×1细胞{'hinged_door::handle'} {'hinged_door::hinge'}}

              

对于第一扇门,直接施加扭矩铰链关节。

在第一扇门上施加扭矩jointTorque.这样做会使它打开,并在模拟过程中保持打开状态。前两行定义扭矩应用的停止时间和努力参数。第二个条目关节细胞数组hinged_door:铰链.在jointTorque调用。

stopTime = 5;%秒努力= 3.0;%牛·米join扭矩(门1,关节{2},停止时间,力度);


              

第二种方法是在门的连杆上施加一个扭矩,而不是铰链接头。这种方法不干净,因为扭矩是施加在连杆(在这种情况下是门)的质心上,而不是施加在旋转轴上。这种方法仍然产生推动门的扭矩。

使用applyForce函数。第二个条目链接是“hinged_door:门”。用在applyForce调用。

forceVector = [0 0 0];%牛顿torqueVector = [0 0 3];%牛·米applyForce(door2, links{2}, stopTime, forceevector, torqueVector);

你可以直接在门的质心上施加一个力(而不是扭矩),让它移动。的命令是:

forceVector = [0 -2 0];%牛顿applyForce(door2, links{2}, stopTime, forceVector);

注意:力总是来自世界坐标系而不是物体坐标系。当你施加这个力时,它持续地负作用y方向。它不会在门上产生恒定的扭矩。

对于第三扇门,无需施加外力或扭矩,手动定义铰链角度。

使用while循环来创造门的摆动行为。使用setConfig的函数ExampleHelperGazeboSpawnedModel类。

angdelta = 0.1;%弧度dt = 0;%秒角= 0;%弧度抽搐(toc < stopTime)如果角> 1.5 ||%的弧度angdelta = -angdelta;结束角=角+ angdelta;setConfig (door3,关节{2},角);暂停(dt);结束

创建TurtleBot对象进行操作

本节演示TurtleBot Create的创建和外部操作。它演示了对更复杂对象的简单控制。

创建另一个TurtleBot在世界中添加GazeboModel从数据库(GazeboDB)。生成的机器人是TurtleBot Create,而不是Kobuki。对其右轮施加一个外部扭矩。

注意:生成Create需要互联网连接。

botmodel = ExampleHelperGazeboModel (“turtlebot”“gazeboDB”);机器人= spawnModel(露台,botmodel (1,0,0));

龟bot最初面向x轴产卵,角度为0度。改变方向为pi/2弧度(90度)使用这个命令:

设置状态(机器人,“定位”[0 0π/ 2]);

使用applyForce,让乌龟机器人创建的右轮移动,通过施加一个外部扭矩,从ExampleHelperGazeboSpawnedModel对象。

[botlinks, botjoint] = getComponents(bot)
botlinks =5×1细胞{'turtlebot::rack'} {'turtlebot::create::base'} {'turtlebot::create::left_wheel'} {'turtlebot::create::right_wheel'} {'turtlebot::kinect::link'}}
botjoints =4×1细胞{'turtlebot::create::left_wheel'} {'turtlebot::create::right_wheel'} {'turtlebot::create_rack'} {'turtlebot::kinect_rack'}

第2项botjoints使用botjoint{2}在jointTorque调用。

turnStopTime = 1;%秒turnEffort = 0.2;%牛·米jointTorque(bot, botjoint {2}, turnStopTime, turnEffort)

你可以在龟形机器人的基座上而不是轮子上进行力的应用实验。

制作第二个TurtleBot Create withspawnModel

bot2 = spawnModel(露台,botmodel [2 0 0]);[botlink2, botjoints2] = getComponents(bot2)
botlinks2 =5×1细胞{'turtlebot::rack'} {'turtlebot::create::base'} {'turtlebot::create::left_wheel'} {'turtlebot::create::right_wheel'} {'turtlebot::kinect::link'}}
botjoints2 =4×1细胞{'turtlebot::create::left_wheel'} {'turtlebot::create::right_wheel'} {'turtlebot::create_rack'} {'turtlebot::kinect_rack'}

在y方向上对底施加一个力。确保底座几乎不动。这个力垂直于车轮的方向。

第一个条目botlinks2是“turtlebot::创建::base”。使用botlinks2 {1}applyForce调用。

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

在x方向施加一个力。机器人的移动更加明显。

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

对乌龟机器人的基座施加一个扭矩,使它旋转。

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

增加弹跳球

本节演示了两个球的创建,并公开了“bounce”属性。

使用ExampleHelperGazeboModel类以在模拟中创建两个球。使用指定弹跳的参数通过addLink

反弹= 1;%无单位系数maxCorrectionVelocity = 10;米/秒ballmodel = ExampleHelperGazeboModel (“球”);通过addLink (ballmodel“球”, 0.2,“颜色”,[0.3 0.7 0.7 0.5],“反弹”,反弹maxCorrectionVelocity);

生两个球,一个在另一个上面,以说明弹跳。

ballmodel spawnModel(露台,[0 1 2]);ballmodel spawnModel(露台,[0 1 3]);暂停(5);

添加球之后,世界看起来像这样:

移除模型并关闭

清理模型。

exampleHelperGazeboCleanupApplyForces;

当您使用完发布者、订阅者和其他与ros相关的对象时,清除它们的工作区。

清晰的

使用rosshutdown一旦你完成了ROS网络的工作。关闭全局节点并断开与露台的连接。

rosshutdown
使用NodeURI http://192.168.233.1:53907/关闭全局节点/matlab_global_node_68978

完成后,关闭虚拟机上的Gazebo窗口

下一个步骤