【探索之路】機器人篇(3)-給mwRobot建立模型


  在創建一個mwRobot_description程序包那一節中,我們添加了依賴roscpp  rospy std_msgs 和 urdf , 現在我們再添加一個xacro依賴。

  如何添加依賴?

  打開程序包中的package.xml文件,添加以下內容:

    <build_depend>xacro</build_depend>

    <build_export_depend>xacro</build_export_depend>

    <exec_depend>xacro</exec_depend>

  具體添加到何處請參考已經添加的roscpp依賴。
  在程序包中新建以下文件夾:
    urdf  :存放機器人模型的URDF或xacro文件
    meshes :放置URDF中引用的模型渲染文件
    launch :保存相關啟動文件
    config  :保存rviz的配置文件
    mkdir urdf meshes launch config
  在launch文件夾中添加 display_mwRobot_base_urdf.launch 文件
  display_mwRobot_base_urdf.launch 文件內容如下: 
<!-- 利用urdf建立模型 -->
<launch>
    <param name="robot_description" textfile="$(find mwRobot_description)/urdf/mwRobot_base.urdf" />

    <!-- 顯示關節控制插件,可以使關節回到中心位置也能設置關節為隨機角度 -->
    <param name="use_gui" value="true" />

    <!-- 運行joint_state_publisher節點,發布機器人的關節狀態 -->
    <node name="joint_state_publisher_mwRobot" pkg="joint_state_publisher" type="joint_state_publisher" />

    <!-- 運行robot_state_publisher節點,將機器人各個links、joints之間的關系通過tf發布 -->
    <node name="mwRobot_state_publisher_mwRobot" pkg="robot_state_publisher" type="state_publisher" />

    <!-- 運行rviz可視化界面 -->
    <node name="mwRobot_rviz" pkg="rviz" type="rviz" args="-d $(find mwRobot_description)/config/mwRobot_urdf.rviz" required="true"/>

</launch>

  這個launch文件的功能就是加載urdf模型文件,然后運行 joint_state_publisher robot_state_publisher 這兩個節點,它們是用來發布關節的狀態信息和機器人各個links與joints之間的關系。所以這兩個是必須要有的。最后一個就所運行rviz可視化工具來看我們機器人的模型。

  由上述文件可得,我們目前還缺少 urdf/mwRobot_base.urdfconfig/mwRobot_urdf.rviz文件。

創建urdf/mwRobot_base.urdf文件

  在urdf文件夾中創建一個mwRobot_base.urdf文件。並輸入以下內容:(在此文件中不能有中文注釋,否則報錯)

<?xml version="1.0" ?>
<robot name="mwRobot">

    <!--  No Chinese annotations exist.  -->

    <!-- Robot main body -->
    <link name="base_link">
        <visual>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <geometry>
                <cylinder length="0.16" radius="0.2"/>
            </geometry>
            <material name="yellow">
                <color rgba="1 0.4 0 1" />
            </material>

        </visual>
    </link>

    <!-- The connection between the left wheel and the main body -->
    <joint name ="left_wheel_joint" type="continuous">
        <origin xyz="0 0.19 -0.05" rpy="0 0 0" />
        <parent link="base_link"/>
        <child link="left_wheel_link"/>
        <axis xyz="0 1 0"/> 
    </joint>

    <!-- The definition of the left wheel -->
    <link name="left_wheel_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder length="0.06" radius="0.08"/>
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9" />
            </material>
        </visual>
    </link>

    <!-- The connection between the right wheel and the main body -->
    <joint name ="right_wheel_joint" type="continuous">
        <origin xyz="0 -0.19 -0.05" rpy="0 0 0" />
        <parent link="base_link"/>
        <child link="right_wheel_link"/>
        <axis xyz="0 1 0"/> 
    </joint>

    <!-- The definition of the right wheel -->
    <link name="right_wheel_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder length="0.06" radius="0.08"/>
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9" />
            </material>
        </visual>
    </link>

    <!--  Joint of front universal wheel and main body -->
    <joint name ="front_caster_joint" type="continuous">
        <origin xyz="0.18 0 -0.095" rpy="0 0 0" />
        <parent link="base_link"/>
        <child link="front_caster_link"/>
        <axis xyz="0 1 0"/> 
    </joint>

    <!-- Definition of front universal wheel -->
    <link name="front_caster_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <sphere radius="0.015"/>
            </geometry>
            <material name="black">
                <color rgba="0 0 0 0.9" />
            </material>
        </visual>
    </link>

    <!--  Joint of back universal wheel and main body -->
    <joint name ="back_caster_joint" type="continuous">
        <origin xyz="-0.18 0 -0.095" rpy="0 0 0" />
        <parent link="base_link"/>
        <child link="back_caster_link"/>
        <axis xyz="0 1 0"/> 
    </joint>

    <!-- Definition of back universal wheel -->
    <link name="back_caster_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <sphere radius="0.015"/>
            </geometry>
            <material name="black">
                <color rgba="0 0 0 0.9" />
            </material>
        </visual>
    </link>

</robot>

 

  此文件中定義了機器人的主體、兩個主動輪、兩個從動論輪以及它們與主體的關節(連接)。

創建config/mwRobot_urdf.rviz 文件

  此文件為rviz的配置文件,可以在rviz軟件中隨意修改,要求並不苛刻。所有參數的修改都可以通過RVIZ來完成。

  首先,啟動rviz。啟動rviz之前需要啟動roscore。所以打開兩個控制終端,先在一個中啟動roscore,然后在另一個啟動rosrun rviz rviz。

    roscore

    rosrun rviz rviz

  執行之后會打開一個軟件,然后在左上角的files中點擊Save Config As,然后保存到 config/mwRobot_urdf.rviz 即可

  

  圖:rviz軟件啟動界面

  

查看我們創建的模型

  我們把打開的軟件關閉,關閉roscore。然后執行roslaunch 包名  launch文件名。

    roslaunch mwRobot_description display_mwRobot_base_urdf.launch
  然后程序會自動創建roscore(如果已經存在則不創建),並打開rviz。

  但是打開的RVIZ中並沒有任何物體,這是因為我們還沒有添加顯示模型這個組件。

  打開的RVIZ和創建RVIZ配置文件時的是一模一樣。

  這里我們先在左邊Displays一欄的Global Options中,講Fixed Frame修改為 base_link。

  然后添加顯示模型組件,在程序左下角有 Add Duplicate Remove Rename幾個按鈕,點擊Add ,找到RobotModel選中並點擊確定。這個時候就可以看到我們創建的模型了。

  

  再點擊Add 選擇TF並添加。就可以看到模型中有5個TF坐標顯示。我們可以在另一個窗口Joint State Publisher 中來控制輪子的角度。

  

  至此,我們已經可以看到我們的模型了。我們可以將RVIZ此時配置保存起來,那么在下次打開的時候就和我們現在看到的一樣,不用在手動去添加tf、robotmodel了。在rviz中按Ctrl+S即可完成保存。

 

改進URDF模型,使用xacro模型文件

  在urdf文件中,我們發現有大量的代碼重復,且參數修改麻煩,不便於二次開發,沒有參數計算等功能。那么我們換成以一種形式 xacro。

  在使用xacro模型文件中,我們可以使用xacro模型解析器,也可以生成udrf文件來使用。

  我們先創建一個xacro文件 mwRobot_Mainpart.xacro文件。此文件將會包含機器人主體部分,不包含傳感器等。

  以下是mwRobot_Mainpart.xacro的內容:

<?xml version="1.0" ?>
<robot name="mwRobot"  xmlns:xacro="http://www.ros.org/wiki/xacro">

    <!--  No Chinese annotations exist.  -->

    <!-- PROPERTY LIST -->
    <xacro:property name="M_PI" value="3.1415926"/>
    <xacro:property name="base_radius" value="0.20"/>
    <xacro:property name="base_length" value="0.16"/>

    <xacro:property name="wheel_radius" value="0.06"/>
    <xacro:property name="wheel_length" value="0.025"/>
    <xacro:property name="wheel_joint_y" value="0.19"/>
    <xacro:property name="wheel_joint_z" value="0.05"/>

    <xacro:property name="caster_radius" value="0.015"/> <!-- wheel_radius - ( base_length/2 - wheel_joint_z) -->
    <xacro:property name="caster_joint_x" value="0.18"/>

    <!-- Defining the colors used in this robot -->
    <material name="yellow">
        <color rgba="1 0.4 0 1"/>
    </material>
    <material name="black">
        <color rgba="0 0 0 0.95"/>
    </material>
    <material name="gray">
        <color rgba="0.75 0.75 0.75 1"/>
    </material>

    <xacro:macro name="wheel" params="prefix reflect">
        <!-- The connection between the wheel and the main body -->
        <joint name ="${prefix}_wheel_joint" type="continuous">
            <origin xyz="0 ${reflect*wheel_joint_y} ${-wheel_joint_z}" rpy="0 0 0" />
            <parent link="base_link"/>
            <child link="${prefix}_wheel_link"/>
            <axis xyz="0 1 0"/> 
        </joint>

        <!-- The definition of the wheel -->
        <link name="${prefix}_wheel_link">
            <visual>
                <origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />
                <geometry>
                    <cylinder length="${wheel_radius}" radius="${wheel_length}"/>
                </geometry>
                <material name="gray"/>
            </visual>
        </link>    
    </xacro:macro>

    <xacro:macro name="caster" params="prefix reflect">
        <!--  Joint of universal wheel and main body -->
        <joint name ="${prefix}_caster_joint" type="continuous">
            <origin xyz="${reflect*caster_joint_x} 0 ${-(base_length/2+caster_radius)}" rpy="0 0 0" />
            <parent link="base_link"/>
            <child link="${prefix}_caster_link"/>
            <axis xyz="0 1 0"/> 
        </joint>

        <!-- Definition of universal wheel -->
        <link name="${prefix}_caster_link">
            <visual>
                <origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />
                <geometry>
                    <sphere radius="${caster_radius}"/>
                </geometry>
                <material name="black"/>
            </visual>
        </link>
    </xacro:macro>

    <!-- Robot main body -->
    <xacro:macro name="mwRobot_MainPart">
        
        <!--  The joints between robots and his shadow  -->
        <joint name="base_footprint_joint" type="fixed">
            <origin xyz="0 0 ${base_length/2 + caster_radius*2}" rpy="0 0 0" />        
            <parent link="base_footprint"/>
            <child link="base_link" />
        </joint>

        <!--  Projection of robot body on the ground  -->
        <link name="base_footprint">
            <visual>
                <origin xyz="0 0 0" rpy="0 0 0" />
                <geometry>
                    <box size="0.001 0.001 0.001" />
                </geometry>
            </visual>
        </link>

        <link name="base_link">
            <visual>
                <origin xyz="0 0 0" rpy="0 0 0" />
                <geometry>
                    <cylinder length="${base_length}" radius="${base_radius}"/>
                </geometry>
                <material name="yellow"/>
            </visual>
        </link>

        <wheel prefix="left" reflect="-1"/>
        <wheel prefix="right" reflect="1"/>

        <caster prefix="front" reflect="-1"/>
        <caster prefix="back" reflect="1"/>

    </xacro:macro>

</robot>

   上面文件中,定義了機器人的地盤結構,但是我們的機器人也有可能添加雙目相機、激光雷達等傳感器,這些傳感器大多分開寫成一個xacro文件,所以我們還需要一個文件把一個機器人的各個模塊組合起來。這里我新建一個 mwRobot_CompleteModel.xacro文件來處理這個事兒。

  mwRobot_CompleteModel.xacro文件內容如下: 

<?xml version="1.0"?>
<robot name="wmRobot" xmlns:xacro="http://www.ros.org/wiki/xacro">

    <xacro:include filename="$(find mwRobot_description)/urdf/mwRobot_Mainpart.xacro" />

    <mwRobot_MainPart/>

</robot>

  下面,我們就要修改launch文件來啟動加載我們的模型文件了。這里我用的是xacro模型解析器。

  復制原來的launch文件,並重命名為 display_mwRobot_CompleteModel.launch ,然后修改其中的代碼:

<!-- 利用urdf建立模型 -->
<launch>
    <arg name="model" default="$(find xacro)/xacro --inorder '$(find mwRobot_description)/urdf/mwRobot_CompleteModel.xacro'"/>
    <param name="robot_description" command="$(arg model)" />

    <!-- 顯示關節控制插件,可以使關節回到中心位置也能設置關節為隨機角度 -->
    <param name="use_gui" value="true" />

    <!-- 運行joint_state_publisher節點,發布機器人的關節狀態 -->
    <node name="joint_state_publisher_mwRobot" pkg="joint_state_publisher" type="joint_state_publisher" />

    <!-- 運行robot_state_publisher節點,將機器人各個links、joints之間的關系通過tf發布 -->
    <node name="mwRobot_state_publisher_mwRobot" pkg="robot_state_publisher" type="state_publisher" />

    <!-- 運行rviz可視化界面 -->
    <node name="mwRobot_rviz" pkg="rviz" type="rviz" args="-d $(find mwRobot_description)/config/mwRobot_urdf.rviz" required="true"/>

</launch>

  保存,然后啟動程序。

    roslaunch mwRobot_description display_mwRobot_CompleteModel.launch
  rviz啟動后應該就可以看到模型了,和我們之前用urdf創建的是一樣的。(有些誤差,因為修改了兩個輪子的參數)

  如果不能看到模型先看看左側的RVIZ設置是不是正確的。

  下面是我打開的界面:

  

  這樣,我們的一個機器人模型就創建好了,大家可以自行修改參數來設計一個自己喜歡的機器人。

   本節工程已經上傳,代號為V3.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM