您的位置:首页 > 其它

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

2019-06-05 17:31 2056 查看
版权声明:原创不易,转载请注明出处。 https://blog.csdn.net/weixin_42237429/article/details/90906146

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

https://github.com/ros/urdf_sim_tutorial

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

[code]wdd@Linux:~/catkin_ws$ catkin_make

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

[code]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 ,最后几行:

[code] <!-- 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

[code]# 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 中。

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

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

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

 运行这个URDF,终端输入:

[code] roslaunch urdf_sim_tutorial 09-joints.launch

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

[code] rostopic echo /joint_states

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

3.传输(Transmissions)

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

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

[code] <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,终端输入:

[code] roslaunch urdf_sim_tutorial 10-head.launch

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

[code] rostopic echo /joint_states

可以看到参数已经有了。

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

4.Joint Control

打开:head.yaml:

[code]type: "position_controllers/JointPositionController"
joint: head_swivel

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

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

[code]roslaunch urdf_sim_tutorial 10-head.launch

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

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

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

 

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

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

[code] <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来运行:

[code]roslaunch urdf_sim_tutorial 10-head.launchmodel:=urdf/11-limittransmission.urdf.xacro

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

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

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

 

5.Another Controller

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

打开 gripper.yaml

[code]type: "position_controllers/JointGroupPositionController"
joints:
- gripper_extension
- left_gripper_joint
- right_gripper_joint

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

[code]roslaunch urdf_sim_tutorial 12-gripper.launch

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

[code]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]"

可以看到爪子张开了:

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

[code]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 ,有有一段:

[code] <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

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

[code] <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>
1b5d8
;
</gazebo>

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

打开:diffdrive.yaml:

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

[code]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

终端输入:

[code]roslaunch urdf_sim_tutorial 13-diffdrive.launch

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

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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐