IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> [基于STM32底盘控制与ROS上层导航小车制作]第六节 ROS计算和发布里程计与tf变换 -> 正文阅读

[嵌入式][基于STM32底盘控制与ROS上层导航小车制作]第六节 ROS计算和发布里程计与tf变换

系列文章目录

第一节 stm32电机驱动与编码器读取反馈

第二节 stm32电机pid控制

第三节 stm32线速度标定

第四节 stm32添加mpu6050得到angle角度

第五节 实现STM32与ubuntu系统下的ROS串口DMA通信,传输底盘速度等信息

第六节 ROS计算和发布里程计与tf变换

目录

系列文章目录

前言

1.位移信息计算

2.速度信息

3.发布里程计

二、发布tf变换

1.内容计算

2.发布tf

三.rviz查看信息与launch集成节点

总结



前言

今天我们收到底盘的速度与角度信息后进行odom里程计发送


一、发布里程计

发布里程计之前我们看看里程计需要计算哪些数据

     //next, we'll publish the odometry message over ROS
     nav_msgs::Odometry odom;
     odom.header.stamp = current_time;
     odom.header.frame_id = "odom";
 
     //set the position
     odom.pose.pose.position.x = x;
     odom.pose.pose.position.y = y;
     odom.pose.pose.position.z = 0.0;
     odom.pose.pose.orientation = odom_quat;

     //set the velocity
     odom.child_frame_id = "base_link";
     odom.twist.twist.linear.x = vx;
     odom.twist.twist.linear.y = vy;
     odom.twist.twist.angular.z = vth;
 
    //publish the message
     odom_pub.publish(odom);

这是一个简单的发布例子,可以看出需要机器人的位置信息与速度信息,我们知道的只有速度,由数学可知位置当然可以积分出来了,这个计算方法每种底盘模型都不一样,我这里还是介绍两轮差速模型

?由数学推导可知当前位置与上一次位置的关系是

?d是小车中心的唯一,\theta +\frac{\omega \delta t}{2}则就是两次航向角的夹角,D_L是左轮位移,D_R是右轮位移

d = (D_L+D_R)/2

1.位移信息计算

?则综上可得到如下计算

//中心位移
double center_d = (left_speed*time + right_speed*time)/2;

position_x = position_x_last + center_d *cos(theta) ;
position_y = position_y_last + center_d *sin(theta) ;

对于odom.pose.pose.orientation,也就是方向四元数,我们得到底盘传来的yaw后调用函数

geometry_msgs::Quaternion odom_quat;
odom_quat = tf::createQuaternionMsgFromYaw(yaw);

则会自动将yaw转化为四元数,其它方向角度可暂时不管

2.速度信息

linear = (V_L+V_R)/2

\omega = \theta /t

\theta为角度差,t为两次时间差

3.发布里程计

我们这里将里程计的坐标系定为odom,车体底盘定为base_footprint

 // 发布里程计消息
        ros::Publisher pub;
        //发布odometry消息,消息队列为1
        pub = n.advertise<nav_msgs::Odometry>("odom", 1);

        nav_msgs::Odometry msgl;
        msgl.header.stamp = time;
        msgl.header.frame_id = "odom";

        msgl.pose.pose.position.x = position_x;
        msgl.pose.pose.position.y = position_y;
        msgl.pose.pose.position.z = 0.0;
        msgl.pose.pose.orientation = odom_quat;

        msgl.child_frame_id = "base_footprint";
        msgl.twist.twist.linear.x = linear;
        msgl.twist.twist.linear.y = 0;
        msgl.twist.twist.angular.z = angluar;

        pub.publish(msgl);

二、发布tf变换

1.内容计算

与里程计相同

2.发布tf

        ros::Time time = ros::Time::now();
        // 发布TF
        tf::TransformBroadcaster odom_broadcaster;

        geometry_msgs::TransformStamped odom_trans;
        odom_trans.header.stamp = time;
        odom_trans.header.frame_id = "odom";
        odom_trans.child_frame_id  = "base_footprint";

        geometry_msgs::Quaternion odom_quat;
        odom_quat = tf::createQuaternionMsgFromYaw(yaw);
        odom_trans.transform.translation.x = position_x;
        odom_trans.transform.translation.y = position_y;
        odom_trans.transform.translation.z = 0.0;
        odom_trans.transform.rotation = odom_quat;
        
        odom_broadcaster.sendTransform(odom_trans);

三.rviz查看信息与launch集成节点

在CMakelist.txt内生成总的执行文件,两个文件一个串口函数定义,一个负责接受地盘数据并且发布里程计与坐标转换

add_executable(robot_start 
          src/publish_node.cpp 
			    src/mbot_linux_serial.cpp )
target_link_libraries(robot_start ${catkin_LIBRARIES})

机器人启动文件,并打开rviz

<launch>

    <!-- 启动rebot,这里节点名写你自己发布里程计并接受串口数据的节点名称 -->
    <node pkg="my_robot" type="robot_start" name="robot_start" output="screen" />


	<node pkg="rviz" type="rviz" name="rviz"  />

</launch>

终端内

catkin_make
source ./devel/setup.bash
roslaunch my_robot robot_start #填写你的launch文件

此时rviz内左下角添加tf组件,手动转动车体,查看yaw轴方向是否准备,拨动车轮,看odom坐标系与base_footprint的平移是否正常


总结

这时你可以连接好底盘与上位机,并发送数据,上位机打开rviz查看

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-19 12:12:44  更:2021-08-19 12:14:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:38:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码