zoukankan      html  css  js  c++  java
  • 参数服务器相关的问题

    一.

    之前使用别人开源的包的时候,经常会发现在launch文件中使用诸如此类的句子:

    <node name="node_name" pkg="foo" type="bar" >
            <param name="camera_topic_private" value="/camera/image_rect">

    ,在ROS学习中也看到介绍roslaunch在大型项目中的使用技巧(http://wiki.ros.org/cn/ROS/Tutorials/Roslaunch%20tips%20for%20larger%20projects)
    说可以直接在launch文件中直接改参数,就没有必要修改程序了,当时看的我是那叫一个激动,这功能好啊,而且还看起来高大上,然而,再往下看下去,就 没有然后了,心里一万头草尼玛奔腾有木有啊!你既然说它这么牛逼,那为什么不告诉我,如何才能使用这个牛逼的功能啊!最近要用到这个功能只能自己摸索了, 搜了一些参数服务器的知识:
    http://wiki.ros.org/roscpp/Overview/Parameter%20Server
    然而也并没有介绍如何结合launch使用,于是自己就照葫芦画瓢,自己试着写了一个,然而在launch文件里写参数,程序并没有发生变化。。。
    直到,我在网上看到了这个贴子:
    http://answers.ros.org/question/43001/setting-parameters-in-a-launch-file-does-not-appear-to-be-working/
    才真正解决了我的问题,下面说如何使用,其实非常简单:下面直接给出我的程序:
    程序中我是这样写的:

       double parking_x;
       double parking_y;
       ros::param::get("~parking_x",parking_x);
       ros::param::get("~parking_y",parking_y);
       ROS_ERROR("parking_x:%.3f",parking_x);
       ROS_ERROR("parking_y:%.3f",parking_y);

    launch文件,我是这样写的:

    <launch>
    <node pkg="beginner_tutorials" name="talker" type="talker">
    <param name="parking_x" type="double" value="100.0" />
    <param name="parking_y" type="double" value="600.0" />
    </node>
    </launch>

    我想要在launch文件中更改parking_x与parking_y的值,在程序里只需定义变量parking_x, parking_y,然后再使用语句 ros::param::get(),即可。程序中的“~”的意思在我上边提到的那个贴子中有介绍,表示此参数是私有参数,也就是,在lauch文件中, 你把<param.../>写到<node.../>里面那么你的参数就是私有参数。
    注意,我的程序中ROS_ERROR()输出的并非真正 的错误,而是为了方便,让信息输出在平面上,并且这样可以不用在launch文件中写“output=screen”,这样,仿照我的这种方式,就可以在 launch文件中更改参数,而无须修改程序,参数的类型可以是string,int,double,bool等。
    需要注意的是:程序里定义的是double 类型,所以在launch文件中value=”100.0”与value=”600.0”,不能写成 value=”100”与value=”600”.

    2.在launch文件里面直接通过args参数来给main函数的argv传递参数

    <launch>
    <node pkg="turtlesim"
          type="turtlesim_node"
          name="sim"/>
    <node
            pkg="turtlesim"
            type="turtle_teleop_key"
            name="teleop"
            output="screen"/>
    <param name="scale_linear" value="2" type="double"/>
    <param name="scale_angular" value="2" type="double"/>

    <node pkg="learning_tf" type="turtle_tf_broadcaster"
            args="/turtle1" name="turtle1_tf_broadcaster"/>
    <node pkg="learning_tf" type="turtle_tf_broadcaster"
            args="/turtle2" name="turtle2_tf_broadcaster"/>
    </launch>

    在上面的args可以传递给

    文件为包learning_tf下的文件turtle_tf_broadcaster.cpp

    #include<ros/ros.h>
    #include<tf/transform_broadcaster.h>
    #include<turtlesim/Pose.h>
    std::string turtle_name;

    void poseCallback(const turtlesim::PoseConstPtr& msg)
    {
            static tf::TransformBroadcaster br;
            tf::Transform transform;
            transform.setOrigin(tf::Vector3(msg->x,msg->y,0.0));
            tf::Quaternion q;
            q.setRPY(0,0,msg->theta);
            transform.setRotation(q);
            br.sendTransform(tf::StampedTransform(transform,ros::Time::now(),"world",turtle_name));
    }

    int main(int argc,char **argv)
    {
            ros::init(argc,argv,"my_tf_broadcaster");
            if(argc!=2)
            {
                    ROS_ERROR("need turtle name as argument");
                    return -1;
            }
            turtle_name = argv[1];

            ros::NodeHandle node;
            ros::Subscriber sub=node.subscribe(turtle_name+"/pose",10,&poseCallback);
            ros::spin();
            return 0;
    }
    三.

    http://blog.163.com/redrain007@126/blog/static/652683872016630112119875/

  • 相关阅读:
    【剑指offer】二叉搜索树与双向链表
    【剑指offer】复杂链表的复制
    【剑指offer】二叉树中和为某一值的路径
    2018.12.30 Intellij IDEA设置main方法自动补全
    2018.12.29 Spring FrameWork各个版本下载
    2018.12.26 Mac下的Eclipse在编辑Spring配置文件xml时自动提示类class包名配置
    2018.12.25 Spring中JDBCTemplate模版API学习
    2018.12.24 Spring中的aop演示(也就是运用aop技术实现代理模式)
    2018.12.22 Spring学习02
    2018.12.24 Ubuntu18.0.4 主题参考
  • 原文地址:https://www.cnblogs.com/gary-guo/p/6756319.html
Copyright © 2011-2022 走看看