ros入门-终

本文介绍了ROS中的参数使用,包括rosparam命令的详细操作,如查看、设置、删除参数,并展示了小海龟背景配置的代码实现。接着,讲解了TF坐标管理系统,通过学习_tf_broadcaster.cpp和_learning_tf_listener来实现坐标广播和监听。最后,讨论了launch文件的编写,简化了节点的启动流程,并展示了如何通过tf_echo查看坐标系关系。
摘要由CSDN通过智能技术生成


前言

本次是二刷ros入门21讲(古月),古人诚不欺我,书读百遍其意自现,一刷和二刷的理解终归是不同的(细品)。遗憾的是一刷的时候笔记仅仅记录了一半(太忙了),因此二刷的时候填掉这个坑。本篇分为以下几个板块:

  • 参数的使用以及编程方法
  • ros的坐标管理系统
  • launch文件的使用
  • 可视化工具的使用
  • 总结

1.参数的使用以及编程方法

1.1.rosparam的基本命令

输入以下命令:

rosparam -h  //查看rosparam的基本命令

在这里插入图片描述

1.2.rosparam命令的逐条解析

rosparam list
//参数显示,此时并仅仅打开roscore
/rosdistro
/roslaunch/uris/host_ls_lenovo_legion_y7000_1060__38051
/rosversion
/run_id
rosparam list 
// 此时打开turtlesim
/background_b
/background_g
/background_r
/rosdistro
/roslaunch/uris/host_ls_lenovo_legion_y7000_1060__38051
/rosversion
/run_id

此时可以看出 增加了rgb参数(打开turtlesim 后参数服务器中增加了3个参数)

 rosparam get /background_b //获取参数
255
/
//设置参数,并显示设置后的参数
rosparam set /background_b 100
ls@ls-Lenovo-Legion-Y7000-1060:~$ rosparam get /background_b 
100
// 将参数保存到当前文件
rosparam dump parame.yaml
// 从当前文件加载参数
rosparam load parame.yaml 
// 在保存文件的参数列表值
background_b: 100
background_g: 86
background_r: 69
rosdistro: 'kinetic

  '
roslaunch:
  uris: {host_ls_lenovo_legion_y7000_1060__38051: 'http://ls-Lenovo-Legion-Y7000-1060:38051/'}
rosversion: '1.12.17

  '
run_id: 067b849c-dbcb-11eb-8dfa-283a4d0b9ff7
// 删除 参数
rosparam delete /background_b 
// 显示删除后的参数列表
rosparam list 
/background_g
/background_r
/rosdistro
/roslaunch/uris/host_ls_lenovo_legion_y7000_1060__38051
/rosversion
/run_id

修改参数//background_b=100
使用下列命令刷新背景:

rosservice call /clear "{}"

背景变换如下
在这里插入图片描述

1.3.小海归背景配置代码

参数服务器详解大全

/*!
 * 小海归窗口的背景配置文件
 */
#include <ros/ros.h>
#include <std_srvs/Empty.h>
#include <string>

int main(int argc,char **argv)
{
    int r,g,b;

    ros::init(argc,argv,"learning_param");

    ros::NodeHandle n;

    // 获取背景颜色
    ros::param::get("/background_r",r);
    ros::param::get("/background_g",g);
    ros::param::get("/background_b",b);
    ROS_INFO("get background color[r=%d,g=%d,b=%d]",r,g,b);

    // 设置背景颜色
    ros::param::set("/background_r",100);
    ros::param::set("/background_g",100);
    ros::param::set("/background_b",100);
    ROS_INFO("set background color[r=100,g=100,b=100]");

    //获取背景颜色
    ros::param::get("/background_r",r);
    ros::param::get("/background_g",g);
    ros::param::get("/background_b",b);
    ROS_INFO("get background color[r=%d,g=%d,b=%d]",r,g,b);

    // 刷新背景颜色
    ros::service::waitForService("/clear");// 其中/clear是小海归发布的服务端名称,可以rosservice list 查看
    ros::param::get("/background_g",g);
    ros::param::get("/background_b",b);
    ROS_INFO("get background color[r=%d,g=%d,b=%d]",r,g,b);
    ros::ServiceClient background_client=n.serviceClient<std_srvs::Empty>("/clear");
    std_srvs::Empty msg;
    background_client.call(msg);

    sleep(1);

    return 0;
}

其中 /clear 是小海归的服务端

rosservice list 
// 显示服务端列表
/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/spawn
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
/turtlesim/set_logger_level

待阅读
https://blog.csdn.net/u014610460/article/details/79508869
待阅读
http://wiki.ros.org/roscpp_tutorials/Tutorials/Parameters

2.TF 坐标管理系统

2.1 learning_tf_broadcaster.cpp

/*!
 * tf 坐标系的广播
 */
#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <turtlesim/Pose.h>

std::string turtle_name;

void callback(const turtlesim::PoseConstPtr &msg)
{
    // 创建一个广播器
    static tf::TransformBroadcaster tf_broad;

    // 初始化tf数据
    tf::Transform transform_tmep;
    transform_tmep.setOrigin(tf::Vector3(msg->x,msg->y,0));
    tf::Quaternion q;
    q.setRPY(0,0,msg->theta);
    transform_tmep.setRotation(q);

    //ROS_ERROR("msg.x=%f",msg->x);
    tf_broad.sendTransform(tf::StampedTransform(transform_tmep,ros::Time::now(),"world",turtle_name));
}

int main(int argc,char **argv)
{
    ros::init(argc,argv,"learning_tf_broadcaster");

    ros::NodeHandle n;

    if (argc!=2)
    {
        ROS_ERROR("please input turtle name:");
        return -1;
    }
    turtle_name=argv[1];


    ros::Subscriber turtle_pos_sub=n.subscribe(turtle_name+"/pose", 10,&callback);

    ros::spin();

    return 0;
}

CmakeList.txt 配置

add_executable(learning_tf_broadcaster src/learning_tf_broadcaster.cpp)
target_link_libraries(learning_tf_broadcaster ${catkin_LIBRARIES})

2.2 learning_tf_listener

/*!
 * 小海归2监听小海1,并跟踪小海归1
 */

#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <geometry_msgs/Twist.h>
#include <turtlesim/Spawn.h>

int main(int argc,char **argv)
{
    ros::init(argc,argv,"learning_tf_listener");

    ros::NodeHandle n;

    // 产生第二个海归
    ros::service::waitForService("/spawn");//等待海归的服务端
    // 创建一个客户端
    ros::ServiceClient turtle_vel=n.serviceClient<turtlesim::Spawn>("/spawn");
    turtlesim::Spawn ser;
    turtle_vel.call(ser);

    // 创建一个发布者 用来发布小海归的速度指令
    ros::Publisher turtle_pub_vel=n.advertise<geometry_msgs::Twist>("/turtle2/cmd_vel",10);

    // 创建一个tf树监听
    tf::TransformListener listener_temp;

    ros::Rate rate_loop(10);

    while (n.ok())
    {
        tf::StampedTransform transform_temp;
        try {
            // ros::Time(0)指tf树中的最新转换对应的时间
            // ros::Duration(3.0) 时间延迟
            listener_temp.waitForTransform("turtle2","/turtle1",ros::Time(0),ros::Duration(3.0));
            listener_temp.lookupTransform("turtle2","/turtle1",ros::Time(0),transform_temp);
        }
        catch (tf::TransformException &ex)
        {
            ROS_ERROR("%s",ex.what());
            ros::Duration(1.0).sleep();
            continue;
        }
        geometry_msgs::Twist vel_msg;
        vel_msg.angular.z=4.0* atan2(transform_temp.getOrigin().y(),transform_temp.getOrigin().x());
        vel_msg.linear.x=0.5* sqrt(pow(transform_temp.getOrigin().x(),2)
                                + pow(transform_temp.getOrigin().y(),2));

        turtle_pub_vel.publish(vel_msg);
        rate_loop.sleep();
    }
    return 0;
}

CmakeList.txt 的配置

add_executable(learning_tf_listener src/learning_tf_listener.cpp)
target_link_libraries(learning_tf_listener ${catkin_LIBRARIES})

2.3 运行结果展示

实现小海龟跟随实验

//打开新终端
ctrl+alt+t
roscore
//打开另一个终端
ctrl+alt+t
//打开小海龟
rosrun turtlesim turtlesim_node 
//打开另一个终端
ctrl+alt+t
rosrun learning_tf learning_tf_broadcaster turtle1
//打开另一个终端
ctrl+alt+t
rosrun learning_tf learning_tf_listener

在这里插入图片描述

3.launch文件的编写

##3 .1 launch文件
以上执行太多节点需要打开的终端也太多(繁琐),因此多个节点常采用launch文件执行

<launch>

    <node pkg="turtlesim" name="turtle1" type="turtlesim_node">
    </node>

    <node pkg="turtlesim" name="turtle1_key" type="turtle_teleop_key">
    </node>

    <param name="turtle1_name" type="string" value="/turtle1"/>

    <node pkg="learning_tf" type="learning_tf_broadcaster" args="turtle1" name="turtle1_tf_broadcaster" >
    </node>

    <node pkg="learning_tf" type="learning_tf_broadcaster" args="turtle2" name="turtle2_tf_broadcaster" />

    <node pkg="learning_tf" type="learning_tf_listener" name="turtle1_turtle2">
    </node>
</launch>

** 执行以下命令**

roslaunch learning_tf tf.launch 

在这里插入图片描述

3.2 坐标系之间的关系

rosrun tf tf_echo turtle1 world

在这里插入图片描述

总结

ros学习代码记录
本文是学习古月ros入门21讲的学习记录!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值