ROS下的引數傳遞

2021-10-07 22:10:11 字數 3801 閱讀 3419

在系統工程中,調整引數時在原始檔中修改非常的耗時和麻煩,故尋找一種好的引數傳遞方式勢在必行,本文基於ros平台介紹兩種簡單的引數傳遞方式,其邏輯關係如下所示。

其本質是通過ros的param機制,將引數資訊發布出來, 在節點中獲取rosparam的資訊,值得注意的是,節點的控制代碼必須是私有控制代碼,即ros::nodehandle nh("~"),其中的"~"相當於this或者self,cmakelists.txt中無需鏈結額外的庫。

在roslaunch中新增引數,在節點中通過param將引數的值傳遞出去,需要注意的地方是節點的名稱的對應,arg的引數值為預設default,即可以覆蓋的。

launc**件內容為:

"pb1_decel"

default

="-1.0"

/>

"pb2_decel"

default

="-2.0"

/>

"fb_decel"

default

="-3.0"

/>

"target_speed"

default

="10"

/>

"aeb"

type

="aeb_node" name=

"aeb_node" output=

"screen"

>

"pb1_decel" value=

"$(arg pb1_decel)"

/>

"pb2_decel" value=

"$(arg pb2_decel)"

/>

"fb_decel" value=

"$(arg fb_decel)"

/>

"target_speed" value=

"$(arg target_speed)"

/>

<

/node>

<

/launch>

獲取param的**為:

ros::

init

(argc,ar**,

"aeb_node");

ros::nodehandle nh

("~");

nh.getparam

("pb1_decel"

, pb1_decel)

; nh.

getparam

("pb2_decel"

, pb2_decel)

; nh.

getparam

("fb_decel"

, fb_decel)

; nh.

getparam

("target_speed"

, target_speed)

;while

(ros::ok(

))

通過roslaunch載入yaml配置檔案與寫arg引數是一脈相承的,都是通過rosparam將值傳遞進去,故獲取引數的**都是一樣的,唯一不同的地方在於在roslaunch中載入yaml檔案,yaml檔案中放置的是不同的引數。

yaml中的引數:

pb1_decel

:-1.0

pb2_decel

:-9.0

fb_decel

:-5.0

target_speed

:10

roslaunch為:

"aeb"

type

="aeb_node" name=

"aeb_node" output=

"screen"

>

"load" file=

"$(find aeb)/config/config.yaml"

/>

<

/node>

<

/launch>

兩種方法得出的結果為:

具體示例可以參考例子

原始碼安裝步驟為:

解壓tar -zxvf libconfig-1.7.2.tar.gz配置cd libconfig-1.7.2 && ./configure編譯make -j8安裝sudo make install複製庫到/usr/libsudo cp ./lib/libconfig* /usr/lib檢視libconfig安裝資訊sudo ldconfig -v

name =

"test"

;test=);

test2 =();};

#include

#include

#include

#include

#include

using

namespace std;

using

namespace libconfig;

double pb1_decel,pb2_decel,fb_decel;

int young,rose,jack;

intmain

(int argc,

char

**ar**)

catch

(const fileioexception &fioex)

const setting& root = cfg.

getroot()

;try

cout <<

"test parameters:"

<< endl;

cout << pb1_decel <<

" "<< pb2_decel <<

" "<< fb_decel <<

" "<< endl;

}catch

(const settingnotfoundexception &nfex)

try cout <<

"person parameters:"

<< endl;

cout << young <<

" "<< rose <<

" "<< jack <<

" "<< endl;

}catch

(const settingnotfoundexception &nfex)

return0;

}

#測試libconfig

總的來說,通過ros平台可以實現多種方式的引數讀取,通過rosparam的方式過去引數方便快捷,通過libconfig的方式更加的穩定,且可移植性高。

python下函式引數的傳遞 和

1.f arg1,arg2,這 是最常見的定義方式,乙個函式可以定義任意個引數,每個引數間用逗號分割,用這種方式定義的函式在呼叫的的時候也必須在函式名後的小括號裡提供個數相等的 值 實際引數 而且順序必須相同,也就是說在這種呼叫方式中,形參和實參的個數必須一致,而且必須一一對應,也就是說第乙個形參對...

ROS 服務 訊息傳遞

定義服務的訊息型別與自定義話題的訊息型別類似 1 首先在軟體包目錄下 新建乙個 srv資料夾,並且新建乙個訊息型別檔案 mkdir roswork space src hello ros srv cd roswork space src hello ros srv touch my srv.srv ...

python下函式引數的傳遞 引數帶星號的說明

函式引數的使用又有倆個方面值得注意 1.函式引數是如何定義的 2.在呼叫函式的過程中引數是如何被解析 先看第乙個問題,在python中函式引數的定義主要有四種方式 1.f arg1,arg2,這 是最常見的定義方式,乙個函式可以定義www.cppcns.com任意個引數,每個引數間用逗號分割,用這種...