松靈機器人scout mini小車 自主導航(2)——模擬指南

遥感摆烂人發表於2024-07-09

松靈機器人Scout mini小車模擬指南

之前介紹瞭如何透過CAN TO USB串列埠實現用鍵盤控制小車移動。但是一直用小車測試缺乏安全性。而松靈官方貼心的為我們準備了gazebo模擬環境,提供了完整的模擬支援庫,本文將介紹如何上手使用模擬。

官方倉庫地址:https://github.com/agilexrobotics/ugv_gazebo_sim

1.模擬環境準備

整個功能包介紹

├── scout_control :該資料夾是小車模擬控制器功能包
├── scout_description :該資料夾是模型檔案功能包
└── scout_gazebo_sim :該資料夾是gazebo模擬功能包

安裝相關功能包依賴

所採用的開發環境是Ubuntu18.04+ROS Melodic

下載所需要的功能包

sudo apt-get install ros-melodic-ros-control
sudo apt-get install ros-melodic-ros-controllers
sudo apt-get install ros-melodic-gazebo-ros
sudo apt-get install ros-melodic-gazebo-ros-control
sudo apt-get install ros-melodic-joint-state-publisher-gui 
sudo apt-get install ros-melodic-teleop-twist-keyboard 

新建工作空間並初始化

開啟一個新終端,建立一個名為scout_ws的工作區,並初始化:

mkdir -p scout_ws/src
cd scout_ws/src
catkin_init_workspace

下載對應的模擬模型功能包。本文采用的是scout mini。需要將https://github.com/agilexrobotics/ugv_gazebo_sim/tree/master/scout下的三個檔案複製到src目錄中

git clone https://github.com/agilexrobotics/ugv_gazebo_sim/tree/master/scout

正常編譯

cd ..
rosdep install --from-paths src --ignore-src -r -y
caktin_make

2.模擬小車驗證

進入scout_ws工作空間,執行系列車模擬模型,display_xxxx.launch 為不同車型在rviz模擬展示。scout_xxxx.launch為不同車型在gazebo模擬環境中展示。

source devel/setup.bash
roslaunch scout_description display_scout_mini.launch 

img

source devel/setup.bash
roslaunch scout_gazebo_sim scout_empty_world.launch

img
如果想使用playgen地圖,需要提取補全gazebo裡面的models檔案,不然會一直黑屏

3.新增自定義感測器

官方給定的只有小車底座,沒有現成的感測器。在實際使用過程中,可以自定義一系列感測器。
scout系列車型的urdf描述檔案位於scout_description/urdf中,在使用過程中,並未直接使用urdf進行描述,而是從xacro(xml xacro)描述檔案中生成urdf資訊。便於我們像程式設計一樣複用urdf節點以及相關拆分元件等功能。

如果不瞭解xacro 可以參考xacro語法說明: http://wiki.ros.org/xarc

自定義簡易攝像頭

首先在scout_description/urdf中新增一個名為universal_sensor_adder.xacro的檔案,其中儲存內容如下:

<?xml version="1.0"?>
<!-- 
Author: AnthonySuen
Date: 2020-4-8
-->
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="universal_sensor_adder">
    <!-- 用於生成一個新的感測器節點, 
    x_offset y_offset z_offset r p y對應於感測器和 base_link 的相對位置
    sensor_config 為感測器的配置資訊
    sensor_plugin_config 為 gazebo 相關外掛的配置內容 -->
    <xacro:macro name="add_sensor" params="sensor_name type x_offset y_offset z_offset r p y **sensor_config **sensor_plugin_config">
        <link name="sensor_${sensor_name}">
            <!-- 配置感測器視覺資訊 -->
            <visual>
                <geometry>
                    <box size="0.03 0.05 0.05"/>
                </geometry>
                <material name="red">
                    <color rgba="1.0 0.0 0.0 1.0"/>
                </material>
            </visual>
            <!-- 配置碰撞體積, 為gazebo模擬使用 -->
            <collision>
                <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
                <geometry>
                    <box size="0.03 0.05 0.05"/>
                </geometry>
            </collision>
            <!-- 配置慣性矩陣, 用於 gazebo 模擬,這裡我假設感測器很輕很小 -->
            <inertial>
                <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
                <mass value="1e-5"/>
                <inertia ixx="1e-6" ixy="1e-6" ixz="1e-6" iyy="1e-6" iyz="1e-6" izz="1e-6"/>
            </inertial>
        </link>
        <!-- 配置關節資訊, 這裡我預設感測器是固定在車上的 -->
        <joint name="sensor_${sensor_name}_joint" type="fixed">
            <parent link="base_link"/>
            <child link="sensor_${sensor_name}"/>
            <origin xyz="${x_offset} ${y_offset} ${z_offset}" rpy="${r} ${p} ${y}"/>
        </joint>
        <!-- gazebo 配置模擬配置部分 -->
        <gazebo reference="sensor_${sensor_name}">            <!-- 此部分要與 感測器 link 名稱保持一致 -->
            <sensor name="${sensor_name}" type="${type}">
                <!-- 這裡會插入感測器自身配置資訊和相關外掛的配置內容 -->
                <xacro:insert_block name="sensor_config"/>
                <xacro:insert_block name="sensor_plugin_config"/>
            </sensor>
        </gazebo>
    </xacro:macro>
</robot>

在使用過程中刪除中文註釋,xacro無法解析非ascii 字元!

編輯empty.urdf檔案,修改內容如下:

<?xml version="1.0"?>
<!-- 
Author: AnthonySuen
Date: 2020-4-8
-->
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="sensors">

  <!-- 載入我們之前編寫的檔案,之後可以使用其中相關內容 -->
  <xacro:include filename="$(find scout_description)/urdf/universal_sensor_adder.xacro" />
  <!-- 使用我們編寫的函式,填入相關引數 -->
  <xacro:add_sensor sensor_name="camera" type="camera" x_offset="0.1" y_offset="0.0" z_offset="0.085" r="0.0" p="0.0" y="0.0">
  <!-- 這部分會替換 <xacro:insert_block name="sensor_config"/> 中的內容 -->
    <sensor_config>
      <update_rate>30</update_rate>
      <camera name="general_camera">
        <image width="640" height="480" hfov="1.5708" format="RGB8" near="0.01" far="50.0"/>
      </camera>
    </sensor_config>
    <!-- 這部分會替換 <xacro:insert_block name="sensor_plugin_config"/> 中的內容 -->
    <sensor_plugin_config>
      <plugin name="general_camera_controller" filename="libgazebo_ros_camera.so">
        <alwaysOn>true</alwaysOn>
        <updateRate>36.0</updateRate>
        <cameraName>sensor_camera</cameraName>
        <imageTopicName>image_raw</imageTopicName>
        <cameraInfoTopicName>camera_info</cameraInfoTopicName>
        <frameName>sensor_camera</frameName> <!-- 需要與 感測器 link 名稱保持一致 -->
        <hackBaseline>0.1</hackBaseline>
        <distortionK1>0.0</distortionK1>
        <distortionK2>0.0</distortionK2>
        <distortionK3>0.0</distortionK3>
        <distortionT1>0.0</distortionT1>
        <distortionT2>0.0</distortionT2>
      </plugin>
    </sensor_plugin_config>
  </xacro:add_sensor>
</robot>

在使用過程中刪除中文註釋,xacro無法解析非ascii 字元!

之後再執行RIVZ檢視修改後的模型

roslaunch scout_description display_mini_models.launch

img

相關文章