当前位置: 首页 > news >正文

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

四轮驱小车的话
转向角度计算方法: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.lryc.cn/news/526955.html

相关文章:

  • 使用.NET 8构建高效的时间日期帮助类
  • 学习std::is_base_of笔记
  • 第 25 场 蓝桥月赛
  • 【设计模式-行为型】访问者模式
  • 无人机微波图像传输数据链技术详解
  • SpringCloud系列教程:微服务的未来(十七)监听Nacos配置变更、更新路由、实现动态路由
  • 【QT】 控件 -- 显示类
  • 反馈驱动、上下文学习、多语言检索增强等 | Big Model Weekly 第55期
  • CF 41A.Translation(Java实现)
  • 14【学历和能力哪个更重要】
  • Learning Vue 读书笔记 Chapter 2
  • SpringBoot支持动态更新配置文件参数
  • 开发技巧,vue 中的动态组件的引用 component + is
  • 基于SpringBoot+WebSocket的前后端连接,并接入文心一言大模型API
  • PSD是什么图像格式?如何把PSD转为JPG格式?
  • c语言中mysql_query的概念和使用案例
  • 一次端口监听正常,tcpdump无法监听到指定端口报文问题分析
  • 解决InnoDB: Failing assertion: !lock->recursive
  • 基于微信小程序的外卖点餐系统设计与实现ssm+论文源码调试讲解
  • Helm Chart 实现 Kubernetes 应用的多环境部署与镜像更新
  • “腾讯、钉钉、飞书” 会议开源平替,免费功能强大
  • 我谈区域偏心率
  • 思科交换机telnet配置案例
  • 机器学习:支持向量机
  • 人工智能前沿技术进展与应用前景探究
  • (一)HTTP协议 :请求与响应
  • 什么是网络爬虫?Python爬虫到底怎么学?
  • NR_shell运行流程简析
  • CSS Fonts(字体)
  • 基于Django的Boss直聘IT岗位可视化分析系统的设计与实现