• ROS中3D机器人建模(四)


    一.创建一个7-DOF机械臂机器人

    创建一个名为seven_dof_arm.xacro的文件,写入相应的代码,其关节名称如下:

    bottom_joint

    shoulder_pan_joint

    shoulder_pitch_joint

    elbow_roll_joint

    elbow_pitch_joint

    wrist_roll_joint

    wrist_pitch_joint

    gripper_roll_joint

    finger_joint1

    finger_joint2

    二.解析7-DOF机械臂的xacro模型

    我们将在这个机器人上定义10个连杆和9个关节,在机器人夹爪中定义2个连杆和2个关节。

    1.使用常量

    在xacro中使用常量可以让机器人的描述更简短、更可读。我们定义了每个连杆的角度-弧度换系数、PI值、长度 、高度和宽度:

    <xacro:property name="deg_to_rad" value="0.01745329251994329577"/>
    <xacro:property name="M_PI" value="3.14159"/>
     <xacro:property name="elbow_pitch_len" value="0.22" />
    <xacro:property name="elbow_pitch_width" value="0.04" />
     <xacro:property name="elbow_pitch_height" value="0.04" />
    

    2.使用宏

    在以下代码中定义了宏,避免重复并使代码更加简短。如下:

     85    <xacro:macro name="inertial_matrix" params="mass">
     86       <inertial>
     87         <mass value="${mass}" />
     88         <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="0.5" iyz="0.0" izz="1.    0" />
     89       </inertial>
     90    </xacro:macro>
    

     这是惯性矩阵宏的定义,其中我们用mass作为参数。

    92    <xacro:macro name="transmission_block" params="joint_name">
     93       <transmission name="tran1">
     94         <type>transmission_interface/SimpleTransmission</type>
     95         <joint name="${joint_name}">
     96           <hardwareInterface>hardware_interface/PositionJointInterface</ha    rdwareInterface>
     97         </joint>
     98         <actuator name="motor1">
     99           <hardwareInterface>hardware_interface/PositionJointInterface</ha    rdwareInterface>
    100           <mechanicalReduction>1</mechanicalReduction>
    101         </actuator>
    102       </transmission>
    103    </xacro:macro>
    

     在这段代码中我们可以看到使用transmission(传动)标签的定义。

    transmission标签将关节与执行机构相关联。它定义了我们在某一关节中使用的传动类型,马达的类型即参数。

    它还定义了我们与ROS控制器通信时使用的硬件接口的类型。

    3.包含其他xacro文件

    我们可以通过使用xacro : include标签包含传感器的xacro定义来扩展xacro的功能。下面代码片段展示了如何在机器人xacro中包含传感器定义:

     <xacro:include filename="$(find mastering_ros_robot_description_pkg)/urd    f/sensors/xtion_pro_live.urdf.xacro"/>
    在这里我们包含了一个叫做Asus Xtion pro的传感器的xacro定义,当解析xacro文件时,这个定义被展开

    使用"$(find mastering_ros_robot_description_pkg)/urd    f/sensors/xtion_pro_live.urdf.xacro"/>我们就可以访问传感器的xacro定义,

    其中find是查找当前mastering_ros_robot_description_pkg软件包的位置。

    4.使用机器人夹爪

    机器人夹爪用于抓取和放置物体,夹爪属于简单的连接类型,他有2个关节,每个关节都是滑动关节,以下是一个夹爪关节的joint定义:

    440   <joint name="finger_joint1" type="prismatic">
    441     <parent link="gripper_roll_link"/>
    442     <child link="gripper_finger_link1"/>
    443     <origin xyz="0.0 0 0" />
    444     <axis xyz="0 1 0" />
    445       <limit effort="100" lower="0" upper="0.03" velocity="1.0"/>
    446 
    447 
    448       <safety_controller k_position="20"
    449                          k_velocity="20"
    450                          soft_lower_limit="${-0.15 }"
    451                          soft_upper_limit="${ 0.0 }"/>
    452 
    453 
    454     <dynamics damping="50" friction="1"/>
    455   </joint>                      
    

     在这里,夹爪的第一个关节由gripper_roll_link和gripper_finger_link1构成,第二个关节由gripper_roll_link和gripper_finger_link2构成。

    连接结构如图所示:

    5.在RViz中查看7-DOF机械臂

    建立好机器人的模型后,我们可以在RViz中查看设计好的xacro文件,并使用关节状态发布者(joint state publisher)节点控制每个关节,使用机器人状态发布者(robot state publisher)节点发布机器人状态。

    可以使用名为view_arm.launch的启动文件去启动机器人仿真,代码如下:

     1 <launch>
     2     <arg name="model" />
     3     <!-- Parsing xacro and setting robot_description parameter -->
     4 
     5     <param name="robot_description" command="$(find xacro)/xacro --inorder    $(find mastering_ros_robot_description_pkg)/urdf/seven_dof_arm.xacro" />
     6 
     7 
     8     <!-- Setting gui parameter to true for display joint slider -->
     9     <param name="use_gui" value="true"/>
    10 
    11     <!-- Starting Joint state publisher node which will publish the joint v   alues -->
    12     <node name="joint_state_publisher" pkg="joint_state_publisher" type="jo   int_state_publisher" />
    13 
    14     <!-- Starting robot state publish which will publish tf -->            
    15     <node name="robot_state_publisher" pkg="robot_state_publisher" type="st   ate_publisher" />
    16 
    17     <!-- Launch visualization in rviz -->
    18     <node name="rviz" pkg="rviz" type="rviz" args="-d $(find mastering_ros_   robot_description_pkg)/urdf.rviz" required="true" />
    19 
    20 </launch>
    

     使用以下命令启动URDF:

    $ roslaunch mastering_ros_robot_description_pkg view_arm.launch

     该机器人将在RViz上显示,且同时打开了关节状态发布者(joint state publisher)的GUI

    如图所示:

    理解关节状态发布者
    关节状态发布者(joint state publisher)是一个ROS软件包,常用于与机器人的每个关节进行交互。该软件包包含joint_state_publisher节点,该节点将从URDF模型中找到非固定关节,

    并以sersor_msgs/JointState的消息格式发布每一个关节的关节状态值。

    在前面的启动文件view_arm.launsh中,我们启动了joint_state_publisher节点并将一个命名为use_gui的参数设置为true,如下所示:

     9     <param name="use_gui" value="true"/>                     
    10                               
    11     <!-- Starting Joint state publisher node which will publish the joint values    -->
    12     <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_st   ate_publisher" />
    

     如果我们将use_gui设置为true,那么joint_state_publisher节点将显示一个基于滑动条控件的窗口来控制每个关节。

    关节的下限位值和上限位值将取自joint标签内的limit标签相关联的上下限位数据。

    理解机器人状态发布者

    机器人状态发布者(robot state publisher)软件包可以将机器人的状态发布到tf,此软件包订阅了机器人的关节状态,使用URDF模型的运动表示来发布

    每个连杆的3D姿态,我们可以在启动文件中使用以下代码来实现机器人状态发布者节点:

    14     <!-- Starting robot state publish which will publish tf -->              
    15     <node name="robot_state_publisher" pkg="robot_state_publisher" type="stat   e_publisher" />
    

     在前面的启动文件view_arm.launch中,我们启动了这个节点来发布机械臂的tf,我们可以通过点击RViz上的tf选项可视化机器人的变换。

  • 相关阅读:
    rip协议
    IP地址的计算以及子网掩码的计算
    jQuery知识点
    JavaScript 语言编程学习路线
    JS中AJAX知识
    .以及JDK1.5ConcurrentHashMap新特性
    Java程序执行顺序
    观察者设计模式
    Servlet中Filter的学习
    JDBC和连接池知识点
  • 原文地址:https://www.cnblogs.com/tanshengjiang/p/12287717.html
Copyright © 2020-2023  润新知