虽然是一键配置,但还是需要若干步骤的。

参考:

ROS1云课→18一键配置

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

蓝桥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)


差速巡线参考:

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

前轮转向移动机器人方向参考:

 1. 实验目的

前轮转向移动机器人的实验目的是为了让学生了解和掌握前轮转向移动机器人的基本原理和控制方法,以及学习机器人运动学方面的知识。此外,该实验还可以培养学生的动手能力和团队合作精神,提高学生的实验操作能力和实验设计能力。

具体来说,前轮转向移动机器人的实验目的可以分为以下几个方面:

  1. 了解前轮转向移动机器人的基本结构和工作原理。学生需要了解机器人的各个部件及其功能,包括前轮转向系统、电机控制系统、传感器系统等。

  2. 掌握机器人的运动学原理和控制方法。学生需要了解机器人的运动学模型,包括机器人的位置、速度和加速度等基本参数,以及控制机器人的运动轨迹和速度等。

  3. 学习机器人的编程和控制技术。学生需要学习机器人的编程语言和控制算法,包括PID控制算法、路径规划算法等,以便能够对机器人进行控制和调试。

  4. 培养学生的实验操作能力和实验设计能力。学生需要亲自进行机器人的组装、调试和测试等操作,同时还需要设计和实现机器人的控制程序和算法,以培养他们的实验操作能力和实验设计能力。

  5. 提高学生的创新意识和团队合作精神。学生需要在实验中积极思考和创新,同时还需要与同学一起合作完成实验,以提高他们的创新意识和团队合作精神。

2. 实验意义或者动机

前轮转向移动机器人的实验意义或动机有以下几个方面:

  1. 探索机器人移动的新方式:前轮转向移动机器人的移动方式相对于传统的轮式机器人具有一定的优势,可以在狭窄的空间内灵活移动,同时在机器人需要进行精细调整时也比较方便。
  2. 研究移动机器人的控制方法:前轮转向移动机器人需要通过控制前轮的转向角度来实现移动,因此需要研究相应的控制方法。这可以为其他类型的移动机器人的控制提供参考。
  3. 应用于特定场景:前轮转向移动机器人在一些特定的场景中可以发挥很好的作用,比如在仓库内进行物品搬运、在医院内进行药品送达等。
  4. 提高人机交互的便利性:前轮转向移动机器人可以通过通过传感器和相应的控制系统来实现对环境的感知和响应,从而提高人机交互的便利性。比如,在酒店或机场内作为导航机器人,可以帮助用户更加方便地找到目的地。

3. 实验步骤

以下是前轮转向移动机器人实验步骤的详细讲解:

  1. 确认实验器材和硬件:首先需要确认实验所需的器材和硬件是否齐全,包括前轮转向移动机器人、开发板、电机驱动器、直流电源以及电缆等。

  2. 连接电路:将电机驱动器和开发板通过电缆连接起来,并将直流电源连接到电机驱动器上,以为机器人提供动力。

  3. 编写控制程序:利用开发板上的控制软件,编写控制程序,对机器人进行控制。主要包括控制机器人的运动方向、速度和转向角度等。

  4. 连接传感器:为了实现机器人的自主导航,需要连接一些传感器,如红外线传感器、超声波传感器等,以便机器人能够感知周围环境,自主避障和控制转向。

  5. 调试程序:通过测试和调试程序,确保机器人能够正常运行和执行任务,如前进、转向、避障等。

  6. 实验操作:将机器人放置在实验场地上,让它自主移动和执行任务,如行驶一定距离、绕过障碍物等。

  7. 数据分析:根据实验结果,对机器人的运动性能和控制程序进行分析和评价,进一步优化机器人的运动控制和导航性能。

总之,前轮转向移动机器人实验需要多方面的技术支持和掌握,包括电路设计、控制程序编写、传感器连接、数据分析等,需要认真准备和实践。

4. 实验结果和分析

前轮转向移动机器人是一种常见的机器人类型,它通过控制前轮的转向来实现运动和转向。在实验中,我们通常会对机器人进行控制,比如通过遥控器或编程控制来实现机器人的移动和转向。下面就对前轮转向移动机器人的实验结果和分析进行详细讲解。

实验结果:

前轮转向移动机器人的实验结果通常包括机器人的运动轨迹、速度、转向角度等方面的数据。在实验中,我们可以通过设置不同的运动轨迹和控制参数来观察机器人的运动状态。

一般来说,当机器人向前移动时,我们可以通过控制前轮的转向角度来改变机器人的移动方向。同时,我们也可以通过控制机器人的速度来控制机器人的移动速度。在实验中,我们可以设置不同的速度和转向角度来观察机器人的运动状态。

分析:

前轮转向移动机器人的实验分析主要涉及机器人的运动控制和传感器反馈两个方面。下面分别进行详细讲解。

  • 运动控制

机器人的运动控制是实现机器人运动和转向的关键。在前轮转向移动机器人中,我们通常通过控制前轮的转向角度来改变机器人的运动方向。同时,我们也可以通过控制机器人的速度来控制机器人的移动速度。

在实验中,我们可以通过设置不同的速度和转向角度来观察机器人的运动状态。比如,当我们设置机器人的转向角度为90度时,机器人就会向左或向右转向。当我们设置机器人的速度为5cm/s时,机器人就会以5cm/s的速度向前移动。

  • 传感器反馈

机器人的传感器反馈是实现机器人自主控制的关键。在前轮转向移动机器人中,我们通常使用红外线或超声波传感器来获取机器人周围环境的信息。通过传感器反馈,机器人可以实现避障、跟随等自主控制功能。

在实验中,我们可以通过设置不同的传感器反馈方式来观察机器人的自主控制状态。比如,当机器人遇到障碍物时,我们可以通过传感器反馈来让机器人自动避障。当机器人需要跟随某个目标时,我们也可以通过传感器反馈来实现机器人的自主跟随。

总结:

前轮转向移动机器人的实验结果和分析涉及机器人的运动控制和传感器反馈两个方面。通过对机器人的运动轨迹、速度、转向角度等数据进行观察和分析,可以有效评估机器人的运动状态和控制能力。同时,通过对机器人的传感器反馈进行观察和分析,可以评估机器人的自主控制能力和适应性。

后续内容依据需要补充。