admin管理员组文章数量:1598071
ROS中gazebo配置教程详解
- 机器人模型文件
- 获取原始URDF模型文件
- 采用xacro格式改写文件
- 增加gazebo插件描述
- 增加传动transmission
- 最后将上面三个文件合成一个文件
- 环境XX.world文件
- 配置文件××.yaml
- 启动文件launch
- 启动环境
- 加载机器人模型
- 加载并启动控制器
- 总启动文件
- 验证启动是否正确
每次配置机械臂到gazebo中都要浪费很多时间,网上教程多而杂乱,如何快速合理配置是机械臂参数,启动gazebo是一个困扰我很久的问题,本文将详细写每个配置过程。
将机器人模型导入gazebo并可以实现控制和数据采集所需步骤:
- 1.安装gazebo,最好是比较新的版本
- 2.机器人模型文件
- 3.机器人环境文件
- 4.控制器参数配置
- 5.启动文件
机器人模型文件
获取原始URDF模型文件
URDF是一种描述机器人结构的常用文件,格式为XML,其内包含了连杆形状和尺寸、关节类型等,作为大神是可以直接写出URDF的,但是最简单的方法还是直接通过工具从SolidWorks直接导出URDF文件。具体教程参照Solidworks模型转换到URDF格式并配置Moveit的详细教程
获得得URDF文件如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- This URDF was automatically created by SolidWorks to URDF Exporter! Originally created by Stephen Brawner (brawner@gmail)
Commit Version: 1.5.0-0-g9aa0fdb Build Version: 1.5.7004.21443
For more information, please see http://wiki.ros/sw_urdf_exporter -->
<robot
name="armc_description">
<link name="world"/>
<joint name="fixed" type="fixed">
<parent link="world"/>
<child link="base_link"/>
</joint>
<link
name="base_link">
<inertial>
<origin
xyz="2.7291E-05 6.0375E-05 0.070392"
rpy="0 0 0" />
<mass
value="0.30535" />
<inertia
ixx="0.00091531"
ixy="-2.4502E-07"
ixz="2.9378E-07"
iyy="0.00091481"
iyz="8.1214E-07"
izz="0.00047819" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://armc_description/meshes/base_link.STL" />
</geometry>
<material
name="">
<color
rgba="1 1 1 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://armc_description/meshes/base_link.STL" />
</geometry>
</collision>
</link>
<link
name="Link1">
<inertial>
<origin
xyz="-9.6229E-07 -0.00081654 0.22221"
rpy="0 0 0" />
<mass
value="0.29195" />
<inertia
ixx="0.00091458"
ixy="1.0429E-07"
ixz="-1.9214E-10"
iyy="0.00078906"
iyz="-3.0542E-06"
izz="0.00046485" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://armc_description/meshes/Link1.STL" />
</geometry>
<material
name="">
<color
rgba="1 1 1 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://armc_description/meshes/Link1.STL" />
</geometry>
</collision>
</link>
<joint
name="Joint1"
type="continuous">
<origin
xyz="0 0 0"
rpy="0 0 0" />
<parent
link="base_link" />
<child
link="Link1" />
<axis
xyz="0 0 1" />
<limit
lower="-3.14"
upper="3.14"
effort="60"
velocity="20" />
</joint>
</robot>
采用xacro格式改写文件
xacro文件可以帮助我们压缩URDF文件大小,并且增加文件的可读性和可维护性。xacro可以采用宏定义,循环等方式写机器人模型文件,可以极大地缩减文件的大小。
对于小白党来时说,文件大小影响不大,重要的是快速实现相应功能,本文介绍一种最简单的方法,直接将上异步的URDF复制到一个新建文件**.xacro文件中,然后添加
<robot name="armc" xmlns:xacro="http://wiki.ros/xacro">
armc.xacro文件如下
<?xml version="1.0"?>
<robot name="armc" xmlns:xacro="http://wiki.ros/xacro">
<link name="world"/>
<joint name="fixed" type="fixed">
<parent link="world"/>
<child link="base_link"/>
</joint>
<link
name="base_link">
<inertial>
<origin
xyz="2.7291E-05 6.0375E-05 0.070392"
rpy="0 0 0" />
<mass
value="0.30535" />
<inertia
ixx="0.00091531"
ixy="-2.4502E-07"
ixz="2.9378E-07"
iyy="0.00091481"
iyz="8.1214E-07"
izz="0.00047819" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://armc_description/meshes/base_link.STL" />
</geometry>
<material
name="">
<color
rgba="1 1 1 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://armc_description/meshes/base_link.STL" />
</geometry>
</collision>
</link>
<link
name="Link1">
<inertial>
<origin
xyz="-9.6229E-07 -0.00081654 0.22221"
rpy="0 0 0" />
<mass
value="0.29195" />
<inertia
ixx="0.00091458"
ixy="1.0429E-07"
ixz="-1.9214E-10"
iyy="0.00078906"
iyz="-3.0542E-06"
izz="0.00046485" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://armc_description/meshes/Link1.STL" />
</geometry>
<material
name="">
<color
rgba="1 1 1 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://armc_description/meshes/Link1.STL" />
</geometry>
</collision>
</link>
<joint
name="Joint1"
type="continuous">
<origin
xyz="0 0 0"
rpy="0 0 0" />
<parent
link="base_link" />
<child
link="Link1" />
<axis
xyz="0 0 1" />
<limit
lower="-3.14"
upper="3.14"
effort="60"
velocity="20" />
</joint>
</robot>
增加gazebo插件描述
主要用于添加gazebo插件以及一些gazebo属性,如设置仿真是杆件颜色、刚度等。
文件arm.gazebo如下
<?xml version="1.0"?>
<robot>
<!--设置连杆仿真属性-->
<gazebo reference="sensor_link">
<material>Gazebo/Red</material>
<mu1 value="10.0"/>
<mu2 value="10.0"/>
<kp value="0.3" />
<kd value="1.0" />
<fdir1 value="1 0 0"/>
<gravity value="true"/>
</gazebo>
<!--设置仿真时关节插件-->
<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<robotNamespace>armt</robotNamespace>
<robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType>
<legacyModeNS>true</legacyModeNS>
</plugin>
</gazebo>
<!-- 增加力传感器插件 -->
<gazebo
reference="sensor_joint">
<provideFeedback>true</provideFeedback>
</gazebo>-->
<!-- The ft_sensor plugin -->
<gazebo>
<plugin name="ft_sensor" filename="libgazebo_ros_ft_sensor.so">
<updateRate>100.0</updateRate>
<topicName>ft_sensor_topic</topicName>
<jointName>sensor_joint</jointName>
</plugin>
</gazebo>
</robot>
增加传动transmission
*_transmission.xacro文件
transmission是硬件抽象层中的一部分,transmission的任务很清晰, 主要是两个方向的任务:
- Actuator <–> Joint: 定义Joint的Pos, Vel, Tor与Motor的Pos, Vel, Tor.
- State: 将编码器(例如角度, 力矩传感器等)的数据, 传递给对应的Joint, 变成最终的RobotState.
注:本文直接主要配置两个,关节控制类型hardware_interface和传动比,其中传动比直接设置为1,Actuator执行器(动力源
文件内容如下
<?xml version="1.0"?>
<robot xmlns:xacro="http://ros/wiki/xacro" name="armt_joint">
<xacro:macro name="armt_joint" params="joint_prefix">
<transmission name="joint${joint_prefix}_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="joint${joint_prefix}">
<hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
</joint>
<actuator name="joint${joint_prefix}_motor">
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
</xacro:macro>
</robot>
最后将上面三个文件合成一个文件
*.xacro格式文件的好处是,可以写入宏定义,导入其他文件等,所以我们可以将arm.gazebo和_transmission.xacro导入到文件armc.xacro,其相关片段代码如下
<?xml version='1.0'?>
<robot name="armt" xmlns:xacro="http://www.ros/wiki/xacro">
<!-- 添加宏定义-->
<xacro:armt_joint joint_prefix="1"> </xacro:armt_joint>
<xacro:armt_joint joint_prefix="2"> </xacro:armt_joint>
<xacro:armt_joint joint_prefix="3"> </xacro:armt_joint>
<xacro:armt_joint joint_prefix="4"> </xacro:armt_joint>
<xacro:armt_joint joint_prefix="5"> </xacro:armt_joint>
<xacro:armt_joint joint_prefix="6"> </xacro:armt_joint>
<xacro:armt_joint joint_prefix="7"> </xacro:armt_joint>
<xacro:include filename="$(find armt_description)/urdf/arm.gazebo" />
<xacro:include filename="$(find armt_description)/urdf/position_transmition.xacro" />
环境XX.world文件
环境文件写成**.world,一般是是现在gazebo中编辑好环境,最后生成world文件,下面给出了一个简单的示例。
<?xml version="1.0" ?>
<sdf version="1.4">
<!-- We use a custom world for the rrbot so that the camera angle is launched correctly -->
<world name="default">
<include>
<uri>model://ground_plane</uri>
</include>
<!-- Global light source -->
<include>
<uri>model://sun</uri>
</include>
<!-- Focus camera on tall pendulum -->
<gui fullscreen='0'>
<camera name='user_camera'>
<pose>4.927360 -4.376610 3.740080 0.000000 0.275643 2.356190</pose>
<view_controller>orbit</view_controller>
</camera>
</gui>
</world>
</sdf>
配置文件××.yaml
gazebo用了ros_control,控制器创建时需要一些参数配置,如果直接在××.launch文件中输入配置参数,会使文件很大且很复杂,所以采用××.yaml文件配置参数
controller.yaml文件配置如下
armt:
# Publish all joint states
joint_state_controller:
type: joint_state_controller/JointStateController
publish_rate: 50
joint_trajectory_controller:
type: "position_controllers/JointTrajectoryController"
joints:
- joint1
- joint2
- joint3
- joint4
- joint5
- joint6
- joint7
gains:
joint1: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint2: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint3: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint4: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint5: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint6: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint7: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint_positions_controller:
type: "position_controllers/JointGroupPositionController"
joints:
- joint1
- joint2
- joint3
- joint4
- joint5
- joint6
- joint7
gains:
joint1: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint2: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint3: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint4: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint5: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint6: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint7: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
需要注意:
- 1 一个配置文件可以写多个控制器参数,甚至可以写其他配置参数
- 2名空间必须与××.gazebo文件中的命名空间相同
启动文件launch
启动文件可以一次加载多个节点,所以使用起来非常方便,我们将启动文件分为4个,当然也可以写成一个,这个无所谓。
分4个文件:
- 1 启动环境
- 2 加载机械臂模型
- 3 加载控制器,包括命令控制器和状态控制器
- 4 总启动,用于加载前三个文件
启动环境
环境启动文件world.launch如下
<?xml version="1.0" encoding="UTF-8"?>
<launch>
<arg name="world_name" value="$(find robots_gazebo)/worlds/robots.world"/>
<arg name="paused" default="false"/>
<arg name="use_sim_time" default="false"/>
<arg name="gui" default="true"/>
<arg name="headless" default="false"/>
<arg name="debug" default="false"/>
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(arg world_name)" />
<arg name="paused" value="$(arg paused)"/>
<arg name="use_sim_time" value="$(arg use_sim_time)"/>
<arg name="gui" value="$(arg gui)"/>
<arg name="headless" value="$(arg headless)"/>
<arg name="debug" value="$(arg debug)"/>
</include>
</launch>
加载机器人模型
rabot.launch机器人结构模型参数加载文件
<launch>
<!-- Load the URDF into the ROS Parameter Server -->
<param name="robot_description" command="$(find xacro)/xacro.py '$(find armt_description)/urdf/armt.xacro'" />
<!-- Run a python script to the send a service call to gazebo_ros to spawn a URDF robot -->
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
args="-urdf -model armt -param robot_description"/>
</launch>
加载并启动控制器
controller.launch文件,需要注意命名空间一致型,且控制器类型与transmission文件中必须相同。
<launch>
<!--加载控制器参数-->
<rosparam file="$(find armt_gazebo)/config/controller.yaml" command="load"/>
<!--加载位置控制器-->
<node name="armt_controller_spawner" pkg="controller_manager" type="spawner" respawn="true"
output="screen" ns="/armt" args="joint_positions_controller" />
<!--加载关节状态控制器-->
<node name="joint_controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
output="screen" ns="/armt" args="joint_state_controller" />
<!-- 转换关节状态到TF transforms来加载rviz -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
respawn="false" output="screen">
<remap from="/joint_states" to="armt/joint_states" />
</node>
</launch>
总启动文件
包含上面三个文件即可
<launch>
<!--加载机器人模型和环境参数-->
<include file="$(find armt_gazebo)/launch/armt_world.launch" />
<!--加载机器人模型和环境参数-->
<include file="$(find armt_gazebo)/launch/armt_description.launch" />
<!--加载控制器-->
<include file="$(find armt_gazebo)/launch/armt_position_controller.launch" />
</launch>
验证启动是否正确
启动后界面如下
用rostopic list查看是否所有话题都已经启动
d@f:~$ rostopic list
/armt/joint_positions_controller/command
/armt/joint_states
/clock
/gazebo/link_states
/gazebo/model_states
/gazebo/parameter_descriptions
/gazebo/parameter_updates
/gazebo/set_link_state
/gazebo/set_model_state
/gazebo_gui/parameter_descriptions
/gazebo_gui/parameter_updates
/rosout
/rosout_agg
/tf
/tf_static
版权声明:本文标题:ROS中gazebo配置教程详解 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1728297391a1152589.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论