ROS学习--第13篇:ROS机器人建模与仿真---在Gazebo中使用URDF
2019-06-05 17:31
2056 查看
版权声明:原创不易,转载请注明出处。 https://blog.csdn.net/weixin_42237429/article/details/90906146
如果没有具体说明,Gazebo就不知道要发布这些信息。
请下载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模拟机器人了。
相关文章推荐
- ROS学习笔记------ROS机器人系统设计-----基础编程 day 8 2019/3/7 帅某(Kinect的安装,xarco模型,xarco---urdf模型,gazebo物理仿真环境的搭建)
- ROS学习(1)使用URDF创建机器人3D仿真模型
- ROS(indigo) 安装和使用更新版本的Gazebo----3,4,5,6,7 附:中国机器人大赛中型组仿真比赛说明
- ROS(indigo) 安装和使用更新版本的Gazebo----3,4,5,6,7 附:中国机器人大赛中型组仿真比赛说明
- ROS 学习系列 -- 使用urdf创建机器人模型在Rviz中3D观察 之一 link使用
- ubuntu16.04下ROS操作系统学习笔记(四 )机器人系组成、URDF机器人建模、xacro模型优化
- ROS(indigo)机器人操作系统学习有趣丰富的Gazebo仿真示例evarobot
- ROS 学习系列 -- 使用urdf创建机器人模型在Rviz中3D观察 之二 joint 使用
- ROS(indigo)机器人操作系统学习有趣丰富的Gazebo仿真示例evarobot
- ROS 学习系列 -- 使用urdf创建机器人模型在Rviz中3D观察 之一 link使用
- ROS(indigo) 安装和使用更新版本的Gazebo----3,4,5,6,7 附:中国机器人大赛中型组仿真比赛说明
- ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse
- ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse
- ROS学习笔记------ROS机器人系统设计-----基础编程 day 7 2019/3/2 帅某(URDF机器人建模,urdf功能包的建立,urdf相关模型建立代码已经上传)
- ROS(indigo)机器人操作系统学习有趣丰富的Gazebo仿真示例evarobot
- ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse
- ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse
- ROS中gazebo工具学习(使用gazebo加载机器人模型)
- ROS(indigo)国外开源示例包括多机器人控制等基于V-Rep和Gazebo的仿真
- ROS_Kinetic_25 在ubuntu16.04使用Leap_motion并作为手势输入控制Gazebo中的机器人