差分轮算法-两个轮子计算速度的方法-阿克曼四轮小车计算方法

embedded/2025/1/26 14:55:23/

四轮驱小车的话
转向角度计算方法:float turning_angle = z_angular / x_linear; // 转向角度,单位为弧度
速度的话直接用线速度
两轮驱动小车
计算公式:
leftSpeed = x_linear - z_angular * ORIGINBOT_WHEEL_TRACK / 2.0; #左轮速度
rightSpeed = x_linear + z_angular * ORIGINBOT_WHEEL_TRACK / 2.0;#右轮速度
其中x_linear和z_angular是由del_cmd话题发出来的twist数据

void OriginbotBase::cmd_vel_callback(const geometry_msgs::msg::Twist::SharedPtr msg)
{DataFrame cmdFrame;float leftSpeed = 0.0, rightSpeed = 0.0;float x_linear = msg->linear.x; float z_angular = msg->angular.z;//差分轮运动学模型求解leftSpeed  = x_linear - z_angular * ORIGINBOT_WHEEL_TRACK / 2.0;rightSpeed = x_linear + z_angular * ORIGINBOT_WHEEL_TRACK / 2.0;// RCLCPP_INFO(this->get_logger(), "leftSpeed = '%f' rightSpeed = '%f'", leftSpeed * 100, rightSpeed * 100);if (leftSpeed < 0)cmdFrame.data[0] = 0x00;elsecmdFrame.data[0] = 0xff;cmdFrame.data[1] = int(abs(leftSpeed) * 1000) & 0xff;         //速度值从m/s变为mm/scmdFrame.data[2] = (int(abs(leftSpeed) * 1000) >> 8) & 0xff;if (rightSpeed < 0)cmdFrame.data[3] = 0x00;elsecmdFrame.data[3] = 0xff;cmdFrame.data[4] = int(abs(rightSpeed) * 1000) & 0xff;        //速度值从m/s变为mm/scmdFrame.data[5] = (int(abs(rightSpeed) * 1000) >> 8) & 0xff;cmdFrame.check = (cmdFrame.data[0] + cmdFrame.data[1] + cmdFrame.data[2] + cmdFrame.data[3] + cmdFrame.data[4] + cmdFrame.data[5]) & 0xff;// 封装速度命令的数据帧cmdFrame.header = 0x55;cmdFrame.id     = 0x01;cmdFrame.length = 0x06;cmdFrame.tail   = 0xbb;try{serial_.write(&cmdFrame.header, sizeof(cmdFrame)); //向串口发数据}catch (serial::IOException &e){RCLCPP_ERROR(this->get_logger(), "Unable to send data through serial port"); //如果发送数据失败,打印错误信息}// 考虑平稳停车的计数值if((fabs(x_linear)>0.0001) || (fabs(z_angular)>0.0001))auto_stop_count_ = 0;// printf("Frame raw data: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x \n", //         cmdFrame.header, cmdFrame.id, cmdFrame.length, cmdFrame.data[0], cmdFrame.data[1], cmdFrame.data[2], //         cmdFrame.data[3], cmdFrame.data[4], cmdFrame.data[5], cmdFrame.check, cmdFrame.tail);
}

http://www.ppmy.cn/embedded/157164.html

相关文章

Baklib如何推动企业知识管理的创新与转型探讨

内容概要 在当今快速发展的数字化时代&#xff0c;企业需要不断适应变化&#xff0c;以保持竞争优势。Baklib作为一款企业知识管理中台&#xff0c;扮演着推动数字化转型的重要角色。它通过提供一个集成的知识管理平台&#xff0c;帮助企业高效管理和共享内部及外部的知识资源…

MySQL 中如何进行 SQL 调优?

重点 平时进行 SQL 调优,主要是通过观察慢 SQL,然后利用 explain 分析查询语句的执行计划,识别性能瓶颈,优化查询语句。 1) 合理设计索引,利用联合索引进行覆盖索引的优化,避免回表的发生,减少一次查询和随机 I/O 回表&#xff1a;索引无法满足查询所需的所有列数据&#xf…

双写+灰度发布:高并发场景下的维度表拆分零事故迁移实践

目录 0 文章摘要 1业务场景描述 2 迁移及实施过程 2.1 拆分设计与数据探查 2.1 历史数据迁移&#xff08;全量&#xff09; 2.3 增量数据同步&#xff08;双写过渡&#xff09; 2.4.业务切换验证 2.5 回滚预案 2.6 成果与收益 3 关键经验总结 往期回顾 专栏优势&am…

Redis-缓存

1.缓存 1.1 什么是缓存&#xff1f; 越野车,山地自行车,都拥有"避震器",防止车体加速后因惯性,在酷似"U"字母的地形上飞跃,硬着陆导致的损害,像个弹簧一样;同样,实际开发中,系统也需要"避震器",防止过高的数据访问猛冲系统,导致其操作线程无法…

数据结构day02

1 线性表的定义和基本操作 1.1 线性表的定义 分析&#xff1a; 1.1.1 问题一&#xff1a;我们为什么探讨线性表的定义和基本操作 在研究数据结构时&#xff0c;需要重点关注三个方面&#xff1a;逻辑结构、物理结构以及数据的运算。在本节内容里&#xff0c;我们首先来介绍线…

深入探讨:如何在 Debian 系统中实施有效的安全配置

深入探讨:如何在 Debian 系统中实施有效的安全配置 在如今的网络环境中,服务器的安全配置已经成为每个运维工程师的必备技能。无论是个人网站还是企业应用,确保服务器的安全性都是至关重要的。作为一名运维领域的自媒体创作者,我将分享一些在 Debian 系统中实施安全配置的…

2025美赛数学建模B题 管理可持续旅游业保姆级教程讲解|模型讲解

2025 MCM 问题 B&#xff1a;管理可持续旅游业 为了构建一个详细的数学模型来实现Juneau可持续旅游业的优化&#xff0c;我们可以采用以下步骤来分析和制定策略。我们将通过几个关键因素来分析&#xff1a;游客数量、总体收入、基础设施压力和环境保护措施等&#xff0c;并结合…

亚博microros小车-原生ubuntu支持系列:6-整体检测

前面迁移了手部检测&#xff1a;亚博microros小车-原生ubuntu支持系列&#xff1a;4-手部检测-CSDN博客 亚博microros小车-原生ubuntu支持系列&#xff1a;5-姿态检测-CSDN博客 本篇迁移整体检测。 结合前两节的内容&#xff0c;本节例程实现即可检测手掌也可检测人体的功能…