ROS学习--第13篇:ROS机器人建模与仿真---在Gazebo中使用URDF

请下载URDF模拟包保存到 ~/catkin_ws/src:

https://github.com/ros/urdf_sim_tutorial

下载完成后编译下工作空间:

wdd@Linux:~/catkin_ws$ catkin_make

我们可以使用 gazebo.launch 在 gazebo 中生成我们已经创建的模型:

roslaunch urdf_sim_tutorial gazebo.launch 

ROS学习--第13篇:ROS机器人建模与仿真---在Gazebo中使用URDF_第1张图片

然而,它什么也不能做,因为缺少了ROS使用这个机器人需要的关键信息。

以前,我们使用 joint_state_publisher 来指定每个关节的姿势。

然而,机器人本身应该在现实世界或 Gazebo 中提供这些信息。

如果没有具体说明,Gazebo就不知道要发布这些信息。
为了让机器人能够交互(与你和ROS),我们需要指定两件事:插件(Plugins)传输(Transmissions)

1.Gazebo插件(Plugins)

为了让ROS与Gazebo交互,我们必须动态链接到ROS库,该库将告诉Gazebo要做什么。

理论上,这允许其他机器人操作系统以通用的方式与Gazebo交互。实际上,它只是ROS。


要链接Gazebo和ROS,我们需要在urdf中指定插件tag:

打开 09-publishjoints.urdf.xacro ,最后几行:

 
  
    
      /
    
  

然而,这还不能做任何新的事情。为此,我们需要在本规则框架之外指定更多信息。

2.生成控制器(Controllers)

既然我们已经链接了ROS和Gazebo,那么我们需要指定一些要在Gazebo中运行的ROS代码位,我们通常称之为控制器。

它们最初加载到ROS参数空间中。

我们指定第一个控制器的 yaml 文件为 joints.yaml。

打开 config 文件夹下的 joints.yaml

# The joint state controller handles publishing transforms for any moving joints
type: "joint_state_controller/JointStateController"
publish_rate: 50

该控制器位于 joint_state_controller 包中,可直接从Gazebo将机器人关节的状态发布到ROS中。


在 09-joints.launch中,可以看到我们应该如何将这个yaml文件加载到r2d2_joint_state_controller namespace 中。


然后,我们调用 controller_manager/spawner 脚本,将其加载到Gazebo中的名称空间中。

 

 运行这个URDF,终端输入:

 roslaunch urdf_sim_tutorial 09-joints.launch

再打开一个新终端,输出 /joint_states 信息:

 rostopic echo /joint_states

ROS学习--第13篇:ROS机器人建模与仿真---在Gazebo中使用URDF_第2张图片

可以看到各参数都是空的,因为我们只加了一个控制器,并没有发送数据。

3.传输(Transmissions)

对于每个非固定 joint,我们需要指定一个传输,它告诉Gazebo如何处理 joint。

我们从头部关节开始。打开 10-firsttransmission.urdf.xacro 后面一部分:

 
    transmission_interface/SimpleTransmission
    
      1
    
    
      PositionJointInterface
    
 

运行这个URDF,终端输入:

 roslaunch urdf_sim_tutorial 10-head.launch 

再打开一个新终端,输出 /joint_states 信息:

 rostopic echo /joint_states

ROS学习--第13篇:ROS机器人建模与仿真---在Gazebo中使用URDF_第3张图片

可以看到参数已经有了。

我们可以继续为所有的非固定关节添加传输(Transmissions),以便所有的关节都得到正确的发布。但是,生活不仅仅是看机器人。我们想控制他们。那么,让我们在这里再找一个控制器。

4.Joint Control

打开:head.yaml:

type: "position_controllers/JointPositionController"
joint: head_swivel

这表示用position_controllers包中的JointPositionController,去控制head_swivel。

现在我们可以像以前一样启动它:

roslaunch urdf_sim_tutorial 10-head.launch 

现在Gazebo订阅了一个新主题,然后您可以通过在ROS中发布值来控制头部的位置:

rostopic pub /r2d2_head_controller/command std_msgs/Float64 "data: -0.707"

可以看到头部转动了一个角度

 ROS学习--第13篇:ROS机器人建模与仿真---在Gazebo中使用URDF_第4张图片

发布此命令后,位置将快速更改为其值。这是因为我们没有在我们的URDF中规定任何接头的限制。但是,如果我们改变关节,它会逐渐移动。

打开11-limittransmission.urdf.xacro 会看到:

 
    
    
    
    
    
  

这一句

增加了最大速度(maximum velocity)和力(effort)。

因为没有 11-limittransmission.urdf.xacro 的 launch 文件,我们可以进入

~/catkin_ws/src/urdf_sim_tutorial-master 

文件夹下,用10-head.launch来运行:

roslaunch urdf_sim_tutorial 10-head.launch model:=urdf/11-limittransmission.urdf.xacro

现在Gazebo订阅了一个新主题,然后您可以通过在ROS中发布值来控制头部的位置:

rostopic pub /r2d2_head_controller/command std_msgs/Float64 "data: -0.707"

可以看到头部转动了一个角度,但是是逐渐旋转的。

 

5.Another Controller

我们可以用类似的方法更改抓取关节的URDF。但是,我们可能希望将它们组合在一起,而不是用自己的ROS主题单独控制夹持器的每个关节。为此,我们只需要在ROS参数中指定不同的控制器。

打开 gripper.yaml

type: "position_controllers/JointGroupPositionController"
joints:
 - gripper_extension
 - left_gripper_joint
 - right_gripper_joint

可以看到这是一个抓取关节的组合控制器。

roslaunch urdf_sim_tutorial 12-gripper.launch 

现在我们可以指定抓取关节位置:

rostopic pub  /r2d2_gripper_controller/command std_msgs/Float64MuiArray "layout:
  dim:
  - label: ''
    size: 3
    stride: 1
  data_offset: 0
data: [0, 0.5, 0.5]"

可以看到爪子张开了:

ROS学习--第13篇:ROS机器人建模与仿真---在Gazebo中使用URDF_第5张图片

同样我们可以控制爪子收缩并闭合:

rostopic pub  /r2d2_gripper_controller/command std_msgs/Float64MultiArray "layout:
  dim:
  - label: ''
    size: 3
    stride: 1
  data_offset: 0
data: [-0.4, 0, 0]"

6.转动机器人的轮子

为了驱动机器人四处走动,我们还为每个轮子指定了另一个来自轮子宏的传输。

打开:13-diffdrive.urdf.xacro ,有有一段:

 
      transmission_interface/SimpleTransmission
      
        1
      
      
        VelocityJointInterface
      
    

这和其他 transmissions 一样,除了:

  • 它使用宏参数指定名称

  • 它使用一个速度连接接口  VelocityJointInterface

由于车轮实际上会接触地面,因此会与地面发生物理相互作用,因此我们还指定了一些有关车轮材料的附加信息:

 
      
      
      
      
      Gazebo/Grey
 

我们可以为每个单独的轮子指定控制器,但是其中的乐趣在哪里呢?相反,我们想要一起控制所有的轮子。为此,我们需要更多的ROS参数。

打开:diffdrive.yaml:

DiffDriveController 订阅标准的 Twist cmd_vel message 消息,并相应地移动机器人。

type: "diff_drive_controller/DiffDriveController"
publish_rate: 50

left_wheel: ['left_front_wheel_joint', 'left_back_wheel_joint']
right_wheel: ['right_front_wheel_joint', 'right_back_wheel_joint']

wheel_separation: 0.44

# Odometry covariances for the encoder output of the robot. These values should
# be tuned to your robot's sample odometry data, but these values are a good place
# to start
pose_covariance_diagonal: [0.001, 0.001, 0.001, 0.001, 0.001, 0.03]
twist_covariance_diagonal: [0.001, 0.001, 0.001, 0.001, 0.001, 0.03]

# Top level frame (link) of the robot description
base_frame_id: base_link

# Velocity and acceleration limits for the robot
linear:
  x:
    has_velocity_limits    : true
    max_velocity           : 0.2   # m/s
    has_acceleration_limits: true
    max_acceleration       : 0.6   # m/s^2
angular:
  z:
    has_velocity_limits    : true
    max_velocity           : 2.0   # rad/s
    has_acceleration_limits: true
    max_acceleration       : 6.0   # rad/s^2

终端输入:

roslaunch urdf_sim_tutorial 13-diffdrive.launch

除了加载上述配置外,这还会打开机器人转向面板,允许您驱动r2d2机器人四处走动,同时观察其实际行为(在Gazebo中)和可视化行为(在rviz中)。

现在我们就可以通过转向面板控制机器人行走了:

ROS学习--第13篇:ROS机器人建模与仿真---在Gazebo中使用URDF_第6张图片

恭喜!现在你在可以用URDF模拟机器人了。

你可能感兴趣的:(ROS)