建模练习2 —— 手写一个机械臂的urdf模型

    科技2022-07-17  108

    建模练习2 —— 手写一个机械臂的urdf模型

    1.在catkin_ws/src下,创建功能包

    catkin_create_pkg marm_description urdf xacro

    在功能包中建立urdf、meshes、launch、config这四个文件夹,分别用于存放特定的文件 接下来编写marm.urdf文件

    2.用圆柱创建机械臂的基座

    <?xml version="1.0" ?> <robot name="marm"> <!-- / COLOR / --> <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> <!-- / BASE / --> <link name="base_link"> <visual> <origin rpy="0 0 0" xyz="0 0 0"/> <geometry> <cylinder length="0.04" radius="0.05"/> </geometry> <material name="White"/> </visual> </link> </robot>

    编写display_marm_urdf.launch文件

    <launch> <!-- 设置机器人模型路径参数 --> <param name="robot_description" textfile="$(find marm_description)/urdf/marm.urdf" /> <!-- 运行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)/config/marm_urdf.rviz" required="true" /> </launch>

    编译工作空间后在rviz中查看

    roslaunch marm_description display_marm_urdf.launch

    3.添加基座上的第一个连杆

    <!-- / LINK1 // --> <link name="link1"> <visual> <origin rpy="0 1.5707 0" xyz="-0.05 0 0"/> <geometry> <cylinder length="0.1" radius="0.03"/> </geometry> <material name="Blue"/> </visual> </link> <joint name="joint1" type="revolute"> <parent link="base_link"/> <child link="link1"/> <origin rpy="0 1.5707 0" xyz="0 0 0.02"/> <axis xyz="-1 0 0"/> <limit effort="300" lower="-3.14159" upper="3.14159" velocity="1"/> </joint>

    在rviz中查看 4.添加基座上的第二个连杆

    <!-- /// LINK2 // --> <link name="link2"> <visual> <origin rpy="0 0 0" xyz="0 0 0.07"/> <geometry> <cylinder length="0.14" radius="0.03"/> </geometry> <material name="White"/> </visual> </link> <joint name="joint2" type="revolute"> <parent link="link1"/> <child link="link2"/> <origin rpy="-1.5707 0 1.5707" xyz="-0.1 0 0.0"/> <axis xyz="1 0 0"/> <limit effort="300" lower="-3.14159" upper="3.14159" velocity="1"/> </joint>

    在rviz中查看 5.添加基座上的第三个连杆

    <!-- / LINK3 / --> <link name="link3"> <visual> <origin rpy="0 0 0" xyz="0 0 -0.075"/> <geometry> <cylinder length="0.15" radius="0.03"/> </geometry> <material name="Blue"/> </visual> </link> <joint name="joint3" type="revolute"> <parent link="link2"/> <child link="link3"/> <origin rpy="0 3.14159 0" xyz="0 0 0.14"/> <axis xyz="-1 0 0"/> <limit effort="300" lower="-3.14159" upper="3.14159" velocity="1"/> </joint>

    在rviz中查看 6.添加基座上的第四个连杆

    <!-- /// LINK4 --> <link name="link4"> <visual> <origin rpy="0 1.5707 0" xyz="0.03 0 0"/> <geometry> <cylinder length="0.06" radius="0.025"/> </geometry> <material name="Black"/> </visual> </link> <joint name="joint4" type="revolute"> <parent link="link3"/> <child link="link4"/> <origin rpy="0 1.5707 3.14159" xyz="0.0 0.0 -0.15"/> <axis xyz="1 0 0"/> <limit effort="300" lower="-3.14159" upper="3.14159" velocity="1"/> </joint>

    7.添加基座上的第五个连杆

    <!-- // LINK5 / --> <link name="link5"> <visual> <origin rpy="0 0 0" xyz="0 0 0.03"/> <geometry> <cylinder length="0.06" radius="0.03"/> </geometry> <material name="White"/> </visual> </link> <joint name="joint5" type="revolute"> <parent link="link4"/> <child link="link5"/> <origin rpy="0 1.5707 0" xyz="0.06 0.0 0.0"/> <axis xyz="1 0 0"/> <limit effort="300" lower="-3.14159" upper="3.14159" velocity="1"/> </joint>

    8.添加基座上的第六个连杆

    <!-- LINK6 / --> <link name="link6"> <visual> <origin rpy="0 1.5707 0" xyz="0.01 0 0 "/> <geometry> <cylinder length="0.02" radius="0.04"/> </geometry> <material name="Blue"/> </visual> </link> <joint name="joint6" type="revolute"> <parent link="link5"/> <child link="link6"/> <origin rpy="4.712385 -1.5707 0" xyz="0 0 0.06"/> <axis xyz="1 0 0"/> <limit effort="300" lower="-6.28318" upper="6.28318" velocity="1"/> </joint>

    9.添加两个夹爪

    <!-- // GRIPPER // --> <link name="gripper_finger_link1"> <visual> <origin rpy="0 1.5707 0" xyz="0.03 0 0"/> <geometry> <box size="0.03 0.01 0.06"/> </geometry> <material name="White"/> </visual> </link> <link name="gripper_finger_link2"> <visual> <origin rpy="0 1.5707 0" xyz="0.03 0 0"/> <geometry> <box size="0.03 0.01 0.06"/> </geometry> <material name="White"/> </visual> </link> <joint name="finger_joint1" type="prismatic"> <parent link="link6"/> <child link="gripper_finger_link1"/> <origin rpy="0 0 0" xyz="0.02 -0.03 0"/> <axis xyz="0 1 0"/> <limit effort="100" lower="0" upper="0.06" velocity="0.02"/> </joint> <joint name="finger_joint2" type="fixed"> <parent link="link6"/> <child link="gripper_finger_link2"/> <origin rpy="0 0 0" xyz="0.02 0.03 0"/> </joint>

    这里边finger_joint1用的是prismatic(平移),它是个主动关节,而finger_joint2用的是fixed,它是不能动的。

    10.添加一个虚拟坐标系

    <!-- // GRASPING FRAME // --> <link name="grasping_frame"/> <joint name="grasping_frame_joint" type="fixed"> <parent link="link6"/> <child link="grasping_frame"/> <origin rpy="0 0 0" xyz="0.06 0 0"/> </joint>

    可以看到,这个连杆只有一个名字,没有任何内容,说明并没有一个实质的刚体与之对应,它只是为了产生一个坐标系,并且是通过与link6产生的描述。 这个坐标系位于两个手指之间,相当于未来的抓取点,比如用该机械臂抓取一个木块,那么就可以通过判断这个坐标系原点是否到达了木块的位置,从而实施抓取动作。

    在很多的ROS建模中会遇到base_footprint这样的link,这个link并没有太多的含义,他只是去创建一个机器人映射到地面投影的一个坐标系,一般坐标系的原点都位于地面,方便后续做一些导航、建模相关工作。

    11.检查urdf模型整体结构 进入urdf文件夹下

    urdf_to_graphiz marm.urdf

    Processed: 0.015, SQL: 8