ROS使用总结1-传参
[TOC]
背景
ROS 节点需要加载 csv 文件读取数据, 文件路径名需要通过参数传到程序里面, 考虑到代码共享, 每个人的 workspace 路径可能都不一样, 传进去的参数要是 Package/Node 的相对路径, 最好是通过 launch file
传入, 省得输入.
默认的加载路径是 workspace 的路径. 最初的想法是找到 Node 的 execuaable 的路径, 发现其为 devel/lib/Package_Name
下, 只有 catkin_make
后才能放进去, 顺序不对.
经调查发现如下传参方式
参数接口
通过 Main 函数传入
在 ros::init
的时候传入到 main
函数的 argv
中.
程序1:
1 | int main(int argc, char** argv) |
通过参数服务器传入
同时参数服务器又分为全局命名空间与私有命名空间, 作用于不同的范围内. 其中注意私有命名空间使用的 NodeHandle
初始化时需要加上 "~"
参数表明私有.
程序2:
1 | int main(int argc, char** argv) |
传入方式
rosrun
命令后添加
例如程序1:
输入
1 | rosrun pkg_name node_name arg1 arg2 |
输出
1 | argv[1] arg1 |
程序2:
输入, 注意, 私有参数的 ~
用 _
代替
1 | rosrun _pn_arg:=aaa |
输出
1 | n_arg=default_arg1 |
下面介绍的 argument
也可以类似地在 rosrun
后添加.
launch file 传入
node
的属性 args
对于 main
函数的参数可以直接在 node
的属性 args
里添加. 对于程序 1, 传入 2 个参数 a1 a2
.
1 | <launch> |
也可以通过 argument
(后面介绍)和 parameter
传入.
argument
如下 my_argument
的默认参数是 b1 b2
, 2 个参数.
1 | <launch> |
如果想要修改默认参数可以在启动 launch 的时候修改, 如下:
1 | roslaunch pkg_name launch_file_name.launch my_argument:="b3 b4" |
parameter
对于程序 2, 如下设置. 全局参数使用 argument
传参, 私有参数直接赋值.
1 | <launch> |
寻找 pkg 相对路径
将 $(find pkg)
的值赋给 argument
或 parameter
, 得到 roscd pkg
的路径.
1 | <launch> |
argument
与 parameter
的区别
尽管 argument
和 parameter
的中文意思有时可互换, 但他们在 ROS 中的意义完全不同.
存在 parameter server 上, nodes 可通过 ros::param::get
函数编程得到, 用户可通过 rosparam
获取. 与之不同, argument
仅在 launch 文件内部有意义, nodes 不能直接获取它们的值.
argument
在 launch file 之间的传递
父 launch file 中:
1 | <include file="path_to_file"> |
子 launch file 中:
1 | <arg name="argument_name" value="$(arg argument_name)"/> |
参考链接
https://www.jianshu.com/p/02ee8f513295
https://blog.csdn.net/DoctorChen618/article/details/84150623