专栏首页书山有路勤为径2.ROS基础-ROS中的关键组件

2.ROS基础-ROS中的关键组件

Launch文件

通过XML文件实现多节点的配置和启动(可自动启动ROS_Master)

<launch>launch文件中的根元素采用<launch>标签定义 <node>启动节点

<node pkg="package-name"type="executable-name" name="node-name"/>
  • pkg : 节点所在的功能包名称
  • type : 节点的可执行文件名称
  • name: 节点运行时的名称
  • output、respawn、required、ns、args
参数设置

<param> /<rosparam>设置ROS系统运行中的参数,存储在参数服务器中。

<param name="output_frame" value="odom"/>
  • name :参数名
  • value: 参数值

加载参数文件中多个参数: <rosparam file="params.yaml" command="load" ns="param"/> <arg>launch文件内部的局部变量,仅限于launch文件使用 <arg name = "arg-name"default="arg-value"/>

  • name: 参数名
  • value:参数值 调用:
<param name= "foo" value="$(arg arg-name)"/>
<node name="node"pkg="package" type="type" args="$(arg arg-name)"/>
重映射

<remap>重映射ROS计算图资源的命名 <remap from="/turtlebot/cmd_vel" to = "/cmd_vel">

  • from :原命名
  • to :映射之后命名
嵌套

包含其他launch文件,类似C语言中的头文件包含 <include file = "$(dirname)/other.launch"/>

  • file:包含的其他launch文件路径

TF坐标变换

参考《机器人学导论》

TF功能包能干什么?

  • 五秒钟之前,机器人头部坐标系相对于全局坐标系的关系是什么样的?
  • 机器人夹取的物体相对于机器人中心坐标系的位置在哪里?
  • 机器人中心坐标系相对于全局坐标系的位置在哪里? TF坐标变换如何实现? TF变换数据以一个树形结构保存
  • 广播TF变换
  • 监听TF变换
TF坐标变换例程
sudo apt-get install ros-kinetic-turtle-tf
roslaunch turtle_tf turtle_tf_demo.launch
rosrun turtlesim turtle_teleop_key
rosrun tf view_frames //会在运行目录下生成frames.pdf文件

图中有三个坐标系(world、turtle1、turtle2) 使用如下命令查看turtle1 turtle2 关系

rosrun tf tf_echo turtle1 turtle2

通过Rviz来可视化

rosrun rviz rviz -d 'rospack find turtle_tf' /rviz/turtle_rviz.rviz
如何实现一个TF广播器
  • 定义TF广播器(TransformBroadcaster)
  • 创建坐标变换值
  • 发布坐标变换值(SendTransform)
#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <turtlesim/Pose.h>

std::string turtle_name;

void poseCallback(const turtlesim::PoseConstPtr& msg)
{
    // tf广播器
    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];

    // 订阅乌龟的pose信息
    ros::NodeHandle node;
    ros::Subscriber sub = node.subscribe(turtle_name+"/pose", 10, &poseCallback);

    ros::spin();

    return 0;
};
如何实现一个TF监听器
  • 定义监听器 (TransformListener)
  • 查找坐标变换 (waitForTransform 、lookup)
#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, "my_tf_listener");

    ros::NodeHandle node;

    // 通过服务调用,产生第二只乌龟turtle2
    ros::service::waitForService("spawn");
    ros::ServiceClient add_turtle =
    node.serviceClient<turtlesim::Spawn>("spawn");
    turtlesim::Spawn srv;
    add_turtle.call(srv);

    // 定义turtle2的速度控制发布器
    ros::Publisher turtle_vel =
    node.advertise<geometry_msgs::Twist>("turtle2/cmd_vel", 10);

    // tf监听器
    tf::TransformListener listener;

    ros::Rate rate(10.0);
    while (node.ok())
    {
        tf::StampedTransform transform;
        try
        {
            // 查找turtle2与turtle1的坐标变换
            listener.waitForTransform("/turtle2", "/turtle1", ros::Time(0), ros::Duration(3.0));
            listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), transform);
        }
        catch (tf::TransformException &ex) 
        {
            ROS_ERROR("%s",ex.what());
            ros::Duration(1.0).sleep();
            continue;
        }

        // 根据turtle1和turtle2之间的坐标变换,计算turtle2需要运动的线速度和角速度
        // 并发布速度控制指令,使turtle2向turtle1移动
        geometry_msgs::Twist vel_msg;
        vel_msg.angular.z = 4.0 * atan2(transform.getOrigin().y(),
                                        transform.getOrigin().x());
        vel_msg.linear.x = 0.5 * sqrt(pow(transform.getOrigin().x(), 2) +
                                      pow(transform.getOrigin().y(), 2));
        turtle_vel.publish(vel_msg);

        rate.sleep();
    }
    return 0;
};
 <launch>
    <!-- 海龟仿真器 -->
    <node pkg="turtlesim" type="turtlesim_node" name="sim"/>

    <!-- 键盘控制 -->
    <node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/>

    <!-- 两只海龟的tf广播 -->
    <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" />

    <!-- 监听tf广播,并且控制turtle2移动 -->
    <node pkg="learning_tf" type="turtle_tf_listener"
          name="listener" />

 </launch>

Qt工具箱

日志输出可视化工具--rqt_console 计算图可视化工具--rqt_graph 数据绘图工具-- rqt_plot 参数动态配置工具--rqt_reconfigure

Rviz可视化平台

Rviz是一款三维可视化工具,可以很好的兼容基于ROS软件矿建的机器人平台

  • 0:3D视图区
  • 1:工具栏
  • 2:显示项列表
  • 3:视角设置区
  • 4 : 时间显示区
rosrun rviz rviz

Rviz 的插件机制

Gazebo物理仿真环境

Gazebo是一款功能强大的三维物理仿真平台

  • 具备强大的物理引擎
  • 高质量的图形渲染
  • 方便的编程与图形接口
  • 开源免费

器典型应用场景

  • 测试机器人算法
  • 机器人设计
  • 现实场景下的回缩测试

如何使用Gazebo进行仿真

  1. 创建仿真环境
  2. 配置机器人模型
  3. 开始仿真

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • TF&URDF

    机器人的坐标变换一直以来是机器人学的一个难点,我们人类在进行一个简单的动作时,从思考到实施行动再到完成动作可能仅仅需要几秒钟,但是机器人来讲就需要大量的计算和坐...

    小飞侠xp
  • 二叉查找树

    二叉查找树是一种数据结构,它是具有以下性质的二叉树: 1.若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值; 2.若右子数不空,则右子树上所有...

    小飞侠xp
  • 递归函数基础

    函数代码中调用自己时称为递归,该函数被称为递归函数。递归函数是一个很高效的 开发技巧,可以极大的简化代码提高开发效率。递归函数与循环类似,循环可以完成的 事情,...

    小飞侠xp
  • Node.js中利用multiparty处理表单

    如果你的node.js中未使用框架来开发一个后台,那么如何处理表单数据可能有很多方法。经过实践我觉得利用multiparty这个类库来处理表单数据可能是一个比较...

    无道
  • 怎么渡过2018年剩下的3天?

    除此之外呢,很多公司都会举办年终总结会,进行年终征文。回顾过去,展望未来,让自己的心意沉淀在乐享,在后一年再回首时,会再是一番滋味。

    腾讯乐享
  • 1条乐问700+回答,别人家咋把乐享玩出“花”?

    大家好,我系渣渣…乐~ 又到了周四下午,这个美妙的推送时刻(文末有福利哦!) ? 下面要讲的事情是酱紫的: 今天刚来到办公室,就收到一条来自客户的留言。 乐乐...

    腾讯乐享
  • 我就想问,别人家的乐享为啥这么火?

    发起这个活动一方面是为了中秋给大家送福利,另一方面也是想听听大家究竟是如何看待乐享的~

    腾讯乐享
  • “第一次被老板打赏,竟然是因为乐享!”

    我们发现很多公司从开始使用乐享时的无人问津、到现在已变成员工讨论度最高的内部社区的过程中——

    腾讯乐享
  • 动手为王 | Oracle 数据库跨版本升级迁移实践

    作者简介 ? 李真旭 Oracle ACE 专家,拥有超过10年的 Oracle 运维管理使用经验,参与过众多移动、电信、联通、银行等大型数据库交付项目,具有...

    数据和云
  • 资源 | TensorFlow分布式计算机制解读:以数据并行为重

    选自clindatsci 作者:Neil Tenenholtz 机器之心编译 参与:Jane W、黄小天 Tensorflow 是一个为数值计算(最常见的是训...

    机器之心

扫码关注云+社区

领取腾讯云代金券