ros参数服务器调用_ROS:参数服务器
简介
ROS中实现了其官方提供的参数服务器机制。该机制允许用户能够将参数以yaml文件格式本地存储。当程序运行时(即执行launch文件)会自动加载这些配置信息。值得注意的是,在修改相关配置信息时无需重新编译即可完成操作。一个更加人性化的设计是,在程序运行期间允许动态调整配置信息,并实时观察这些变化对系统运行结果的影响。这一特性极大地方便了开发人员进行配置调试工作。
载入参数
Ros利用launch文件加载参数,在完成之后可以在命令行界面中查看rosparam的状态
通过param标签载入参数:
该方法适用于少量参数的载入,格式为:
重新运行launch文件,参数就会更新。
通过rosparam标签导入.yam文件载入参数:
该方法适用于大量载入参数,格式为:
例如:在仿真的实例中,查看fake_pi_arbotix.launch文件可以找到。
fake_pi_arbotix.yaml文件内容
port: /dev/ttyUSB0
baud: 115200
rate: 20
sync_write: True
sync_read: True
read_rate: 20
write_rate: 20
joints: {
关节编号: arm_shoulder_pan_joint 编号为1的关节编号设置如下
arm_shoulder_lift_joint: {id: 2, neutral: 512, max_speed: 100, invert: True},
arm_elbow_flex_joint: {id: 3, neutral: 512, max_speed: 100, invert: True},
arm_wrist_flex_joint: {id: 4, neutral: 512, max_speed: 100, min_angle: -90, max_angle: 90, invert: True},
gripper_joint: {id: 5, neutral: 512, max_speed: 100, min_angle: -20, max_angle: 25, invert: False},
head_pan_joint: {id: 6, neutral: 512, max_speed: 100, min_angle: -145, max_angle: 145, invert: False},
head_tilt_joint: {id: 7, neutral: 512, max_speed: 100, min_angle: -90, max_angle: 90, invert: False}
}
controllers: {
Pololu motors: 1856 cpr = 0.3888105m travel = 4773 ticks per meter (empirical: 4100)
base_controller: {type: diff_controller, base_frame_id: base_link, base_width: 0.26, ticks_meter: 4100, Kp: 12, Kd: 12, Ki: 0, Ko: 50, accel_limit: 1.0 }
}
访问参数
参数的访问有三种方式:
命令行:rosparam set / rosparam get
launch文件:param / rosparam
API: roscpp: ros::param::set / ros::param::get rospy: set_param / get_param
Roscpp获取参数
方法1:
ros::NodeHandle::getParam():
ros::NodeHandle nh;
std::string global_name, relative_name, default_param;
if (nh.getParam("/global_name", global_name))
{
...
}
// Default value version
nh.param<:string>("default_param", default_param, "default_value");
第一个参数是该操作的输入变量名(即操作前被操作的对象),第二个变量用于接收该操作的结果输出(即操作后生成的新对象)。当无法获取该操作的实际输入结果时,默认返回false状态。
函数允许指定默认值以替代实际输入来源;当无法获取输入信息时,默认将使用指定的默认值。
在这种情况下,默认情况下只能访问公有成员(即非私有成员)。要访问私有成员变量或函数,请必须显式声明一个私有NodeHandle(例如:ros::NodeHandle nh(~))。
方法2:
ros::param::get()
std::string global_name, relative_name, default_param;
if (ros::param::get("/global_name", global_name))
{
...
}
// Default value version
ros::param::param<:string>("default_param", default_param, "default_value");
同样采用第一种方式。如果需要获取私有参数,则应在参数名前添加''符号。(例如:ros::param::get("-private_name", param);)
命名空间
parameter named following conventional ROS nomenclature is adopted, which implies that the parameter can be hierarchically structured and aligns consistently with ROS topics and nodes. Such a hierarchical structure effectively prevents name conflicts among parameters and facilitates the representation of related parameters.
/camera/left/name: leftcamera
/camera/left/exposure: 1
/camera/right/name: rightcamera
/camera/right/exposure: 1.1
