iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 27
0
自我挑戰組

ROS自學筆記系列 第 27

Day 27 - 使用自定義的parameter (python/c++)

  • 分享至 

  • xImage
  •  

好的那我們昨天用ROS的parameter server建立了一個叫做/print_frq的變數,今天就來看看要怎麼在程式中使用吧! 一樣會分成pythonc++兩個版本:

  • in python:
rospy.get_param('/param_name', 'default_value')

python裡面很簡單的就是call rospy內的api get_param,它可以有兩個參數,第一個參數就是我們設定的parameter的名稱啦! 第二個參數是用在如果他在parameter server裡面找不到我們設定的parameter時,會給的預設值。
所以修改我們之前的hello.py,就會長這樣:

import rospy                             # import rospy 模組

rospy.init_node('hello_python_node')     # 初始化 hello_python_node

frq = rospy.get_param("/print_frq")      # 讀取parameter server 內的參數/print_frq

while not rospy.is_shutdown():           # 在 rospy 還沒結束前,執行下列指令:
    rospy.loginfo('Hello World')         # 印出 Hello World
    rospy.sleep(frq)                     # 間隔 frq 秒

這樣就完成啦! 大家可以自己修改看看/print_frq那個參數,看看是否真的會因此而改變印出Hello World的頻率喔!

  • in c++:
    c++的部分比較麻煩一點,因為get parameter的實作是在handler內,所以要呼叫的是handler裡面的api:
ros::NodeHandle nh;
int param;
nh.getParam("/param_name", param);

需要注意的是,getParam()的用法是將第一個參數撈到的值放入第二個參數內,所以要先定義好我們要放的變數型別,之後才能呼叫這個函式。因此,hello.cpp的程式碼會長這樣:

#include <ros/ros.h>                             // 引用 ros.h 檔

int main(int argc, char** argv){
    ros::init(argc, argv, "hello_cpp_node");     // 初始化hello_cpp_node
    ros::NodeHandle handler;                     // node 的 handler
    
    double frq;
    handler.getParam("/print_frq", frq);
    
    while (ros::ok()){                           // 在 ros 順利執行時
        ROS_INFO("Hello World!");                // 印出 Hello World
        ros::Duration(frq).sleep();              // 間隔 frq 秒
    }
}

修改完以後要重新執行catkin_make進行編譯的動作,才能執行hello.exe檔喔!這之後修改parameter server內的參數,就不用再重新編譯一次檔案啦! 這對c++的檔案來說真的很方便~

當然在pythonc++的程式內不只可以使用get parameter,一樣可以使用set/delete等指令,這部分就比較簡單,我就不多作介紹啦!

參考資料

rospy tutorial - using parameters
rospy overview - parameters
roscpp overview - parameters


上一篇
Day 26 - ROS Parameters 與相關指令
下一篇
Day 28 - ROS Launch file
系列文
ROS自學筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言