六自由度机械臂gazebo仿真
要仿真则需要机器人模型,所以先得有.urdf或者.xacro文件。接着,要想模型在Gazebo里运动起来,又需要在xacro里设置一些运动关节的 transmission;其次,为了让它在gazebo里显示出来,需要借助于gazebo_ros这个package的node:spawn_model来加载一个empty_world;随后,关节的pid设置是需要一个配置文件的robot_control.
·
要仿真则需要机器人模型,所以先得有.urdf或者.xacro文件。
接着,要想模型在Gazebo里运动起来,又需要在xacro里设置一些运动关节的 transmission;
其次,为了让它在gazebo里显示出来,需要借助于gazebo_ros这个package的node:spawn_model来加载一个empty_world;
随后,关节的pid设置是需要一个配置文件的robot_control.yaml;
最后则是利用launch来启动controller_manager这个package中的spawner这个node,加载第三步的配置并输入设定的controller以及发布robot的state到tf。
终端一: rosocre
终端二:
配置环境变量:source /opt/ros/kinetic/setup.bash
cd ~/catkin_ws/src/six_dof_arm_gazebo/urdf
sudo gedit six_dof_arm.xacro
一、xacro文件
路径: ~/catkin_ws/src/six_dof_arm_gazebo/urdf/six_dof_arm.xacro
代码如下:
<?xml version="1.0"?>
<robot name="six_dof_arm" xmlns:xacro="http://www.ros.org/wiki/xacro">
<!-- Include materials -->
<material name="Black">
<color rgba="0.0 0.0 0.0 1.0"/>
</material>
<material name="Red">
<color rgba="0.8 0.0 0.0 1.0"/>
</material>
<material name="White">
<color rgba="1.0 1.0 1.0 1.0"/>
</material>
<!-- Constants -->
<property name="deg_to_rad" value="0.01745329251994329577"/>
<property name="M_PI" value="3.14159"/>
<property name="x" value="0.0125"/>
<!-- base link properties -->
<property name="base_len" value="0.168" />
<property name="base_width" value="0.168" />
<property name="base_height" value="0.055" />
<!-- shoulder link properties -->
<property name="shoulder_radius" value="0.06" />
<property name="shoulder_len" value="0.085" />
<!-- bigarm link properties -->
<property name="bigarm_radius" value="0.03" />
<property name="bigarm_len" value="0.135" />
<!-- forearm link properties -->
<property name="forearm_radius" value="0.03" />
<property name="forearm_len" value="0.147" />
<!-- chuck link properties -->
<property name="chuck_len" value="0.08" />
<property name="chuck_width" value="0.03" />
<property name="chuck_height" value="0.03" />
<!-- inertial matrix macro definition -->
<xacro:macro name="inertial_matrix" params="mass">
<inertial>
<mass value="${mass}" />
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="0.5" iyz="0.0" izz="1.0" />
</inertial>
</xacro:macro>
<!-- transmission block macro definition -->
<xacro:macro name="transmission_block" params="joint_name">
<transmission name="tran1">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${joint_name}">
<hardwareInterface>PositionJointInterface</hardwareInterface>
</joint>
<actuator name="motor1">
<hardwareInterface>PositionJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
</xacro:macro>
<!-- / -->
<virtual_joint name="fixed_frame" type="fixed" parent_frame="base_link" child_link="base_link" />
<!-- / -->
<!-- BASE LINK -->
<link name="base_link">
<visual>
<origin xyz="0 0 0.0275" rpy="0 0 0" />
<geometry>
<box size="${base_len} ${base_width} ${base_height}" />
</geometry>
<material name="White" />
</visual>
<collision>
<origin xyz="0 0 0.0275" rpy="0 0 0" />
<geometry>
<box size="${base_len} ${base_width} ${base_height}" />
</geometry>
</collision>>
<xacro:inertial_matrix mass="1"/>
</link>
<gazebo reference="base_link">
<material>Gazebo/White</material>
</gazebo>
<joint name="shoulder_joint" type="revolute">
<parent link="base_link"/>
<child link="shoulder_link"/>
<origin xyz="0 0 0.055" rpy="0 0 0" />
<axis xyz="0 0 1" />
<limit effort="300" velocity="1" lower="-2.35619449" upper="2.35619449"/>
<dynamics damping="50" friction="1"/>
</joint>
<!-- / -->
<!-- SHOULDER LINK -->
<link name="shoulder_link" >
<visual>
<origin xyz="0 0 0.0425" rpy="0 0 0" />
<geometry>
<cylinder radius="${shoulder_radius}" length="${shoulder_len}"/>
</geometry>
<material name="Red" />
</visual>
<collision>
<origin xyz="0 0 0.0425" rpy="0 0 0" />
<geometry>
<cylinder radius="${shoulder_radius}" length="${shoulder_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
<gazebo reference="shoulder_link">
<material>Gazebo/Red</material>
</gazebo>
<joint name="bigarm_joint" type="revolute">
<parent link="shoulder_link"/>
<child link="bigarm_link"/>
<origin xyz="0 0 0.085" rpy="0 0 0" />
<axis xyz="0 1 0" />
<limit effort="300" velocity="1" lower="0.0" upper="1.483529864195" />
<dynamics damping="50" friction="1"/>
</joint>
<!-- / -->
<!-- BIGARM LINK -->
<link name="bigarm_link" >
<visual>
<origin xyz="0 0 0.0675" rpy="0 0 0" />
<geometry>
<cylinder radius="${bigarm_radius}" length="${bigarm_len}"/>
</geometry>
<material name="White" />
</visual>
<collision>
<origin xyz="0 0 0.0675" rpy="0 0 0" />
<geometry>
<cylinder radius="${bigarm_radius}" length="${bigarm_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
<gazebo reference="bigarm_link">
<material>Gazebo/White</material>
</gazebo>
<joint name="forearm_joint" type="revolute">
<parent link="bigarm_link"/>
<child link="forearm_link"/>
<origin xyz="0 0 0.135" rpy="0 0 0" />
<axis xyz="0 1 0" />
<limit effort="300" velocity="1" lower="-0.1745329251994329577" upper="1.65806278939" />
<dynamics damping="50" friction="1"/>
</joint>
<!-- / -->
<!--FOREARM LINK -->
<link name="forearm_link" >
<visual>
<origin xyz="0 0 0.0735" rpy="0 0 0" />
<geometry>
<cylinder radius="${forearm_radius}" length="${forearm_len}"/>
</geometry>
<material name="Black" />
</visual>
<collision>
<origin xyz="0 0 0.0735" rpy="0 0 0" />
<geometry>
<cylinder radius="${forearm_radius}" length="${forearm_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
<gazebo reference="forearm_link">
<material>Gazebo/Black</material>
</gazebo>
<joint name="chuck_joint" type="revolute">
<parent link="forearm_link"/>
<child link="chuck_link"/>
<origin xyz="0 0 0.147" rpy="0 0 0" />
<axis xyz="0 1 0" />
<limit effort="300" velocity="1" lower="-1.5707963267948966" upper="1.5707963267948966" />
<dynamics damping="50" friction="1"/>
</joint>
<!-- / -->
<!--FOREARM LINK -->
<link name="chuck_link" >
<visual>
<origin xyz="0.02 0 0.0155" rpy="0 0 0" />
<geometry>
<box size="${chuck_len} ${chuck_width} ${chuck_height}" />
</geometry>
<material name="Red" />
</visual>
<collision>
<origin xyz="0 0 0.0155" rpy="0 0 0" />
<geometry>
<box size="${chuck_len} ${chuck_width} ${chuck_height}" />
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
<gazebo reference="chuck_link">
<material>Gazebo/Red</material>
</gazebo>
<!-- / -->
<!-- Transmissions for ROS Control -->
<xacro:transmission_block joint_name="shoulder_joint"/>
<xacro:transmission_block joint_name="bigarm_joint"/>
<xacro:transmission_block joint_name="forearm_joint"/>
<xacro:transmission_block joint_name="chuck_joint"/>
<!-- / -->
<!-- ros_control plugin -->
<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<robotNamespace>/six_dof_arm</robotNamespace>
</plugin>
</gazebo>
</robot>
二 launch 启动文件
1)路径:
cd ~/catkin_ws/src/six_dof_arm_gazebo/launch
sudo gedit six_dof_arm_world.launch
这个six_dof_arm_world.launch文件的作用是使用gazebo_ros这个package启动empty world和加载spawn_model这个node.
代码如下:
<launch>
<!-- these are the arguments you can pass this launch file, for example paused:=true -->
<arg name="paused" default="false"/>
<arg name="use_sim_time" default="true"/>
<arg name="gui" default="true"/>
<arg name="headless" default="false"/>
<arg name="debug" default="false"/>
<!-- We resume the logic in empty_world.launch -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find six_dof_arm_gazebo)/worlds/six_dof_arm.world"/>
<arg name="debug" value="$(arg debug)" />
<arg name="gui" value="$(arg gui)" />
<arg name="paused" value="$(arg paused)"/>
<arg name="use_sim_time" value="$(arg use_sim_time)"/>
<arg name="headless" value="$(arg headless)"/>
</include>
<!-- Load the URDF into the ROS Parameter Server -->
<param name="robot_description" command="$(find xacro)/xacro.py '$(find six_dof_arm_gazebo)/urdf/six_dof_arm.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 six_dof_arm -param robot_description"/>
</launch>
2)路径:
cd ~/catkin_ws/src/six_dof_arm_gazebo/launch
这个six_dof_arm_gazebo_control.launch文件是用来启动controller_manager和发布joint states
<launch>
<!-- Launch Gazebo -->
<include file="$(find six_dof_arm_gazebo)/launch/seven_dof_arm_world.launch" />
<!-- Load joint controller configurations from YAML file to parameter server -->
<rosparam file="$(find six_dof_arm_gazebo)/config/six_dof_arm_gazebo_control.yaml" command="load"/>
<!-- load the controllers -->
<node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
output="screen" ns="/six_dof_arm" args="joint_state_controller
joint1_position_controller
joint2_position_controller
joint3_position_controller
joint4_position_controller
joint5_position_controller
joint6_position_controller"/>
<!-- convert joint states to TF transforms for rviz, etc -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
respawn="false" output="screen">
<remap from="/joint_states" to="/six_dof_arm/joint_states" />
</node>
</launch>
三 运行仿真
cd ~/catkin_ws/src/six_dof_arm_gazebo/launch
roslaunch gazebo_ros six_dof_arm_world.launch
据说,我建的模型好难看(破涕为笑),所以还要改~
四.设置控制器参数——six_dof_arm_gazebo/config/six_dof_arm_gazebo_control.yaml
six_dof_arm:
# Publish all joint states -----------------------------------
joint_state_controller:
type: joint_state_controller/JointStateController
publish_rate: 50
# Position Controllers ---------------------------------------
joint1_position_controller:
type: position_controllers/JointPositionController
joint: shoulder_joint
pid: {p: 100.0, i: 0.01, d: 10.0}
joint2_position_controller:
type: position_controllers/JointPositionController
joint: elbow_joint
pid: {p: 100.0, i: 0.01, d: 10.0}
joint3_position_controller:
type: position_controllers/JointPositionController
joint: bigarm_joint
pid: {p: 100.0, i: 0.01, d: 10.0}
joint4_position_controller:
type: position_controllers/JointPositionController
joint: forearm_joint
pid: {p: 100.0, i: 0.01, d: 10.0}
joint5_position_controller:
type: position_controllers/JointPositionController
joint: backarm_joint
pid: {p: 100.0, i: 0.01, d: 10.0}
joint6_position_controller:
type: position_controllers/JointPositionController
joint: chuck_joint
pid: {p: 100.0, i: 0.01, d: 10.0}
更多推荐
所有评论(0)