控制小车在仿真环境中移动

urdf——Gazebo——ros_control——MoveIt

1、gazebo_ros程序包路径                     /opt/ros/kinetic/share/gazebo_ros

                           worlds路径                    /usr/share/gazebo-7/worlds           

记得怎么运行完 gazebo的launch之后 键入命令行 killall gzserver ;否则,打开另一个launch会黑屏。    

urdf和Gazebo中的单位应以米和千克为单位,重力加速度为 9.81 m/s^2。                                          

2、roslaunch启动gazebo                        

2-1、roslaunch参数:

paused    以暂停状态启动Gazebo(默认为false)

use_sim_time    告诉ROS节点要求时间获取Gazebo发布的模拟时间,通过ROS主题/时钟发布(默认为true)

gui   启动Gazebo的用户​​界面窗口(默认为true)

headless (不推荐) recording    启用状态日志记录

debug     使用gdb以调试模式启动gzserver(Gazebo Server)(默认为false)

verbose  使用--verbose运行gzserver和gzclient,将错误和警告打印到终端(默认为false)

实例:(在明令行加入参数)

roslaunch gazebo_ros empty_world.launch paused:= true use_sim_time:= false gui:= true throttled:= false recording:= false debug:= true verbose:= true

2.2 world file

无特殊要求均可用 empty.world

2.3

在catkinMake 文件里添加依赖的包,在package.xml文件里添加依赖项。

2.4 将urdf文件加载到gazebo中

2.4.1 方法一:ROS服务调用Spawn

这种方法保持机器人相对于ROS包路径的位置,但需要使用小型(python)脚本进行ROS服务调用。

方法原理:使用一个python脚本--spawn_modelgazebo_ros中的ROS节点(在rostopic命名空间中简称为“gazebo”)发出服务调用请求,以将自定义URDF添加到Gazebo中。该spawn_model脚本位于gazebo_ros包中。

方法实例:

rosrun gazebo_ros spawn_model -file `rospack find MYROBOT_description`/urdf/MYROBOT.urdf -urdf -x 0 -y 0 -z 1 -model MYROBOT

rosrun gazebo_ro spawn_model -file urdf文件的绝对路径 -urdf -x ? -y ? -z ? -model 模型名  (xyz为模型加载到gazebo初始坐标)

可将该服务调用直接集成到ROS启动文件中,在</launch>标记之前添加以下内容:

<!-- Spawn a robot into Gazebo -->
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-file $(find baxter_description)/urdf/baxter.urdf -urdf -z 1 -model baxter" />

<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param urdf中robot的参数 -urdf -model urdf模型名" />

 

针对于xacro文件

<!-- Convert an xacro and put on parameter server -->
<param name="robot_description" command="$(find xacro)/xacro.py $(find pr2_description)/robots/pr2.urdf.xacro" />

<!-- Spawn a robot into Gazebo -->
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model pr2" />

2.4.1方法二:模型数据库法

第二种方法允许您将机器人包含在.world文件中

3、在Gazebo中使用URDF

Universal Robotic Description Format (URDF) 是ROS用于描述机器人的所有元素的XML文件格式。要在Gazebo中使用URDF文件,必须添加一些其他特定于模拟的标记才能与Gazebo一起正常工作。

3.1 背景

虽然URDF在ROS中是一种有用且标准化的格式,但它们缺乏许多功能,并且尚未更新以应对机器人技术不断变化的需求。URDF只能单独指定单个机器人的运动和动态属性。URDF无法在一个世界中指定机器人本身的姿势。它也不是通用描述格式,因为它不能指定关节循环(并联连接),并且它缺乏摩擦和其他属性。在实现方面,URDF语法在大量使用XML属性的情况下破坏了正确的格式,这反过来又使URDF更加不灵活。也没有向后兼容的机制。

为了解决这个问题,创建了一种称为模拟描述格式(SDF)的新格式 ,用于Gazebo以解决URDF的缺点。SDF是从世界级到机器人级的所有内容的完整描述。它具有可扩展性,可以轻松添加和修改元素。SDF格式本身使用XML进行描述,这有助于使用简单的升级工具将旧版本迁移到新版本。为了解决这个问题,创建了一种称为模拟描述格式(SDF)的新格式 ,用于Gazebo以解决URDF的缺点。SDF是从世界级到机器人级的所有内容的完整描述。它具有可扩展性,可以轻松添加和修改元素。SDF格式本身使用XML进行描述,这有助于使用简单的升级工具将旧版本迁移到新版本。

3.2概述

必要的标签:

可选标签:

3.3<gazebo> 元素

<gazebo>元素是URDF的扩展,用于指定Gazebo中模拟所需的其他属性。它允许您指定以SDF格式找到的未包含在URDF格式中的属性。元素中的<gazebo>元素都不是必需的,因为将自动包含默认值。有三种不同类型的<gazebo>元素 - 一种用于<robot>标记,一种用于<link>标记,一种用于<joint>标记。

  • rrbot.gazebo 是一个Gazebo特定文件,包含我们大多数特定于Gazebo的XML元素,包括 标签
  • materials.xacro 一个简单的Rviz颜色文件,用于存储rgba值,不是必需的,但是一个很好的约定

3.3.1 <robot>标签的<gazebo> 元素 

如果在没有reference=""属性的情况下使用<gazebo>元素,则假定该<gazebo>元素用于整个机器人模型。

<gazebo>标签的内部元素<robot>元素列在下表中:

NameTypeDescription
staticboolIf set to true, the model is immovable. Otherwise the model is simulated in the dynamics engine.

如果您希望将URDF模型永久地附加到世界框架(地平面),则必须创建“world”link并将其固定到模型基础的关节。

3.3.2 <collision><visual>元素

这些标签在Gazebo中与在Rviz中的标签基本相同。尽管如此,重要的是要指定两者,因为与某些ROS应用程序不同,如果您没有明确指定元素,Gazebo将不会将您的<visual>元素用作<collision>元素<collision>

urdf中的颜色属性无法在gazebo中显示需要借助 gazebo 辅助文件来完成,必须为每个link指定Gazebo材质标记<material>

3.3.3 link的<gazebo>元素

NameTypeDescription
materialvalueMaterial of visual element
gravityboolUse gravity
dampingFactordoubleExponential velocity decay of the link velocity - takes the value and multiplies the previous link velocity by (1-dampingFactor).
maxVeldoublemaximum contact correction velocity truncation term.
minDepthdoubleminimum allowable depth before contact correction impulse is applied
mu1doubleFriction coefficients μ for the principal contact directions along the contact surface as defined by the Open Dynamics Engine (ODE) (see parameter descriptions in ODE's user guide)
mu2
fdir1string3-tuple specifying direction of mu1 in the collision local reference frame.
kpdoubleContact stiffness k_p and damping k_d for rigid body contacts as defined by ODE (ODE uses erp and cfm but there is a mapping between erp/cfm and stiffness/damping)
kd
selfCollideboolIf true, the link can collide with other links in the model.
maxContactsintMaximum number of contacts allowed between two entities. This value overrides the max_contacts element defined in physics.
laserRetrodoubleintensity value returned by laser sensor.

3.4 joint的 <gazebo>  元素

并非URDF中记录的所有元素都适用于Gazebo

必须: <origin><parent><child>

省略:<calibration>,<safety_controller>

可选:<dynamics>标签只有damping可用,<limit>标签中的所有属性都是可选的

NameTypeDescription
stopCfmdoubleJoint stop constraint force mixing (cfm) and error reduction parameter (erp) used by ODE
stopErp
provideFeedbackboolAllows joints to publish their wrench data (force-torque) via a Gazebo plugin
implicitSpringDamperboolIf this flag is set to true, ODE will use ERP and CFM to simulate damping. This is a more stable numerical method for damping than the default damping tag. The cfmDamping element is deprecated and should be changed to implicitSpringDamper.
cfmDamping
fudgeFactordoubleScale the excess for in a joint motor at joint limits. Should be between zero and one.

3.5 验证urdf是否能转成SDF

gz sdf -p MODEL.urdf

 

4、在Gazebo的插件

Gazebo插件为您的URDF模型提供更多功能,可以为传感器输出和电机输入提供ROS消息和服务调用。

4.1 插件类型

Gazebo支持 多种插件类型,并且所有插件类型都可以连接到ROS,但只能通过URDF文件引用几种类型:

4.2添加 ModelPlugin

modelplugin插件 插入到<robot>元素内的<gazebo>元素下.

<robot>
  ... robot description ...
  <gazebo>
    <plugin name="differential_drive_controller" filename="libdiffdrive_plugin.so">
      ... plugin parameters ...
    </plugin>
  </gazebo>
  ... robot description ...
</robot>

4.3添加 SensorPlugin

添加 传感器插件略有不同, 将sensor 插件看成link形式与gazebo联系.

<robot>
  ... robot description ...
  <link name="sensor_link">
    ... link description ...
  </link>

  <gazebo reference="sensor_link">
    <sensor type="camera" name="camera1">
      ... sensor parameters ...
      <plugin name="camera_controller" filename="libgazebo_ros_camera.so">
        ... plugin parameters ..
      </plugin>
    </sensor>
  </gazebo>

</robot>

4.4 gazebo_plugins中提供的插件

4.4.1

4.4.2

4.4.3

 

 

 

 

 

 

 

 

 

 

 

 

 

Gazebo,使用Python控制仿真车辆的键盘输入通常涉及到监听按键输入和发送相应控制信号给机器人模型。这里是一个简单的示例,使用ROS(Robot Operating System)的msg和srv接口来实现小车的前进、后退、左转和右转: 首先,确保你已经安装了rospy和gazebo_ros包,并且小车模型支持odom topic接收速度命令。以下是一个基础的Python脚本: ```python import rospy from std_msgs.msg import String from gazebo_msgs.srv import SetModelState, SetModelStateRequest class GazeboCarControl: def __init__(self): self.speed_publisher = rospy.Publisher('/car/cmd_vel', Twist, queue_size=10) self.set_state_service = rospy.ServiceProxy('/gazebo/set_model_state', SetModelState) def move_car(self, key_event): twist_msg = Twist() # 创建Twist消息 if key_event == 'w': # 前进 twist_msg.linear.x = 0.5 # 速度设定为0.5m/s elif key_event == 's': # 后退 twist_msg.linear.x = -0.5 # 负数表示向相反方向 else: # 左右转向 twist_msg.angular.z = 1.0 if key_event == 'a' else -1.0 # +1 或 -1 表示转动角度 self.speed_publisher.publish(twist_msg) def reset_car(self): req = SetModelStateRequest() req.model_name = 'your_car_model_name' # 替换为你的模型名称 req.pose.position.x = 0.0 # 设定新位置 req.pose.position.y = 0.0 req.pose.position.z = 0.0 req.pose.orientation.x = 0.0 req.pose.orientation.y = 0.0 req.pose.orientation.z = 0.0 req.pose.orientation.w = 1.0 req.reference_frame = 'world' self.set_state_service(req) if __name__ == '__main__': rospy.init_node('keyboard_control') car_controller = GazeboCarControl() rate = rospy.Rate(10) # 每10Hz更新 while not rospy.is_shutdown(): key_input = input("Enter 'w' for forward, 's' for backward, 'a' for left, 'd' for right or press 'r' to reset: ") car_controller.move_car(key_input) rate.sleep() car_controller.reset_car() rospy.signal_shutdown("Finished") ``` 记得替换`'your_car_model_name'`为你小车模型的实际名字,并在Gazebo环境激活该模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值