rviz更改机器人位置,不考虑gazebo环境。

2023-05-16

文章目录

  • 问题描述
  • 解决方案

问题描述

在RVIZ中想要去更改机器人模型位置,但不想考虑gazebo的各种因素,只想通过别人给的数据流去实时更改机器人在rviz中的位置。




解决方案

首先,先将原理弄清楚。


在RVIZ中,Fixed Frame是主坐标系,要想展现出机器人随动的状态,需要设置好主坐标系(自己设置),然后再让咱们的机器人tf坐标系跟这个主坐标系有关联,其中非常经典的一个用法是在launch文件中,加入如下代码:

 <node name="tf_base" pkg="tf" type="static_transform_publisher"  args="0.0 0.0 0.0 0.0 0.0 0.0 map robot_base_link 100" />

但是,这种用法会一直向RVIZ发一个tf广播(是一直),这样的话无论你怎么改,最终它又会重新的让你的机器人tf坐标系回到上面设置的(0,0,0,0,0,0)状态,这可不行。

那么,要让机器人在rviz中运动,实际要做的就是让机器人的tf坐标系运动,要让tf坐标系运动,就要涉及tf坐标系的广播和监听问题,当然,要让tf运动,只需要广播就行。

因为现在tf已经被淘汰了,主要用tf2完成。
示例代码:读取传入的odometry消息,并在rviz中进行实时更改
代码如下:

#include <ros/ros.h>
#include <nav_msgs/Odometry.h>
#include <geometry_msgs/TransformStamped.h>
#include <tf2_ros/static_transform_broadcaster.h>
#include <tf2/LinearMath/Quaternion.h>

void rviz_Callback(const nav_msgs::Odometry::ConstPtr& odo)
{
    static tf2_ros::StaticTransformBroadcaster static_broadcaster;
    geometry_msgs::TransformStamped static_transformStamped;
    static_transformStamped.header.stamp = ros::Time::now();
    static_transformStamped.header.frame_id = "map";
    static_transformStamped.child_frame_id = "robot_base_link";
    static_transformStamped.transform.translation.x=odo->pose.pose.position.x;
    static_transformStamped.transform.translation.y=odo->pose.pose.position.y;
    static_transformStamped.transform.translation.z=odo->pose.pose.position.z;
    static_transformStamped.transform.rotation.w = odo->pose.pose.orientation.w;
    static_transformStamped.transform.rotation.x = odo->pose.pose.orientation.x;
    static_transformStamped.transform.rotation.y = odo->pose.pose.orientation.y;
    static_transformStamped.transform.rotation.z = odo->pose.pose.orientation.z;
    static_broadcaster.sendTransform(static_transformStamped);

}

int main(int argc, char **argv) {

    ros::init(argc, argv, "pub_model_state");
    ros::NodeHandle nh;
    ros::Subscriber uwbSub = nh.subscribe<nav_msgs::Odometry>("topicname", 1000, rviz_Callback);
    ROS_INFO("RUNNING");

    ros::spin();

    return 0;
}

当然,如果你没有map,它也会自动在rviz中创建一个map的坐标系的。
这样理论上就可以实现了。

然后,我说一些自己遇到的坑:
首先,robot_description这个参数是用来加载机器人模型的,要在urdf中显示,就必须要urdf或者xacro文件,sdf只能在gazebo中运行。

只要robot的base_link运动了,一般来说整个机器人都会运动(模型也是会运动的),如果不能就说明,有的东西没有加载。
在launch 文件中添加:

 <!--Add a real joint_state publisher from hardware将机器的人joint加进去,这样机器人内部的tf就不用调了-->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
 <!-- 发布robot数据-->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"/>
                                           

然后,调试tf的时候,一定要用 rosrun rqt_tf_tree rqt_tf_tree这个神器,可以看到整个tf结构。而且还能看到什么节点名在对那个tf进行广播。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rviz更改机器人位置,不考虑gazebo环境。 的相关文章

随机推荐

  • 基于stm32的mpu6050传感器实验

    64 TOCMPU6050 43 STM32学习笔记 学习了差不多两天的mpu6050 xff0c 参考了很多篇博客还有看一些资料 xff0c 今晚终于把这个东西在我的串口显示出来了 xff0c 下面就废话不多说 xff0c 开始我的笔记啦
  • Ubuntu 20.04 ROS Noetic及Realsense-ROS的安装和多机通信

    Ubuntu 20 04 ROS Noetic及Realsense ROS的安装和多机通信 1 Ubuntu20 04 ROS Noetic安装 参考官方安装教程 ROS Installation 请以以上安装步骤为准 xff0c 因为随着
  • 机械硬盘基本知识

    硬盘内部的物理结构很复杂 xff0c 只能从大的颗粒度去看内部的结构 xff0c 总体来说 xff0c 硬盘结构包括 xff1a 盘片 磁头 盘片主轴 控制电机 磁头控制器 数据转换器 接口 缓存 等几个部份 所有的盘片 xff08 一般硬
  • RTK八大基础知识

    RTK作为现代化测量中的测绘仪器 xff0c 已经非常普及 RTK在测量中的优越性也是不言而喻 为了能让RTK的优越性能在使用中充分的发挥出来 xff0c 为了能让RTK使用人员能灵活的应用RTK xff0c 我认为RTK使用人员必须了解以
  • 游戏思考04:网络游戏同步算法产生原因和相关介绍:跟随(插值)、预测、延迟补偿,三种算法(未完待续02/07)

    文章目录 一 网络同步的典型场景二 简单粗暴的数据同步为何行不通 xff1f xff08 帧同步的难题 xff09 1 xff09 网络同步的流程2 xff09 网络延迟和抖动的直观解释3 xff09 产生卡顿 瞬移的原因分析4 xff09
  • 51单片机定时器实现流水灯实验

    实验内容 xff1a 利用AT89C51的定时器0 方式1实现流水灯效果 xff0c 并用仿真验证 定时器0方式1的工作方式 xff1a 定时器的工作方式选择由寄存器TMOD控制 方式选择通过M0和M1控制 xff0c 方式1为16位定时器
  • 51单片机七段数码管显示时钟无按键控制—①—74HC595版

    参考链接 xff1a 51单片机七段数码管显示时钟加按键控制 74HC595版 51单片机七段数码管显示时钟加按键控制 74HC595版 文章目录 一 实验内容 xff1a 二 实验分析 xff1a 三 仿真图 xff1a 四 源代码 xf
  • 51单片机lcd1602显示时间日期

    实验内容 xff1a 使用51单片机控制LCD1602液晶显示屏显示 时间 日期 星期 温度 信息 xff0c 并可通过按键设置值 仿真效果展示 xff1a proteus仿真图 xff1a 硬件测试图 xff1a 说明 xff1a 硬件测
  • 51单片机实现普通时钟

    一 实验内容 xff1a 1 打开单片机 xff0c 数码管显示当前时间0 0 0 xff0c 时 分 秒 xff08 时间为24小时制 xff09 2 按键1 xff1a 按下一次进入秒的修改 xff0c 按下两次修改分钟 xff0c 按
  • No suitable kits found.——QT创建项目错误

    才开始学QT就遇到一个问题 xff0c 无法创建项目 xff0c 在 Kits 这一步提示 No suitable kits found 我的错误原因 xff1a 因为以前装过MinGw环境 xff0c 而且环境里还包含着中文 xff0c
  • Keil5高亮显示相同变量加上护眼配色方案

    先上效果图 xff1a 我们知道 xff0c 之前版本的Keil是不会对相同代码进行高亮显示的 xff0c 不过现在最新版的Keil已经支持对其高亮显示了 xff0c 只不过其配色还是和原来一样有些差强人意 初始效果如下 xff1a 实现上
  • 螺旋队列公式解释

    以1为坐标零点 xff0c 向右为X正 xff0c 向下为Y正 xff0c 任意输入一坐标 xff08 x y xff0c r 61 max x y 为当前所在层数 xff0c 得到下面公式 上边 xff1a top 61 max r 43
  • Bilibili缓存视频在电脑端直接打开方式

    哔哩哔哩移动端缓存的视频和音频分开了 xff0c 使用PotPlayer播放器可以在播放视频的时候加载音频 xff0c 从而不用合并两个文件 具体操作 xff1a 使用PotPlayer播放器打开video m4s文件 打开后点鼠标右键 x
  • C语言数组、结构体、结构体数组作为函数参数

    数组作为函数参数 如果想把一个数组名参数传递给函数 xff0c 正确的函数形参应该是怎样的 xff1f 它是应该声明为一个指针还是一个数组 xff1f 调用函数时实际传递的是一个指针 xff0c 所以函数的形参实际上是一个指针 xff0c
  • 有道词典离线数据包位置

    软件版本 xff1a 9 1 0 位置 xff1a C Users 用户名 AppData Local Yodao DeskDict nmt model 将离线包放入nmt model文件夹后重新启动有道词典即可断网使用长句翻译 汉英互译离
  • 改变Keil5所有窗口的背景颜色

    在网上找了很多都没有找到如何更改Keil5左侧和下侧的背景颜色 xff0c 后来根据一些提示找到了改背景的方法 xff0c 在此分享给有需要的人 首先 xff0c 更换中间那块的背景颜色相信大家都会 xff0c 不过我还是写一下 xff0c
  • ros入门(题尾一键安装)

    运行ros 96 提示 xff1a 因为手头有英伟达树莓派跟激光雷达 xff0c 也有ros小车 直接上现成的 xff0c 但是会卡 而且不好用 xff0c 所以建议自己安装一个 链接 xff1a https pan baidu com s
  • git 基础

    git可以实现分布式的版本管理 xff0c 合作开发工具 github和gitee是代码托管平台 查看配置信息 xff1a git config list 1 我们可以通过下面两条命令配置名字和邮箱 xff0c 使代码提交有迹可循 配置名字
  • idf.py基本使用

    1 idf py set target lt target gt 设置构建项目的目标 xff08 芯片 xff09 2 idf py menuconfig 运行menuconfig工具配置项目 3 idf py build 构建在当前目录下
  • rviz更改机器人位置,不考虑gazebo环境。

    文章目录 问题描述解决方案 问题描述 在RVIZ中想要去更改机器人模型位置 xff0c 但不想考虑gazebo的各种因素 xff0c 只想通过别人给的数据流去实时更改机器人在rviz中的位置 解决方案 首先 xff0c 先将原理弄清楚 在R