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使用这个机器人需要的关键信息。

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

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

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

1.Gazebo插件(Plugins)

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

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


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

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

 <!-- Gazebo plugin for ROS Control -->
  <gazebo>
    <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
      <robotNamespace>/</robotNamespace>
    </plugin>
  </gazebo>

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

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 中。

<rosparam command="load"
            file="$(find urdf_sim_tutorial)/config/joints.yaml"
            ns="r2d2_joint_state_controller" />

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

 <node name="r2d2_controller_spawner" pkg="controller_manager" type="spawner"
    args="r2d2_joint_state_controller
          --shutdown-timeout 3"/>

 运行这个URDF,终端输入:

 roslaunch urdf_sim_tutorial 09-joints.launch

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

 rostopic echo /joint_states

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

3.传输(Transmissions)

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

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

 <transmission name="head_swivel_trans">
    <type>transmission_interface/SimpleTransmission</type>
    <actuator name="$head_swivel_motor">
      <mechanicalReduction>1</mechanicalReduction>
    </actuator>
    <joint name="head_swivel">
      <hardwareInterface>PositionJointInterface</hardwareInterface>
    </joint>
 </transmission>

运行这个URDF,终端输入:

 roslaunch urdf_sim_tutorial 10-head.launch 

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

 rostopic echo /joint_states

可以看到参数已经有了。

我们可以继续为所有的非固定关节添加传输(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"

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

 

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

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

 <joint name="head_swivel" type="continuous">
    <parent link="base_link"/>
    <child link="head"/>
    <axis xyz="0 0 1"/>
    <origin xyz="0 0 ${bodylen/2}"/>
    <limit effort="30" velocity="1.0"/>
  </joint>

<limit effort="30" velocity="1.0"/> 这一句

增加了最大速度(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]"

可以看到爪子张开了:

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

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 name="${prefix}_${suffix}_wheel_trans">
      <type>transmission_interface/SimpleTransmission</type>
      <actuator name="${prefix}_${suffix}_wheel_motor">
        <mechanicalReduction>1</mechanicalReduction>
      </actuator>
      <joint name="${prefix}_${suffix}_wheel_joint">
        <hardwareInterface>VelocityJointInterface</hardwareInterface>
      </joint>
    </transmission>

这和其他 transmissions 一样,除了:

  • 它使用宏参数指定名称

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

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

 <gazebo reference="${prefix}_${suffix}_wheel">
      <mu1 value="200.0"/>
      <mu2 value="100.0"/>
      <kp value="10000000.0" />
      <kd value="1.0" />
      <material>Gazebo/Grey</material>
 </gazebo>

我们可以为每个单独的轮子指定控制器,但是其中的乐趣在哪里呢?相反,我们想要一起控制所有的轮子。为此,我们需要更多的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中)。

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

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

  • 7
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值