1.Moveit 创建六轴机械臂模型
一、從URDF到XACRO
1.聲明xml與xacro
<?xml version="1.0"?> <robot name="arm" xmlns:xacro="http://ros.org/wiki/xacro">2.聲明模型所需要的宏,今后便于修改。通過修改對應宏的參數即可對全局參數進行修改。
<!-- Defining the colors used in this robot --><material name="Black"><color rgba="0 0 0 1"/></material><material name="White"><color rgba="1 1 1 1"/></material><material name="Blue"><color rgba="0 0 1 1"/></material><material name="Red"><color rgba="1 0 0 1"/></material><!-- Constants --><xacro:property name="M_PI" value="3.14159"/><!-- link1 properties --><xacro:property name="link1_width" value="0.03" /><xacro:property name="link1_len" value="0.10" /><!-- link2 properties --><xacro:property name="link2_width" value="0.03" /><xacro:property name="link2_len" value="0.14" /><!-- link3 properties --><xacro:property name="link3_width" value="0.03" /><xacro:property name="link3_len" value="0.22" /><!-- link4 properties --><xacro:property name="link4_width" value="0.025" /><xacro:property name="link4_len" value="0.06" /><!-- link5 properties --><xacro:property name="link5_width" value="0.03" /><xacro:property name="link5_len" value="0.06" /><!-- link6 properties --><xacro:property name="link6_width" value="0.04" /><xacro:property name="link6_len" value="0.02" /><!-- Left gripper --><xacro:property name="left_gripper_len" value="0.08" /><xacro:property name="left_gripper_width" value="0.01" /><xacro:property name="left_gripper_height" value="0.01" /><!-- Right gripper --><xacro:property name="right_gripper_len" value="0.08" /><xacro:property name="right_gripper_width" value="0.01" /><xacro:property name="right_gripper_height" value="0.01" /><!-- Gripper frame --><xacro:property name="grasp_frame_radius" value="0.001" /><!-- Inertial matrix --><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>(1)顏色宏。
(2)機器人尺寸。
(3)其中注意慣性矩陣的宏,慣性矩陣通過網上查詢,mass為質量大小,單位為kg。
3.關節與桿,六個關節,7個桿(多個base_link)
<!-- /// bottom_joint // --><joint name="bottom_joint" type="fixed"><origin xyz="0 0 0" rpy="0 0 0" /><parent link="base_link"/><child link="bottom_link"/></joint><link name="bottom_link"><visual><origin xyz=" 0 0 -0.02" rpy="0 0 0"/><geometry><box size="1 1 0.02" /></geometry><material name="Brown" /></visual><collision><origin xyz=" 0 0 -0.02" rpy="0 0 0"/><geometry><box size="1 1 0.02" /></geometry></collision><xacro:inertial_matrix mass="500"/></link><!-- / BASE LINK // --><link name="base_link"><visual><origin xyz="0 0 0" rpy="0 0 0" /><geometry><box size="0.1 0.1 0.04" /></geometry><material name="White" /></visual><collision><origin xyz="0 0 0" rpy="0 0 0" /><geometry><box size="0.1 0.1 0.04" /></geometry></collision><xacro:inertial_matrix mass="1"/></link><joint name="joint1" type="revolute"><parent link="base_link"/><child link="link1"/><origin xyz="0 0 0.02" rpy="0 ${M_PI/2} 0" /><axis xyz="-1 0 0" /><limit effort="300" velocity="1" lower="-2.96" upper="2.96"/><dynamics damping="50" friction="1"/></joint><!-- / LINK1 // --><link name="link1" ><visual><origin xyz="-${link1_len/2} 0 0" rpy="0 ${M_PI/2} 0" /><geometry><cylinder radius="${link1_width}" length="${link1_len}"/></geometry><material name="Blue" /></visual><collision><origin xyz="-${link1_len/2} 0 0" rpy="0 ${M_PI/2} 0" /><geometry><cylinder radius="${link1_width}" length="${link1_len}"/></geometry></collision><xacro:inertial_matrix mass="1"/></link><joint name="joint2" type="revolute"><parent link="link1"/><child link="link2"/><origin xyz="-${link1_len} 0 0.0" rpy="-${M_PI/2} 0 ${M_PI/2}" /><axis xyz="1 0 0" /><limit effort="300" velocity="1" lower="-2.35" upper="2.35" /><dynamics damping="50" friction="1"/></joint><!-- /// LINK2 // --><link name="link2" ><visual><origin xyz="0 0 ${link2_len/2}" rpy="0 0 0" /><geometry><cylinder radius="${link2_width}" length="${link2_len}"/></geometry><material name="White" /></visual><collision><origin xyz="0 0 ${link2_len/2}" rpy="0 0 0" /><geometry><cylinder radius="${link2_width}" length="${link2_len}"/></geometry></collision><xacro:inertial_matrix mass="1"/></link><joint name="joint3" type="revolute"><parent link="link2"/><child link="link3"/><origin xyz="0 0 ${link2_len}" rpy="0 ${M_PI} 0" /><axis xyz="-1 0 0" /><limit effort="300" velocity="1" lower="-2.62" upper="2.62" /><dynamics damping="50" friction="1"/></joint><!-- / LINK3 / --><link name="link3" ><visual><origin xyz="0 0 -${link3_len/2}" rpy="0 0 0" /><geometry><cylinder radius="${link3_width}" length="${link3_len}"/></geometry><material name="Blue" /></visual><collision><origin xyz="0 0 -${link3_len/2}" rpy="0 0 0" /><geometry><cylinder radius="${link3_width}" length="${link3_len}"/></geometry></collision><xacro:inertial_matrix mass="1"/></link><joint name="joint4" type="revolute"><parent link="link3"/><child link="link4"/><origin xyz="0.0 0.0 -${link3_len}" rpy="0 ${M_PI/2} ${M_PI}" /><axis xyz="1 0 0" /><limit effort="300" velocity="1" lower="-2.62" upper="2.62" /><dynamics damping="50" friction="1"/></joint><!-- /// LINK4 --><link name="link4" ><visual><origin xyz="${link4_len/2} 0 0" rpy="0 ${M_PI/2} 0" /><geometry><cylinder radius="${link4_width}" length="${link4_len}"/></geometry><material name="Black" /></visual><collision><origin xyz="${link4_len/2} 0 0" rpy="0 ${M_PI/2} 0" /><geometry><cylinder radius="${link4_width}" length="${link4_len}"/></geometry></collision><xacro:inertial_matrix mass="1"/></link><joint name="joint5" type="revolute"><parent link="link4"/><child link="link5"/><origin xyz="${link4_len} 0.0 0.0" rpy="0 ${M_PI/2} 0" /><axis xyz="1 0 0" /><limit effort="300" velocity="1" lower="-2.62" upper="2.62" /><dynamics damping="50" friction="1"/></joint><!-- // LINK5 / --><link name="link5"><visual><origin xyz="0 0 ${link4_len/2}" rpy="0 0 0" /><geometry><cylinder radius="${link5_width}" length="${link5_len}"/></geometry><material name="White" /></visual><collision><origin xyz="0 0 ${link4_len/2} " rpy="0 0 0" /><geometry><cylinder radius="${link5_width}" length="${link5_len}"/></geometry></collision><xacro:inertial_matrix mass="1"/></link><joint name="joint6" type="revolute"><parent link="link5"/><child link="link6"/><origin xyz="0 0 ${link4_len}" rpy="${1.5*M_PI} -${M_PI/2} 0" /><axis xyz="1 0 0" /><limit effort="300" velocity="1" lower="-6.28" upper="6.28" /><dynamics damping="50" friction="1"/></joint><!-- LINK6 / --><link name="link6"><visual><origin xyz="${link6_len/2} 0 0 " rpy="0 ${M_PI/2} 0" /><geometry><cylinder radius="${link6_width}" length="${link6_len}"/></geometry><material name="Blue" /></visual><collision><origin xyz="${link6_len/2} 0 0" rpy="0 ${M_PI/2} 0" /><geometry><cylinder radius="${link6_width}" length="${link6_len}"/></geometry></collision><xacro:inertial_matrix mass="1"/></link><joint name="finger_joint1" type="prismatic"><parent link="link6"/><child link="gripper_finger_link1"/><origin xyz="0.0 0 0" /><axis xyz="0 1 0" /><limit effort="100" lower="0" upper="0.06" velocity="1.0"/><dynamics damping="50" friction="1"/></joint>(1)<joint>: 定義joint的名字、定義joint的類別、定義joint的起始位姿,定義所連接桿的父子關系。<axis xyz=" ">對旋轉軸方向進行了定義。通過<limit>對力、速度、角度的限制(弧度制)。通過<dynamics>對動力學參數阻尼與摩擦進行了定義。
(2)<link>:分<visual>可視化部分與<collision>碰撞部分。其中可視化部分定義了桿模型建立的起始位置、幾何形狀與顏色(gazebo需要重新定義)。其中碰撞部分定義了碰撞包圍盒的起始位置與幾何形狀。同時此處的碰撞矩陣<inertial>部分通過宏定義的方式只對質量mass(kg)進行了修改。
4.加入gazebo屬性
<!-- / Gazebo // --><gazebo reference="bottom_link"><material>Gazebo/White</material></gazebo><gazebo reference="base_link"><material>Gazebo/White</material></gazebo><gazebo reference="link1"><material>Gazebo/Blue</material></gazebo><gazebo reference="link2"><material>Gazebo/White</material></gazebo><gazebo reference="link3"><material>Gazebo/Blue</material></gazebo><gazebo reference="link4"><material>Gazebo/Black</material></gazebo><gazebo reference="link5"><material>Gazebo/White</material></gazebo><gazebo reference="link6"><material>Gazebo/Blue</material></gazebo><gazebo reference="gripper_finger_link1"><material>Gazebo/White</material></gazebo><gazebo reference="gripper_finger_link2"><material>Gazebo/White</material></gazebo><!-- Transmissions for ROS Control --><xacro:macro name="transmission_block" params="joint_name"><transmission name="tran1"><type>transmission_interface/SimpleTransmission</type><joint name="${joint_name}"><hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface></joint><actuator name="motor1"><hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface><mechanicalReduction>1</mechanicalReduction></actuator></transmission></xacro:macro><xacro:transmission_block joint_name="joint1"/><xacro:transmission_block joint_name="joint2"/><xacro:transmission_block joint_name="joint3"/><xacro:transmission_block joint_name="joint4"/><xacro:transmission_block joint_name="joint5"/><xacro:transmission_block joint_name="joint6"/><xacro:transmission_block joint_name="finger_joint1"/><!-- ros_control plugin --><gazebo><plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so"><robotNamespace>/arm</robotNamespace></plugin></gazebo>(1)gazebo需要重新定義材料顏色。
(2)通過編寫宏與使用宏,為每個joint提供傳動裝置,注意硬件抽象的接口。
(3)調用ros_control插件,并再機器人命名空間對機器人進行命名。ros_control插件是libgazebo_ros_control.so。
5.機械臂模型可視化
通過rviz可視化顯示。首先編寫launch文件,依次完成
(1)加載機器人模型參數,在相應位置添加正確的路徑。
(2)關節控制器GUI調用,小工具——滑動條。
(3)joint_state_publisher,注意加上_gui,其作用是發布關節狀態(除了fixed),關節狀態發布者。robot_state_publisher,作用是將機器人各個link和joint之間關系通過TF形式整理成三維姿態信息并發布。
(4)運行rviz。
launch><arg name="model" /><!-- 加載機器人模型參數 --><param name="robot_description" command="$(find xacro)/xacro --inorder $(find marm_description)/urdf/arm.xacro" /><!-- 設置GUI參數,顯示關節控制插件 --><param name="use_gui" value="true"/><!-- 運行joint_state_publisher節點,發布機器人的關節狀態 --><node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" /><!-- 運行robot_state_publisher節點,發布tf --><node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" /><!-- 運行rviz可視化界面 --><node name="rviz" pkg="rviz" type="rviz" args="-d $(find marm_description)/urdf.rviz" required="true" /> </launch>原書基于ubuntu16.04版本kinetic版本,需要小改。
6.運行launch文件
出現警告,但rviz仍正常運行:
?
(1)robot_state_publisher通過TF方式發布link與joint的三維位姿。勾選TF。?
?(2)GUI界面的使用
拖動條調整除fixed以外的關節的角度。
Randomize隨機位姿。
Center初始位姿。
總結
以上是生活随笔為你收集整理的1.Moveit 创建六轴机械臂模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HCNP-路由交换:交换机基础
- 下一篇: CentOS下配置webrtc服务器