请下载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中指定插件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
可以看到各参数都是空的,因为我们只加了一个控制器,并没有发送数据。
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
可以看到参数已经有了。
我们可以继续为所有的非固定关节添加传输(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 会看到:
这一句
增加了最大速度(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_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中)。
现在我们就可以通过转向面板控制机器人行走了:
恭喜!现在你在可以用URDF模拟机器人了。