蓝桥云课ROS机器人旧版实验报告-05导航功能

news2024/9/25 1:22:03

项目名称

实验五  导航功能 

成绩

内容:创建变换、发布传感器消息、里程数据信息、创建基础控制器、创建地图,机器人配置、全局和局部代价地图、rviz详细配置、自适应蒙特卡洛定位,避障,目标发送

实验记录(70分)

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

 

简单并且可执行的激光局部规划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)

复现一个案例:

解压缩提供的f1_ws.zip功能包,unzip f1_ws.zip。

(/home/shiyanlou/f1tenth/src/)

 

回到功能包路径下,重新编译,catkin_make。

补全确少功能包!

sudo apt install ros-kinetic-teb-local-planner ros-kinetic-navigation ros-kinetic-move-base ros-kinetic-nav-core -y

修改:

/opt/ros/kinetic/share/catkin/cmake/toplevel.cmake

执行如下:roslaunch xiaomu_nav simulator_wall_following.launch

 

第一个错误是没有外界游戏手柄;

第二个错误是没有识别对应功能程序。

对应第一个解决方法,USB插入游戏手柄,如果没有游戏手柄可以忽略。

对应第二个有两种方式:

  1. 不严谨

找到对应程序,手工执行!

 

  1. 官方推荐

修改CMakelist.txt

参考如下:

catkin_install_python(PROGRAMS scripts/talker.py

  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}

)

对应本案例如下:

catkin_install_python(PROGRAMS

  scripts/wall_following.py

  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}

)

此部分完成后,转入导航测试:

roslaunch xiaomu_nav xiaomu_teb_nav.launch

报错如下:

 

参考上面问题二,方法二解决。

catkin_install_python(PROGRAMS

  scripts/wall_following.py scripts/cmd_vel_to_ackermann_drive.py

  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}

)

注意需要执行文件的权限。

 


蓝桥云课ROS机器人实验报告-05导航功能的大纲可能包括以下内容:

  1. 导航系统介绍:介绍导航系统的概念、组成、功能和实现方式。
  2. 地图构建:介绍如何使用ROS的地图构建工具,如SLAM、Map再将等,构建机器人的地图。
  3. 导航策略:介绍常见的导航策略,如A*、D*、Potential Field等,并介绍如何在ROS中实现这些策略。
  4. 机器人定位:介绍常见的机器人定位方法,如GPS、IMU、Visual Odometry等,并介绍如何在ROS中实现这些定位方法。
  5. 实验练习:学生需要根据给定的机器人硬件设备和控制需求,设计机器人的导航策略和定位方法,并在ROS环境中进行实验和调试。

以上是蓝桥云课ROS机器人实验报告-05导航功能大纲的一个大致框架,具体内容可能会根据实验的目的和实际情况进行调整。

蓝桥云课ROS机器人旧版实验报告-05导航功能进阶实验流程可能包括以下步骤:

  1. 导入机器人硬件设备的CAD模型:使用CAD软件(如SolidWorks、AutoCAD等)导入机器人的硬件设备的CAD模型,并导出为stl文件格式。
  2. 创建机器人仿真环境:在Gazebo中创建一个新的仿真环境,并设置仿真器的物理引擎、时间步长、传感器等参数。
  3. 导入机器人模型:将机器人的CAD模型导入到Gazebo中,并设置机器人的几何结构、运动学模型、动力学模型等。
  4. 编写机器人控制程序:使用ROS编写机器人的控制程序,包括机器人的运动控制、传感器数据采集等。
  5. 模拟传感器数据:在Gazebo中模拟机器人的传感器数据,如激光雷达、摄像头、GPS等,并将传感器数据输出到ROS中。
  6. 可视化机器状态和传感器数据:使用ROS的可视化工具,如rqt_plot、rqt_image等,将机器人的状态和传感器数据可视化。
  7. 调试和优化:根据实验结果进行调试和优化,包括机器人的控制策略、传感器数据的处理等。
  8. 实验评估:对实验结果进行评估,包括机器人的运动精度、传感器数据的准确性等。

以上是蓝桥云课ROS机器人旧版实验报告-05导航功能进阶实验流程的一个大致框架,具体步骤和流程可能会根据实验的目的和实际情况进行调整。

蓝桥云课ROS机器人旧版实验报告-05导航功能核心要点总结如下:

  1. 导航系统介绍:介绍导航系统的概念、组成、功能和实现方式。
  2. 地图构建:介绍如何使用ROS的地图构建工具,如SLAM、Map再将等,构建机器人的地图。
  3. 导航策略:介绍常见的导航策略,如A*、D*、Potential Field等,并介绍如何在ROS中实现这些策略。
  4. 机器人定位:介绍常见的机器人定位方法,如GPS、IMU、Visual Odometry等,并介绍如何在ROS中实现这些定位方法。

以上是蓝桥云课ROS机器人旧版实验报告-05导航功能核心要点的总结,掌握这些内容可以帮助学生在ROS中实现机器人的导航功能,包括地图构建、导航策略和机器人定位等。

在使用阿克曼模型进行移动机器人导航时,需要注意以下细节:

  1. 机器人模型的选择和参数设置:阿克曼模型是一种非完整约束的机器人模型,需要考虑机器人的几何参数(如轮距、轮速等)和动力学参数(如摩擦系数、电机响应时间等),并进行合理的设置。
  2. 运动控制策略:阿克曼模型是一种基于反馈的控制模型,需要设计合适的控制策略,如基于PID控制器、滑模控制器等,来保证机器人的稳定性和跟踪性能。
  3. 路径规划:在使用阿克曼模型进行导航时,需要为机器人规划一条合理的路径,使其能够从起点到达终点。这可以通过使用全局路径规划算法(如A算法、D算法等)或局部路径规划算法(如动态规划、滑模控制等)来实现。
  4. 传感器数据采集和处理:机器人需要使用传感器来获取环境信息,如激光雷达、摄像头、GPS等。需要对传感器数据进行预处理和滤波,以减少噪声和误差。
  5. 导航精度和稳定性:在使用阿克曼模型进行导航时,需要考虑模型的精度和稳定性。可以通过实验和调试来评估模型的性能,并进行优化和调整。
  6. 实时性能:导航系统需要实时响应机器人的运动状态和环境变化。在实现导航系统时,需要考虑算法的时间复杂度和实时性能,以确保系统的响应速度和稳定性。

综上所述,使用阿克曼模型进行移动机器人导航需要综合考虑机器人的模型、控制策略、路径规划、传感器数据采集和处理、导航精度和稳定性以及实时性能等因素,以确保机器人的导航效果和性能。

在ROS中仿真使用阿克曼模型的移动机器人导航时,需要注意以下细节:

  1. 机器人模型的建立和参数设置:在ROS中仿真使用阿克曼模型,需要建立机器人的模型,并设置好机器人的几何参数和动力学参数。可以使用ROS中的机器人描述文件(URDF或XML文件)来描述机器人模型,并使用ROS中的参数服务器来设置机器人的参数。
  2. 仿真环境的搭建和模拟器选择:在ROS中仿真使用阿克曼模型的移动机器人导航,需要搭建仿真环境,并选择合适的模拟器。常见的模拟器包括Gazebo、V-REP、ROS Robot Simulation等。
  3. 传感器数据的模拟和采集:在仿真环境中,需要模拟机器人的传感器数据,如激光雷达、摄像头、GPS等。可以使用ROS中的传感器模拟器来模拟传感器数据,并使用ROS中的消息传递机制来采集传感器数据。
  4. 控制算法的实现和调试:在ROS中实现控制算法通常使用ROS中的节点(Node)来实现。需要编写控制算法的节点,并使用ROS中的消息传递机制来与仿真环境和传感器数据进行交互。在进行调试时,可以使用ROS的调试工具,如rqt_console和rqt_graph等。
  5. 路径规划和导航算法的选择:在ROS中实现路径规划和导航算法,可以使用ROS中的导航包(Navigation Stack)。导航包提供了常用的路径规划和导航算法,如A算法、D算法等。可以根据实际需求选择合适的算法,并进行适当的配置和参数设置。
  6. 可视化和数据记录:在ROS中可以使用ROS中的可视化工具(Visualization Tools)来可视化机器人的运动和环境变化。还可以使用ROS中的日志记录工具(Logging Tools)来记录仿真过程中的的数据,以便后续分析和处理。

综上所述,在ROS中仿真使用阿克曼模型的进行移动机器人导航需要注意机器人的模型的建立和参数设置、仿真环境的搭建和模拟器选择、传感器数据的模拟和采集、控制算法的实现和调试、路径规划和导航算法的选择,以及可视化和数据记录等方面的。同时,需要熟悉ROS的架构和编程规范,以便更好地实现和调试导航系统。

这类问题AI解决不是特别擅长的

以下是在ROS中仿真使用阿克曼模型的移动机器人导航的示例代码:

# 导入必要的ROS包  
import rospy  
from std_msgs.msg import String  
from geometry_msgs.msg import Pose  
from nav_msgs.msg import OccupancyGrid  
from sensor_msgs.msg import LaserScan  
  
# 定义机器人的初始位置和方向  
start_pose = Pose(x=0.0, y=0.0, z=0.0, roll=0.0, pitch=0.0, yaw=0.0)  
  
# 定义机器人的激光传感器数据  
laser_scan_data = []  
for i in range(360):  
    laser_scan_data.append(100)  
  
# 定义机器人的地图  
map_data = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],  
            [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],  
            [1, 0, 1, 1, 1, 1, 1, 1, 0, 1],  
            [1, 0, 1, 0, 0, 0, 0, 0, 0, 1],  
            [1, 0, 1, 0, 0, 0, 0, 0, 0, 1],  
            [1, 0, 1, 0, 0, 0, 0, 0, 0, 1],  
            [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],  
            [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],  
            [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]  
  
# 发布机器人的位置和地图数据  
pub_pose = rospy.Publisher('/robot_pose', Pose, queue_size=10)  
pub_map = rospy.Publisher('/map', OccupancyGrid, queue_size=10)  
  
# 设置ROS节点的循环时间  
rospy.init_node('nav_test', anonymous=True)  
rate = rospy.Rate(10) # 10hz  
  
# 在ROS中循环发布机器人的位置和地图数据  
while not rospy.is_shutdown():  
    # 设置机器人的位置和方向  
    current_pose = Pose(x=start_pose.x+0.5, y=start_pose.y+0.5, z=start_pose.z+0.5,\  
                       roll=start_pose.roll+rospy.Time.now().to_sec(),\  
                       pitch=start_pose.pitch+rospy.Time.now().to_sec(),\  
                       yaw=start_pose.yaw+rospy.Time.now().to_sec())  
    # 将机器人的位置数据发布到ROS中  
    pub_pose.publish(current_pose)  
    # 设置机器人的激光传感器数据  
    laser_scan = LaserScan()  
    laser_scan.header.frame_id = "base_link"  
    laser_scan.angle_min = -180.0  
    laser_scan.angle_max = 180.0  
    laser_scan.angle_increment = -360/(len(laser_scan_data))  
    laser_scan.time_stamp = rospy.Time.now()  
    laser_scan.range_min = -3.5  
    laser_scan.range_max = 3.5
laser_scan.data = laser_scan_data  
    # 将机器人的激光传感器数据发布到ROS中  
    pub_laser_scan.publish(laser_scan)  
    # 设置机器人的地图数据  
    map_msg = OccupancyGrid()  
    map_msg.header.frame_id = "map"  
    map_msg.info.resolution = 1  
    map_msg.info.width = len(map_data[0])  
    map_msg.info.height = len(map_data)  
    map_msg.info.origin.position.x = 0  
    map_msg.info.origin.position.y = 0  
    map_msg.info.origin.position.z = 0  
    map_msg.info.origin.orientation.x = 0  
    map_msg.info.origin.orientation.y = 0  
    map_msg.info.origin.orientation.z = 0  
    map_msg.info.origin.orientation.w = 1  
    map_msg.data = map_data  
    # 将机器人的地图数据发布到ROS中  
    pub_map.publish(map_msg)  
      
    # 按照设定的循环率进行ROS节点的循环  
    rate.sleep()

以上是在ROS中仿真使用阿克曼模型的移动机器人导航的示例代码。这个代码示例假设机器人有一个激光传感器和一个全局地图,并将它们发布到ROS中。同时,它还发布了机器人的位置和方向数据。在此基础上,你可以根据实际需求添加更多的功能和组件,如局部地图、SLAM算法、路径规划等。 


 

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

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

相关文章

Jenkins工具系列 —— 插件 实现用户权限分配与管理

文章目录 安装插件 Role-based Authorization Strategy添加用户注册配置权限查看当前使用者&#xff0c;获取user id配置管理员权限配置普通用户权限&#xff08;非管理员权限&#xff09; 小知识 安装插件 Role-based Authorization Strategy 点击 左侧的 Manage Jenkins —&…

[LeetCode]只出现一次的数字相关题目(c语言实现)

文章目录 LeetCode136. 只出现一次的数字ⅠLeetCode137. 只出现一次的数字 IILeetCode260. 只出现一次的数字 IIILeetCode268. 丢失的数字 LeetCode136. 只出现一次的数字Ⅰ 题目: 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元…

使用MyBatis(2){使用myBatis操作增删改查/动态SQL}

目录 一、定义接口、实体类、创建XML文件实现接口&#xff09; 二、MyBatis的增删改查 &#x1f345;1、MyBatis传递参数查询 &#x1f388;写法一 &#x1f388;写法二 &#x1f388;两种方式的区别 &#x1f345;2、删除操作 &#x1f345;3、根据id修改用户名 &#…

Java 基础进阶总结(一)反射机制学习总结

文章目录 一、初识反射机制1.1 反射机制概述1.2 反射机制概念1.3 Java反射机制提供的功能1.4 反射机制的优点和缺点 二、反射机制相关的 API2.1 一、初识反射机制 1.1 反射机制概述 JAVA 语言是一门静态语言&#xff0c;对象的各种信息在程序运行时便已经确认下来了&#xff0…

延长周末体验感

延长周末体验感 写在最前面周末的时间规划题外话善解人意的chatgpt 提升周末体验感的好方法随机选择一个周末活动 怎样才能获得充分的休息 写在最前面 话题征文~ https://activity.csdn.net/creatActivity?id10533&spm1011.2432.3001.9644 工作以后常常容易感到疲于奔命…

python简单小游戏代码100行,python小游戏程序源代码

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python简单小游戏代码100行&#xff0c;python小游戏代码能用的&#xff0c;现在让我们一起来看看吧&#xff01; Python编写简易猜数字小游戏&#xff08;附完整代码&#xff09; 猜数字游戏是一款非常经典的小游戏&am…

AD21 PCB设计的高级应用(九)3D PDF的输出

&#xff08;九&#xff09;3D PDF的输出 1.3D PDF的输出2.制作PCB 3D视频 1.3D PDF的输出 Altium Designer 19 带有 3D输出功能,能够直接将 PCB 的 3D效果输出到 PDF 中。 ’(1)打开带有 3D 模型的 PCB 文件,执行菜单栏中“文件”→“导出”→“PDF3D”命令&#xff0c;选择…

P1419 寻找段落(二分答案)(内附封面)

寻找段落 题目描述 给定一个长度为 n n n 的序列 a a a&#xff0c;定义 a i a_i ai​ 为第 i i i 个元素的价值。现在需要找出序列中最有价值的“段落”。段落的定义是长度在 [ S , T ] [S, T] [S,T] 之间的连续序列。最有价值段落是指平均值最大的段落。 段落的平均值…

SpringBoot整合TrueLicense生成和验证License证书

一 License介绍 License&#xff0c;也就是版权许可证书&#xff0c;一般用于收费软件给付费用户提供的访问许可证明。根据应用部署位置的不同&#xff0c;一般可以分为以下几种情况讨论&#xff1a; 应用部署在开发者自己的云服务器上。这种情况下用户通过账号登录的形式远程…

Halcon——在C#中各数据类型的相互转换

Halcon——在C#中各数据类型的相互转换 前言一、HObject to1.HObject to HImage 二、HTuple to1.HTuple to Int2.HTuple to Double3.HTuple to String4.HTuple to long5.HTuple to object6.HTuple to Arr 总结 前言 用c#进行Halcon代码转换的时候&#xff0c;虽然有halcon自带…

Python基础语法-梳理的几个知识点

1.书写格式 不需要声明变量类型&#xff0c;因为 在python中&#xff0c;变量为弱类型变量&#xff0c;Python解析器根据值自动匹配变量类型分支结构、循环结构中的条件表达式&#xff0c;不需要用小括号括起来执行语句体不需要大括号括起来&#xff0c;而是用冒号代替 2.格式…

GRNN神经网络原理与matlab实现

1案例背景 1.1GRNN神经网络概述 广义回归神经网络(GRNN Generalized Regression Neural Network&#xff09;是美国学者 Don-ald F. Specht在1991年提出的,它是径向基神经网络的一种。GRNN具有很强的非线性映射能力和柔性网络结构以及高度的容错性和鲁棒性,适用于解决非线性问…

使用 JMeter 进行压力测试

一.前言 压力测试是每一个Web应用程序上线之前都需要做的一个测试&#xff0c;他可以帮助我们发现系统中的瓶颈问题&#xff0c;减少发布到生产环境后出问题的几率&#xff1b;预估系统的承载能力&#xff0c;使我们能根据其做出一些应对措施。所以压力测试是一个非常重要的步…

套接字通信(C/C++ 多线程)----基于线程池的并发服务器

&#xff08;一&#xff09;大家可以看我写的这三篇&#xff0c;了解一下&#xff1a; 基于linux下的高并发服务器开发&#xff08;第四章&#xff09;- 多线程实现并发服务器_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://blog.csdn.net/weixin_4198701…

Jmeter如何添加插件

一、前言 ​ 在我们的工作中&#xff0c;我们可以利用一些插件来帮助我们更好的进行性能测试。今天我们来介绍下Jmeter怎么添加插件&#xff1f; 2023最新Jmeter接口测试从入门到精通&#xff08;全套项目实战教程&#xff09; 二、插件管理器 ​ 首先我们需要下载插件管理器j…

一个完整的http请求响应过程

一、 HTTP请求和响应步骤 图片来自&#xff1a;理解Http请求与响应 以上完整表示了HTTP请求和响应的7个步骤&#xff0c;下面从TCP/IP协议模型的角度来理解HTTP请求和响应如何传递的。 二、TCP/IP协议 TCP/IP协议模型&#xff08;Transmission Control Protocol/Internet Pr…

04、并发用户数该怎么计算

什么是并发&#xff1f; 我们假设上图中的这些小人是严格按照这个逻辑到达系统的&#xff0c;那显然&#xff0c;系统的绝对并发用户数是 4。如果描述 1 秒内的并发用户数&#xff0c;那就是 16。是不是显而易见&#xff1f;但是&#xff0c;在实际的系统中&#xff0c;用户通常…

若依框架 - 对二次封装数据分页

LsDistrictController /*** 查询地段列表*/ApiOperation("查询地段列表")GetMapping("/list")public TableDataInfo list(LsDistrict lsDistrict) {startPage();Map<String, List> map lsDistrictService.selectLsDistrictList(lsDistrict);if (Col…

java类和对象详解(1)

面向对象的初步认知 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program, 简称OOP),在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。 用面向对象的思想来涉及程序&#xff0c;更…