敞开生长之旅!这是我参加「日新计划 12 月更文挑战」的第19天,点击查看活动详情
先完成一个机器人joint的操控
创立一个机器人类似云台,完成航向和俯仰操控。
创立一个有joint的xacro文件
怎样构建 及各标签含义及运用 参阅:gazebo tutorial :Using a URDF in Gazebo
给出xacro文件代码及注释
<?xml version="1.0" ?>
<robot name="swivel" xmlns:xacro="http://www.ros.org/wiki/xacro">
<material name="SwivelWhite"> <color rgba="1.0 1.0 1.0 1"/></material>
<material name="SwivelLightGray"><color rgba="0.8 0.8 0.8 1"/></material>
<material name="SwivelMedGray"> <color rgba="0.6 0.6 0.6 1"/></material>
<material name="SwivelDarkGray"> <color rgba="0.4 0.4 0.4 1"/></material>
<material name="SwivelRed"> <color rgba="0.5 0.4 0.4 1"/></material>
<material name="SwivelGreen"> <color rgba="0.4 0.5 0.4 1"/></material>
<material name="SwivelBlue"> <color rgba="0.4 0.4 0.5 1"/></material>
<!-- ros_control plugin -->
<!-- 底盘 base 扁立方体 灰色 -->
<link name="base">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry >
<box size="0.1 0.1 0.02" />
</geometry>
<material name="SwivelLightGray" />
</visual>
<!-- gazebo里collision有必要有 磕碰特点 -->
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry >
<box size="0.1 0.1 0.02" />
</geometry>
</collision>
<!-- gazebo里inertial有必要有 惯性特点 -->
<inertial>
<mass value="9"/>
<inertia ixx="9.0" ixy="0.0" ixz="0.0" iyy="9.0" iyz="0.0" izz="9.0"/>
</inertial>
</link>
<!-- gazebo里加载 相应link -->
<gazebo reference="base">
<material>Gazebo/Gray</material>
</gazebo>
<!-- 竖轴 link_1 长立方体 蓝色 可绕底盘z轴转360度 -->
<link name="link_1">
<visual>
<origin xyz="0 0 0.06" rpy="0 0 0" />
<geometry >
<box size="0.05 0.05 0.1" />
</geometry>
<material name="SwivelBlue" />
</visual>
<!-- gazebo里collision有必要有 磕碰特点 -->
<collision>
<origin xyz="0 0 0.06" rpy="0 0 0" />
<geometry >
<box size="0.05 0.05 0.1" />
</geometry>
</collision>
<!-- gazebo里inertial有必要有 惯性特点 -->
<inertial>
<mass value="4"/>
<inertia ixx="4.0" ixy="0.0" ixz="0.0" iyy="4.0" iyz="0.0" izz="4.0"/>
</inertial>
</link>
<gazebo reference="link_1">
<material>Gazebo/Blue</material>
</gazebo>
<!-- 底盘与竖轴的joint swivel_J0 -->
<joint name="swivel_J0" type="revolute">
<parent link="base"/>
<child link="link_1"/>
<origin xyz="0 0 0" rpy="0 0 0" />
<axis xyz="0 0 1" />
<limit lower="0" upper="6.28" effort="10"
velocity="1.0" />
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<!-- 横轴 link_2 立方体 红色-->
<link name="link_2">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry >
<box size="0.1 0.2 0.1" />
</geometry>
<material name="SwivelRed" />
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry >
<box size="0.1 0.2 0.1" />
</geometry>
</collision>
<inertial>
<mass value="2"/>
<inertia ixx="2.0" ixy="0.0" ixz="0.0" iyy="2.0" iyz="0.0" izz="2.0"/>
</inertial>
</link>
<gazebo reference="link_2">
<material>Gazebo/Red</material>
</gazebo>
<!-- 竖轴与横轴 的joint 做俯仰运动-->
<joint name="swivel_J1" type="revolute">
<parent link="link_1"/>
<child link="link_2"/>
<origin xyz="0 0 0.190" rpy="0 0 0" />
<axis xyz="1 0 0" />
<limit lower="-1.745" upper="2.356" effort="10"
velocity="1.0" />
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="camera_mount">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry >
<box size="0.05 0.05 0.05"/>
</geometry>
<material name="SwivelGreen" />
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry >
<box size="0.05 0.05 0.05"/>
</geometry>
</collision>
<inertial>
<mass value="0.5"/>
<inertia ixx="0.5" ixy="0.0" ixz="0.0" iyy="0.5" iyz="0.0" izz="0.5"/>
</inertial>
</link>
<gazebo reference="camera_mount">
<material>Gazebo/Green</material>
</gazebo>
<joint name="camera_J2" type="fixed">
<parent link="link_2"/>
<child link="camera_mount"/>
<origin xyz="0 0 0" rpy="0 0 0" />
<axis xyz="1 0 0" />
<limit lower="-2.094" upper="2.670" effort="10"
velocity="1.0" />
<joint_properties damping="0.0" friction="0.0"/>
</joint>
</robot>
显示模型如下所示 此时模型仅仅能在gazebo中显示出来,还不能做任何的动作
添加 transmission 标签
详细参阅:gazebo Tutorial: ROS Control 将ros_control 用于自己的仿真机器人,需要在一般的URDF文件中参加其它标签。
< transmission >标签用于对应link的履行器到joint 。 其中首要的元素有:
- < joint name=” ” > name有必要关联到一个joint ,而且只能关联到一个 代码后边有解释
- < type > 传动器的品种,现在仅transmission_interface/SimpleTransmission能够完成
- < hardwareInterface > 在 < actuator >和 < joint >标签内部,gazebo_ros_control plugin 加载什么类型的硬件接口 (position, velocity or effort interfaces)
在link1与base的joint (swivel_J0) 后边参加
<!-- 传动装置 tran1 ,joint :swivel_J0 的 -->
<transmission name="tran1"><!-- 姓名自定义 -->
<type>transmission_interface/SimpleTransmission</type>
<joint name="swivel_J0"><!-- 姓名有必要与swivel_J0对应共同 -->
<hardwareInterface>EffortJointInterface</hardwareInterface>
</joint>
<actuator name="motor1"><!-- 姓名自定义 -->
<hardwareInterface>EffortJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
在link1与ling2的joint(swivel_J1)
<!-- 传动装置 tran1 ,joint :swivel_J1 的 -->
<transmission name="tran2"><!-- 姓名自定义 -->
<type>transmission_interface/SimpleTransmission</type>
<joint name="swivel_J1"> <!-- 姓名有必要与swivel_J1对应共同 -->
<hardwareInterface>EffortJointInterface</hardwareInterface>
</joint>
<actuator name="motor2"> <!-- 姓名自定义 -->
<hardwareInterface>EffortJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
参加 gazebo_ros_control plugin 的标签
该插件标签实践上会 解析 transmission 并 加载恰当的硬件接口和操控器管理器。 详细参阅:gazebo Tutorial: ROS Control
默许情况下,gazebo_ros_control插件非常简单,尽管它还能够经过其他插件体系结构进行扩展,以答应高档用户在ros_control和Gazebo之间创立自己的自定义机器人硬件接口。
gazebo_ros_control < plugin >有如下子标签:
- < robotNamespace > 标签用于的ros的命名空间 ,默许是 robot name
- < controlPeriod > 操控器的更新周期(对应源码的update函数 调用频率 后边再对应)
- 对应源码
- < robotParam > 默许是’/robot_description’
- < robotSimType > 重点 用户能够扩展的机器人仿真接口 能够自己做插件,然后在此地方加载。 默许是已经写好的 DefaultRobotHWSim
后边 先用默许方式操控下 再用自己写的插件操控
在文件中参加如下代码
<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<robotNamespace>/swivel</robotNamespace>
<controlPeriod>0.01</controlPeriod>
<robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType>
</plugin>
</gazebo>
创立一个 .yaml装备文件(装备操控器)
操控器能够自己写,然后经过launch文件加载 也能够运用写好的操控器 直接写一个装备文件(.yaml)然后经过launch文件 将装备参数加载到参数服务器,在launch 文件里 发动操控器(controller_manager)该源码会依据参数加载对应的操控器(装备文件里的)。
swivel:
# Publish all joint states -----------------------------------
swiveljoint_state_controller:
type: joint_state_controller/JointStateController
publish_rate: 50
# Position Controllers ---------------------------------------
swiveljoint1_position_controller:
type: effort_controllers/JointPositionController
joint: swivel_J0
pid: {p: 100.0, i: 0.01, d: 10.0}
swiveljoint2_position_controller:
type: effort_controllers/JointPositionController
joint: swivel_J1
pid: {p: 100.0, i: 0.01, d: 10.0}
写launch发动文件
<launch>
<!-- 发动gazebo world为默许空世界 -->
<include file="$(find hector_gazebo_worlds)/launch/start.launch"/>
<!-- Load the URDF into the ROS Parameter Server -->
<param name="robot_description"
command="$(find xacro)/xacro.py '$(find swivel_description)/model/swivel_test.urdf.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 rrbot -param robot_description"/>
<!-- Load joint controller configurations from YAML file to parameter server -->
<rosparam file="$(find swivel_description)/config/swivel_gimbal_control.yaml" command="load"/>
<!-- load the controllers -->
<node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
output="screen" ns="/swivel" args="swiveljoint_state_controller swiveljoint1_position_controller swiveljoint2_position_controller --shutdown-timeout 3"/>
</launch>
履行该launch文件
roslaunch swivel_world.launch
能够看到.yaml 里的操控器已经加载 而且发动了
发布操控命令
由于是调用ros里边写好的操控器,所以不需要知道源码里是怎样接收音讯,然后怎样处理的。也不必纠结为什么要发布这个topic。由于源码接收的便是这个topic。。。
rostopic pub -1 /swivel/swiveljoint1_position_controller/command std_msgs/Float64 "data: 1.5"
然后会发现 竖轴转动了。已经成功操控了机器人的关节。
参阅底下有rqt东西怎样运用 能够发布topic 能够画曲线
探求怎样完成的
撸源码探求ros gazebo里的 硬件笼统构建
- ros里的操控器
写自己的插件完成操控
- 接下来要撸ros相关部分的源码了。探求是怎样完成的
- 然后是模仿源码写自己的插件 机器人接口插件 和 操控器插件