2020年11月4日 星期三

[ROS] roslaunch: <test> 標籤的用法

<test> 標籤在語法上和 <node> 標籤很相似,他們都是用來指定要運行的 ROS 節點,雖然 <test> 標籤指定的是要運行的測試節點。更多關於測試節點的資訊,請參考 rostest 文件。

 

 

標籤說明

 

  • <test>

 

<node> 標籤的屬性大部分在 <test> 標籤都能使用,除了下列幾個:

 

  • 沒有 respawn 屬性(因為測試節點必須要能結束,所以不做重啟節點的動作)

 

  • 沒有 output 屬性(因為測試時,會使用自己的輸出記錄機制)

 

  • 忽略 machine 屬性

 

另外,<test> 標籤新增幾個屬性,如下:

 

[ 必備屬性 | Required ]

 

pkg="mypackage" : 指定節點所在的套件名稱。

 

test-name="test_name" : 測試名稱,用於記錄在測試結果中。

 

type="nodetype" : 節點型態,必須設定為用來啟動節點的可執行檔名稱。

 

[ 選用屬性 | Optional ]

 

name="nodename" : 節點名稱。注意:此名稱中不能包含命名空間,可以使用 ns 屬性來指定命名空間。如果沒有設定此屬性,則以 test-name 屬性值為節點名稱。

 

args="arg1 arg2 arg3" : 傳遞參數給節點。

 

clear_params="true|false" : 在啟動之前,刪除先前設置在此節點私有命名空間中的所有參數,也就是以此節點名稱為命名空間下的所有參數。預設值為 false

 

cwd="ROS_HOME|node" : 設定節點的工作目錄 (working directory)。若為 'node',則設定節點的可執行檔目錄為節點的工作目錄。預設為 ROS_HOME 環境變數所設定的目錄。

 

launch-prefix="prefix arguments" : 設定指令和參數,用以添加到節點的啟動參數中。這是一個強大的功能,讓你可以使用 gdb, valgrind, xterm, nice 或其他方便的工具。(See Roslaunch Nodes in Valgrind or GDB for examples.)

 

ns="foo" : 在此命名空間下啟動節點。

 

retry="0" : 測試失敗時的重測次數,若反覆重測超過此次數,將判定為測試失敗。預設值為 0

 

time-limit="60.0" : 測試的時間限制,若測試時超過此時間限制,將判定為測試失敗。每次 retry 時重新計算時間。預設為 60 秒。

 

<test> 標籤中,還可以內嵌下列標籤:

 

<env> : 設置一個環境變數供此節點使用,此環境變數僅在此節點內有作用。

 

<remap> : 為此節點設置一個重映射參數。

 

<rosparam> : 在節點的私有命名空間中,透過 rosparam 指令來設置 Parameter 參數。

 

<param> : 在節點的私有命名空間中,設置一個 Parameter 參數。

 

注意事項:必須以 rostest 指令來執行,<test> 標籤才會有作用。

 

 

實例說明

 

此範例在 mypackage 套件裡面的 launch 目錄,新增一個簡單的 launch 文件來做測試。另外,在 script 目錄則是新增一個簡短的 Python 程式,並在其中撰寫一個簡單的測試案例,裡面包含兩個測試項目。此 launch 文件必須以 rostest 指令來執行。

 

-- test.launch

<launch>

  <test test-name="mytest" pkg="mypackage" type="mytest.py" time-limit="10.0" />

</launch>

 

-- mytest.py

#!/usr/bin/env python

import rospy, unittest, rostest, time

 

class MyTest(unittest.TestCase):

 

    def test_a(self):

        self.assertTrue(True)

 

    def test_b(self):

        self.assertTrue(True)

 

if __name__ == '__main__':

    time.sleep(3)

    rospy.init_node('test_tag')

    rostest.rosrun('mypackage', 'mytest', MyTest)

 

執行 rostest mypackage test.launch 之後,螢幕會顯示下列測試結果。總共進行兩項測試:test_a test_b,也就是定義在 MyTest class 中的兩個 method,並且兩項測試皆顯示通過。

 

$ rostest mypackage test.launch

... logging to /home/robot/.ros/log/rostest-ros-master-10396.log

[ROSUNIT] Outputting test results to /home/robot/.ros/test_results/mypackage/rostest-launch_test.xml

[Testcase: testmytest] ... ok

 

[ROSTEST]-----------------------------------------------------------------------

 

[mypackage.rosunit-mytest/test_a][passed]

[mypackage.rosunit-mytest/test_b][passed]

 

SUMMARY

 * RESULT: SUCCESS

 * TESTS: 2

 * ERRORS: 0

 * FAILURES: 0

 

rostest log file is in /home/robot/.ros/log/rostest-ros-master-10396.log

 

 

參考資料

 

  • roslaunch: <test> tag

http://wiki.ros.org/roslaunch/XML/test

 

  • rostest tool使用

https://blog.csdn.net/x_r_su/article/details/53184871

https://www.itread01.com/content/1548768434.html

 

沒有留言:

張貼留言

和我聯絡

名稱

以電子郵件傳送 *

訊息 *