Advertisement

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

全部评论 (0)

还没有任何评论哟~