在f1tenth仿真中如何实现更快速的跑圈-曲线分析篇

news2024/11/17 7:43:38

本文使用蓝桥云课,即开即用,如果配置第三方课程资源,通常也在10分钟内完成。

效果如下:


全部参考资料如下:

蓝桥ROS之f1tenth案例学习与调试(失败)

蓝桥ROS之f1tenth案例学习与调试(成功) 

蓝桥ROS之f1tenth简单PID沿墙跑起来(Python) 

蓝桥ROS云课→一键配置←f1tenth和PID绕圈 

蓝桥ROS→f1tenth和PID绕圈←外传 

只需完成加粗博文即可完成基础配置。

如何利用蓝桥云课提升学习ROS机器人的效率 


本文只给出思路,不给源码,可以“自己动手丰衣足食”。

数学基础:

1 米/秒(米每秒)=3.6 千米/时(千米每小时)

实测极限速度8米/秒。直线或弧度小于10度的赛道。此速度不稳定。

可靠性高稳定跑完全程速度峰值6.2米/秒。

前轮转向角度控制量需要依据物理机械特性进行约束设定在左右45°之内。


给定控制算法如下:

#!/usr/bin/env python
from __future__ import print_function
import sys
import math
import numpy as np
 
#ROS Imports
import rospy
from sensor_msgs.msg import Image, LaserScan
from ackermann_msgs.msg import AckermannDriveStamped, AckermannDrive
 
#PID CONTROL PARAMS
kp = 1.0
kd = 0.001
ki = 0.005
servo_offset = 0.0
prev_error = 0.0 
error = 0.0
integral = 0.0
prev_time = 0.0
 
#WALL FOLLOW PARAMS
ANGLE_RANGE = 270 # Hokuyo 10LX has 270 degrees scan
DESIRED_DISTANCE_RIGHT = 0.9 # meters
DESIRED_DISTANCE_LEFT = 0.85
VELOCITY = 1.5 # meters per second
CAR_LENGTH = 1.0 # Traxxas Rally is 20 inches or 0.5 meters
 
class WallFollow:
    """ Implement Wall Following on the car
    """
    def __init__(self):
        global prev_time
        #Topics & Subs, Pubs
        lidarscan_topic = '/scan'
        drive_topic = '/nav'
        prev_time = rospy.get_time()
 
        self.lidar_sub = rospy.Subscriber(lidarscan_topic, LaserScan, self.lidar_callback)
        self.drive_pub = rospy.Publisher(drive_topic, AckermannDriveStamped, queue_size = 10)
 
    def getRange(self, data, angle):
        # data: single message from topic /scan
        # angle: between -45 to 225 degrees, where 0 degrees is directly to the right
        # Outputs length in meters to object with angle in lidar scan field of view
        #make sure to take care of nans etc.
        #TODO: implement
        if angle >= -45 and angle <= 225:
            iterator = len(data) * (angle + 90) / 360
            if not np.isnan(data[int(iterator)]) and not np.isinf(data[int(iterator)]):
                return data[int(iterator)]
 
    def pid_control(self, error, velocity):
        global integral
        global prev_error
        global kp
        global ki
        global kd
        global prev_time
        angle = 0.0
        current_time = rospy.get_time()
        del_time = current_time - prev_time
        #TODO: Use kp, ki & kd to implement a PID controller for 
        integral += prev_error * del_time
        angle = kp * error + ki * integral + kd * (error - prev_error) / del_time
        prev_error = error
        prev_time = current_time
        drive_msg = AckermannDriveStamped()
        drive_msg.header.stamp = rospy.Time.now()
        drive_msg.header.frame_id = "laser"
        drive_msg.drive.steering_angle = -angle
        if abs(angle) > math.radians(0) and abs(angle) <= math.radians(10):
            drive_msg.drive.speed = velocity
        elif abs(angle) > math.radians(10) and abs (angle) <= math.radians(20):
            drive_msg.drive.speed = 1.0
        else:
            drive_msg.drive.speed = 0.5
        self.drive_pub.publish(drive_msg)
 
    def followLeft(self, data, leftDist):
        #Follow left wall as per the algorithm 
        #TODO:implement
        front_scan_angle = 125
        back_scan_angle = 180
        teta = math.radians(abs(front_scan_angle - back_scan_angle))
        front_scan_dist = self.getRange(data, front_scan_angle)
        back_scan_dist = self.getRange(data, back_scan_angle)
        alpha = math.atan2(front_scan_dist * math.cos(teta) - back_scan_dist, front_scan_dist * math.sin(teta))
        wall_dist = back_scan_dist * math.cos(alpha)
        ahead_wall_dist = wall_dist + CAR_LENGTH * math.sin(alpha)
        return leftDist - ahead_wall_dist
 
    def lidar_callback(self, data):
        """ 
        """
        error = self.followLeft(data.ranges, DESIRED_DISTANCE_LEFT) #TODO: replace with error returned by followLeft
        #send error to pid_control
        self.pid_control(error, VELOCITY)
 
def main(args):
    rospy.init_node("WallFollow_node", anonymous=True)
    wf = WallFollow()
    rospy.sleep(0.1)
    rospy.spin()
 
if __name__=='__main__':
	main(sys.argv)

在完成实验1-4的基础上,修改f1tenth功能包,实现如下功能:

前轮转向角度控制量的曲线使用rqt中plot工具绘制。

原始:

曲线毛刺非常多

提速不改进:

曲线毛刺非常多,波动范围更大!比上一个曲线还要差 

改进1:

曲线波动范围大,但是已经有改善,并且毛刺大幅度降低 

改进2:

改善更为明显。

前轮转向角度控制量曲线的平滑度可以从上述四幅图的进行对比。

使用这些图表可以帮助改进算法。


通过控制量曲线进行算法改进和优化,提升局部规划器效果。 

f1tenth仿真转向角曲线绘制


同样的分析方法也可以用于两轮差速机器人:

 


AI提示(感觉基本不能用…………):

要提高F1赛车在比赛中的圈速,以下是一些可能的技巧和建议:

  1. 调整胎压:胎压是影响圈速的关键因素之一,赛车通常配备超级强大的轮胎,以提高抓地力和制动性能。要提高圈速,请确保您的轮胎压力保持在适当的水平。
  2. 调整悬挂:悬挂系统对于赛车的操控性和圈速表现有很大的影响。为了获得最佳性能,您应该根据比赛道路和天气条件,调整悬挂系统以提高赛车的稳定性和灵活性。
  3. 正确的进站策略:进站策略对于赛车的圈速也有很大的影响。在比赛中,您应该根据比赛形势和车队战术,选择合适的进站时机和方式,以获得最佳的圈速和竞争优势。
  4. 提高技术水平:熟练掌握基本驾驶技巧,例如正确的油门、刹车和换档操作,以及对赛道的熟悉程度,都是提高圈速的重要因素。
  5. 战术:战术可以在一定程度上影响圈速。在比赛中,您可以根据车队战术和对手表现,灵活运用技术和策略,以争取更多的机会和优势。

总之,要提高F1赛车在比赛中的圈速,需要综合考虑技术、战术和车队战略等多个因素。需要不断练习、尝试和调整,逐步提高自己的驾驶技能和竞争水平。

如果想要消除速度控制量曲线中的毛刺和曲线不平滑的现象,可以考虑以下几种方法:

  1. 调整进气量:如果进气量不均匀,可能会导致速度控制量曲线中出现毛刺和不平滑的现象。因此,您可以检查并调整空气滤清器和空气流量计的位置,以确保进气量的均匀性。
  2. 调整节气门:节气门的开度不均匀也可能导致速度控制量曲线中出现毛刺和不平滑的现象。您可以检查并调整节气门的位置,以确保开度的均匀性。
  3. 调整点火时间:点火时间不正确也可能会导致速度控制量曲线中出现毛刺和不平滑的现象。您可以检查并调整点火时间,以确保点火正时的准确性。
  4. 调整喷油量:喷油量不均匀也可能会导致速度控制量曲线中出现毛刺和不平滑的现象。您可以检查并调整喷油量,以确保油门响应的平稳性和曲线的平滑度。
  5. 调整进气温度:进气温度过高或过低都可能导致速度控制量曲线中出现毛刺和不平滑的现象。您可以检查并调整进气温度,以确保进气温度的适宜性和曲线的平滑度。

综上所述,调整以上因素可以消除速度控制量曲线中的毛刺和曲线不平滑的现象,提高赛车的性能和竞争力。

提高机器人巡线速度的方法有以下几种:

  1. 选择合适的无人机机型:根据不同的任务及线路环境特点,采用不同的机型进行作业,实现精准作业效果。
  2. 检查电池的数量与状态:在数量方面,电池数量与作业量要足够匹配。在电池状态方面,需要注意检查电池的外观是否有损坏、变形,电池接口的金属片是否存在破损、烧蚀等。
  3. 事先调查巡检线路的现场环境:出发前,可通过卫星图、地形图等多种资料,对所要巡视的线路的以下环境要素进行事先调查:地形条件状况、有无允许起降的场地、飞行空域有无遮挡物等,充分了解现场环境,还可对进一步的线路分段规划提供依据。
  4. 制定巡检飞行计划:在航线规划时,需要兼顾顺序安排、对于线路塔上关键部位(绝缘子、销钉或者螺母等)顺逆光的拍摄手法选择、曝光补偿的控制等。
  5. 采用多旋翼无人机倾斜摄影技术:可以从7个方面快速提升多旋翼无人机巡线效率:包括选择合适的无人机机型、检查电池的数量与状态、事先调查巡检线路的现场环境、制定巡检飞行计划、采用多旋翼无人机倾斜摄影技术、检查起降场地和飞行空域、以及对关键部位进行顺逆光拍摄等。

通过以上方法可以提高机器人巡线速度,但是需要注意,在提高速度的同时,要保证巡线的安全性和精准性。

为了降低机器人速度控制量曲线毛刺和控制不平滑的现象,可以采取以下措施:

  1. 选择合适的传感器:根据机器人所要检测的工件表面形状和尺寸,选择合适的传感器,并确保传感器的灵敏度和精度符合要求。
  2. 调整控制器参数:根据机器人所要执行的任务和环境条件,调整控制器的参数,如比例增益、积分增益和微分增益等,以提高机器人的控制精度和稳定性。
  3. 采用浮动加工技术:在机器人加工过程中,采用浮动加工技术,即将工件分为多个区域,对每个区域进行独立加工,然后将各个区域的加工结果拼接起来,以达到减少曲线毛刺的目的。
  4. 采用多轴加工技术:在机器人加工过程中,采用多轴加工技术,即将工件分为多个轴,同时对多个轴进行加工,以达到减少不平滑现象的目的。
  5. 优化加工程序:通过对加工程序进行优化,可以减少程序中的错误和不稳定因素,从而减少毛刺和不平滑现象的产生。
  6. 定期维护和保养:机器人的维护和保养工作对于其性能和稳定性至关重要,定期进行维护和保养可以有效地减少机器人故障的发生率,从而减少毛刺和不平滑现象的产生。

代码基本也是报废的:

#!/usr/bin/env python  
  
import rospy  
from control_msgs.msg import FollowJointTrajectory, FollowJointTrajectoryPoint  
from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint  
  
rospy.init_node('laser_navigation_node')  
  
# 定义PID参数  
kp = 1.0  # 比例常数  
ki = 0.1  # 积分常数  
kd = 0.1  # 微分常数  
  
# 定义机器人末端执行器  
motor = rospy.get_param('~motor', bool)  
if not motor:  
    rospy.loginfo('No motor node provided')  
    exit()  
  
# 定义目标位姿和机器人末端执行器  
target_pose = JointTrajectory()  
target_pose.joint_names = ['joint_1', 'joint_2', 'joint_3', 'joint_4', 'joint_5', 'joint_6']  
target_pose.positions = [0.0, 0.0, 10.0, 10.0, 0.0, 0.0]  # 初始化机器人末端执行器位姿  
  
# 定义机器人初始位姿  
init_pose = JointTrajectory()  
init_pose.joint_names = ['joint_1', 'joint_2', 'joint_3', 'joint_4', 'joint_5', 'joint_6']  
init_pose.positions = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]  
  
# 定义PID控制器  
def pid_controller(traj, kp, ki, kd, target_pose):  
    error = target_pose - traj  
    integral = error * kp  
    derivative = (error - integral) * kd  
    return error + integral + derivative  
  
# 定义PID控制器的调用函数  
def run_laser_navigation():  
    rospy.loginfo('Starting laser navigation')  
    # 设置PID参数  
    kp = 1.0  
    ki = 0.1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/463697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maven 三种archetype说明合集

Maven 三种archetype说明合集【转载】_maven-archetype-quickstart_太阳神LoveU的博客-CSDN博客 新建Maven project项目时&#xff0c;需要选择archetype。 那么&#xff0c;什么是archetype&#xff1f; archetype的意思就是模板原型的意思&#xff0c;原型是一个Maven项目模…

【ant-design-vue】树形表格数据,实现父子关联选择

ant-design-vue 版本1.7.8 ,2.2.8 这两个版本都是不支持树形表格数据&#xff0c;实现父子关联选择 只能自己写方法来实现父子关联选择 <template><a-card><a-table :columns"columnsA" :data-source"tabData" :customRow"tableClic…

Redis数据库和SpringBoot的故事|这一篇就够了(超详细)

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;老茶icon &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;计…

路由功能开启

开启路由 转发&#xff0c;为当前实验环境提供路由功能 RouterSrv 1.安装路由和远程访问 选中 路由 和 DirectAccess 和 VPN 2.配置 启用 路由功能 工具 ---- 路由和远程访问----右键 配置启用路由和远程访问 3.测试 找两个在不同网段的 服务端 是否能ping通

基于趋动云部署复旦大学MOSS大模型

首先新建项目&#xff1a; MOSS部署项目&#xff0c;然后选择镜像&#xff0c;直接用官方的镜像就可以。 之后选择数据集&#xff1a; 公开数据集中&#xff0c;MOSS_复旦大学_superx 这个数据集就是了&#xff0c;大小31G多 完成选择后&#xff1a; 点击创建&#xff0c;…

【c语言】enum枚举类型的定义格式 | 基本用法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

Nuxt3从零到发布

官网地址&#xff1a;Nuxt3 一&#xff1a;创建项目 Node.js -或更新版本v16.10.0 npx nuxi init nuxt-app 如果出现下面错误&#xff0c;请修改DNS为114.114,114,114 创建完成后在 Visual Studio Code 中打开项目文件夹&#xff1a; 二&#xff1a;安装依赖 npm install …

Newegg 新蛋供应链管理良策——EDI

美国新蛋网Newegg平台于2001年在美国洛杉矶创立&#xff0c;服务版图遍及全球52国&#xff0c;全球员工 2200人以上&#xff0c;用户总数达3600万、每月访客数达1700万&#xff0c;持续赢得广大网购用户喜爱&#xff0c;被Forbes与Computer Shopper等多家权威媒体评选为最佳购物…

类的几种实例化方法 new clone 反射 序列化 反序列化

目录 ①用类的new &#xff08;&#xff09;创建 ②用clone方法创建&#xff0c; 需要类实现 Cloneable 接口 ③通过反射机制创建 ④将一个对象实例化后&#xff0c;进行序列化&#xff0c;再反序列化 ①用类的new &#xff08;&#xff09;创建 User user new User(); ②…

如何从身份证号中提取年月日

怎样根据身份证号提取出生日期呢&#xff1f; 下面是一些数据&#xff0c;B列是身份证号&#xff0c;需要把出生日期提取到C列 方法1&#xff1a;技巧法&#xff08;数据-->分列&#xff09; 选中身份证号所在的列&#xff0c;单击菜单栏中的【数据】-->【分列】&#…

H.264/AVC加密----选择加密

文献学习&#xff1a; 《Data Hiding in Encrypted H.264/AVC Video Streams by Codeword Substitution》 期刊&#xff1a;IEEE TRANSACTIONS ON INFORMATION FORENSICS AND SECURITY 简介 通过分析H.264/AVC编解码器的特性&#xff0c;提出了三个敏感部分(IPM、MVD和残差系…

基于深度学习mediapipe的人脸打码人脸模糊教程pyqt5界面附源码

一、人脸识别 人脸识别是一门比较成熟的技术。 它的身影随处可见&#xff0c;刷脸支付&#xff0c;信息审核&#xff0c;监控搜索&#xff0c;人脸打码等。 更多的时候&#xff0c;它是方便了我们的生活&#xff0c;足不出户&#xff0c;就可以实现各种 APP 的实名认证&…

格式化数据恢复怎么做?超实用的3种方法在这!

案例&#xff1a;格式化数据怎么恢复 【我的电脑前段时间中病毒了&#xff0c;无奈之下我只能将其格式化&#xff0c;但是很多重要的文件和图片之类的也一起被删除了&#xff0c;有什么方法可以恢复这些格式化的数据吗&#xff1f;非常着急&#xff01;】 格式化数据恢复&…

1390:食物链【NOI2001】

1390&#xff1a;食物链【NOI2001】 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 动物王国中有三类动物A,B,C&#xff0c;这三类动物的食物链构成了有趣的环形。A吃B&#xff0c; B吃C&#xff0c;C吃A。 现有N个动物&#xff0c;以1&#xff0d;N编号。每个动…

安全常见基础名词概念

一、域名 1、域名&#xff1a;相当网站的名字&#xff0c;互联网上某一台计算机或计算机组的名称&#xff0c;用于在数据传输时标识计算机的电子方位。 2、网域名系统&#xff08;Domain Name System&#xff09;有时也简称为域名&#xff08;DNS&#xff09;&#xff0c;是互…

Sametime 12.0.1 FP1发布以及Notes中的SwiftFile使用

大家好&#xff0c;才是真的好。 上周&#xff0c;HCL推出了Sametime 12.0.1FP1FP1更新包程序&#xff0c;包含不少新功能以及很多修复程序。虽然Sametime组件现在不需要运行在Domino服务器上&#xff0c;但毕竟Sametime通常会使用Domino目录或Domino中的LDAP目录服务&#xf…

陆奇最新演讲高清PPT下载;AI 绘画20+工具体验汇总;我愿称MOSS为全球开源界最强;思否AIGC黑客马拉松北京站 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『陆奇罕见公开演讲「新范式 新时代 新机会」』高清PPT和视频可直接下载 ShowMeAI知识星球资料编号&#xff1a;R054 奇绩创坛创始人兼…

ChatGPT实现命名实体识别(NER, named entity recognization)和词性归类

语义分析词格分类 命名实体识别(NER, named entity recognization)和词性归类是 NLP 技术中的关键一环。过去 NLP 领域有不少流行的开源项目专注在这个领域&#xff0c;如 Spacy、NLTK 等等。我们来试试 ChatGPT 在这方面的表现情况如何。我们从"四渡赤水"的百度百科…

故障预测与健康管理PHM如何做可解释性研究?

首先&#xff0c;故障预测与健康管理PHM基于先进传感器技术获取复杂设备的运行状态信息&#xff0c;借助智能算法实现复杂工程系统的故障诊断、健康状态预测与管理。基于机器学习的PHM技术能够充分挖掘多源异构数据的信息&#xff0c;提高故障诊断、健康状态预测以及剩余寿命估…

uniapp微信小程序连接蓝牙打印机 打印文字、图片

首先感谢几位的文章分享 https://blog.csdn.net/guairena/article/details/127941515 https://blog.csdn.net/qq_37970097/article/details/119148707 效果图&#xff1a; 使用的是 芝柯cc3 蓝牙打印机, 我这里没有存储蓝牙设备相关信息。所以每次打印都会重新初始化并搜索设…