虽然是一键配置,但还是需要若干步骤的。
参考:
蓝桥ROS之f1tenth简单PID沿墙跑起来(Python)
一键升级脚本,直接配置好f1tenth并启动:
echo "Upgrade Mission Begins."
echo "-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1
mQINBFzvJpYBEADY8l1YvO7iYW5gUESyzsTGnMvVUmlV3XarBaJz9bGRmgPXh7jc
VFrQhE0L/HV7LOfoLI9H2GWYyHBqN5ERBlcA8XxG3ZvX7t9nAZPQT2Xxe3GT3tro
u5oCR+SyHN9xPnUwDuqUSvJ2eqMYb9B/Hph3OmtjG30jSNq9kOF5bBTk1hOTGPH4
K/AY0jzT6OpHfXU6ytlFsI47ZKsnTUhipGsKucQ1CXlyirndZ3V3k70YaooZ55rG
aIoAWlx2H0J7sAHmqS29N9jV9mo135d+d+TdLBXI0PXtiHzE9IPaX+ctdSUrPnp+
TwR99lxglpIG6hLuvOMAaxiqFBB/Jf3XJ8OBakfS6nHrWH2WqQxRbiITl0irkQoz
pwNEF2Bv0+Jvs1UFEdVGz5a8xexQHst/RmKrtHLct3iOCvBNqoAQRbvWvBhPjO/p
V5cYeUljZ5wpHyFkaEViClaVWqa6PIsyLqmyjsruPCWlURLsQoQxABcL8bwxX7UT
hM6CtH6tGlYZ85RIzRifIm2oudzV5l+8oRgFr9yVcwyOFT6JCioqkwldW52P1pk/
/SnuexC6LYqqDuHUs5NnokzzpfS6QaWfTY5P5tz4KHJfsjDIktly3mKVfY0fSPVV
okdGpcUzvz2hq1fqjxB6MlB/1vtk0bImfcsoxBmF7H+4E9ZN1sX/tSb0KQARAQAB
tCZPcGVuIFJvYm90aWNzIDxpbmZvQG9zcmZvdW5kYXRpb24ub3JnPokCVAQTAQgA
PgIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBMHPbjHmut6IaLFytPQu1vur
F8ZUBQJgsdhRBQkLTMW7AAoJEPQu1vurF8ZUTMwP/3f7EkOPIFjUdRmpNJ2db4iB
RQu5b2SJRG+KIdbvQBzKUBMV6/RUhEDPjhXZI3zDevzBewvAMKkqs2Q1cWo9WV7Z
PyTkvSyey/Tjn+PozcdvzkvrEjDMftIk8E1WzLGq7vnPLZ1q/b6Vq4H373Z+EDWa
DaDwW72CbCBLWAVtqff80CwlI2x8fYHKr3VBUnwcXNHR4+nRABfAWnaU4k+oTshC
Qucsd8vitNfsSXrKuKyz91IRHRPnJjx8UvGU4tRGfrHkw1505EZvgP02vXeRyWBR
fKiL1vGy4tCSRDdZO3ms2J2m08VPv65HsHaWYMnO+rNJmMZj9d9JdL/9GRf5F6U0
quoIFL39BhUEvBynuqlrqistnyOhw8W/IQy/ymNzBMcMz6rcMjMwhkgm/LNXoSD1
1OrJu4ktQwRhwvGVarnB8ihwjsTxZFylaLmFSfaA+OAlOqCLS1OkIVMzjW+Ul6A6
qjiCEUOsnlf4CGlhzNMZOx3low6ixzEqKOcfECpeIj80a2fBDmWkcAAjlHu6VBhA
TUDG9e2xKLzV2Z/DLYsb3+n9QW7KO0yZKfiuUo6AYboAioQKn5jh3iRvjGh2Ujpo
22G+oae3PcCc7G+z12j6xIY709FQuA49dA2YpzMda0/OX4LP56STEveDRrO+CnV6
WE+F5FaIKwb72PL4rLi4
=i0tj
-----END PGP PUBLIC KEY BLOCK-----" >> ~/ros.asc
sudo apt-key add ros.asc
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
git clone https://gitcode.net/ZhangRelay/f1tenth.git
mkdir -p ~/f1tenth/src
cd ~/f1tenth/src
unzip ~/f1tenth/f1tenth_simulator.zip
sudo rm /etc/apt/sources.list.d/ros2-latest.list
sudo apt update
sudo apt install ros-kinetic-tf2-geometry-msgs ros-kinetic-ackermann-msgs ros-kinetic-joy ros-kinetic-map-server ros-kinetic-message-runtime -y
sudo apt upgrade -y
cd ~/f1tenth
catkin_make
source ~/f1tenth/devel/setup.zsh
roslaunch f1tenth_simulator simulator.launch
echo "Upgrade Mission Completed."
完成后:
效果如下:
PID的算法:
#!/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)
差速巡线参考:
前轮转向移动机器人方向参考:
前轮转向移动机器人的实验目的是为了让学生了解和掌握前轮转向移动机器人的基本原理和控制方法,以及学习机器人运动学方面的知识。此外,该实验还可以培养学生的动手能力和团队合作精神,提高学生的实验操作能力和实验设计能力。
具体来说,前轮转向移动机器人的实验目的可以分为以下几个方面:
前轮转向移动机器人的实验意义或动机有以下几个方面:
以下是前轮转向移动机器人实验步骤的详细讲解:
总之,前轮转向移动机器人实验需要多方面的技术支持和掌握,包括电路设计、控制程序编写、传感器连接、数据分析等,需要认真准备和实践。
前轮转向移动机器人是一种常见的机器人类型,它通过控制前轮的转向来实现运动和转向。在实验中,我们通常会对机器人进行控制,比如通过遥控器或编程控制来实现机器人的移动和转向。下面就对前轮转向移动机器人的实验结果和分析进行详细讲解。
实验结果:
前轮转向移动机器人的实验结果通常包括机器人的运动轨迹、速度、转向角度等方面的数据。在实验中,我们可以通过设置不同的运动轨迹和控制参数来观察机器人的运动状态。
一般来说,当机器人向前移动时,我们可以通过控制前轮的转向角度来改变机器人的移动方向。同时,我们也可以通过控制机器人的速度来控制机器人的移动速度。在实验中,我们可以设置不同的速度和转向角度来观察机器人的运动状态。
分析:
前轮转向移动机器人的实验分析主要涉及机器人的运动控制和传感器反馈两个方面。下面分别进行详细讲解。
机器人的运动控制是实现机器人运动和转向的关键。在前轮转向移动机器人中,我们通常通过控制前轮的转向角度来改变机器人的运动方向。同时,我们也可以通过控制机器人的速度来控制机器人的移动速度。
在实验中,我们可以通过设置不同的速度和转向角度来观察机器人的运动状态。比如,当我们设置机器人的转向角度为90度时,机器人就会向左或向右转向。当我们设置机器人的速度为5cm/s时,机器人就会以5cm/s的速度向前移动。
机器人的传感器反馈是实现机器人自主控制的关键。在前轮转向移动机器人中,我们通常使用红外线或超声波传感器来获取机器人周围环境的信息。通过传感器反馈,机器人可以实现避障、跟随等自主控制功能。
在实验中,我们可以通过设置不同的传感器反馈方式来观察机器人的自主控制状态。比如,当机器人遇到障碍物时,我们可以通过传感器反馈来让机器人自动避障。当机器人需要跟随某个目标时,我们也可以通过传感器反馈来实现机器人的自主跟随。
总结:
前轮转向移动机器人的实验结果和分析涉及机器人的运动控制和传感器反馈两个方面。通过对机器人的运动轨迹、速度、转向角度等数据进行观察和分析,可以有效评估机器人的运动状态和控制能力。同时,通过对机器人的传感器反馈进行观察和分析,可以评估机器人的自主控制能力和适应性。
后续内容依据需要补充。