从零实现机器人自主避障

news/2025/2/24 20:21:48

1. 编译工具安装

sudo apt update
sudo apt install python3-catkin-pkg python3-rosdep python3-rosinstall-generator python3-wstool python3-rosinstall build-essential
sudo rosdep init
rosdep update

在这里插入图片描述

2. 构建节点

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
ros2 pkg create turtlebot_suo --build-type ament_python --dependencies rclpy sensor_msgs geometry_msgs

touch turtlebot_suo/turtlebot_suo/ob_avoid.py
chmod +x turtlebot_suo/turtlebot_suo/ob_avoid.py
# setup.py中定义ros2 run的入口
	entry_points={
	    'console_scripts': [
	        'ob_avoid = turtlebot_suo.ob_avoid:main',
	    ],
	},
cd ~/ros2_ws
colcon build --packages-select turtlebot_suo
source install/setup.bash

在这里插入图片描述

3. 避障程序


#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import LaserScan
from geometry_msgs.msg import Twist

class ObstacleAvoidance(Node):
    def __init__(self):
        super().__init__('ob_avoid')
        self.publisher_ = self.create_publisher(Twist, 'cmd_vel', 10)
        self.subscription_ = self.create_subscription(LaserScan,'scan',self.laser_scan_callback,10)
        self.subscription_  
    def laser_scan_callback(self, msg):
        # 获取前方90度范围内的最小距离
        front_range = msg.ranges[0:45] + msg.ranges[-45:]
        min_distance = min(front_range)
		# 避障逻辑
        cmd_msg = Twist()
        if min_distance < 0.5:
            # 障碍物距离小于0.5米时左转
            cmd_msg.angular.z = 0.5
            self.get_logger().info('# 障碍物距离小于0.5米,左转.')
        else:
            # 默认按固定速度直行
            cmd_msg.linear.x = 0.2
        self.publisher_.publish(cmd_msg)

def main(args=None):
    rclpy.init(args=args)
    node = ObstacleAvoidance()
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        pass
    finally:
        node.destroy_node()
        rclpy.shutdown()

if __name__ == '__main__':
    main()

4. 效果

# 启动Gazebo仿真
roslaunch turtlebot3_gazebo turtlebot3_world.launch
# 启动避障节点(新终端)
ros2 run turtlebot_suo ob_avoid

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


http://www.niftyadmin.cn/n/5864786.html

相关文章

mysql之B+ 树索引 (InnoDB 存储引擎)机制

b树索引机制 B 树索引 (InnoDB 存储引擎)机制**引言&#xff1a;****1. 数据页结构与查找**2. 索引的引入**3. InnoDB 的 B 树索引****4. InnoDB B 树索引的注意事项****5. MyISAM 的索引方案 (选读&#xff0c;与 InnoDB 做对比)****6. MySQL 中创建和删除索引的语句** **B 树…

使用Socket编写超牛的http服务器和客户端(二)

客户端 动态扩展连接池、线程池优雅关闭、超时机制、健康检查等功能,并将代码模块化: 文件结构 HTTPClientProject/ ├── ConnectionPool.h ├── ConnectionPool.cpp ├── TaskQueue.h ├── ThreadPool.h ├── main.cpp 工程代码主要分为以下几个模块: Connectio…

go执行java -jar 完成DSA私钥解析并签名

起因&#xff0c;最近使用go对接百度联盟api需要使用到DSA私钥完成签名过程&#xff0c;在百度提供的代码示例里面没有go代码的支持&#xff0c;示例中仅有php、python2和3、java的代码&#xff0c;网上找了半天发现go中对DSA私钥解析支持不友好&#xff0c;然后决定使用在java…

微信小程序页面导航与路由:实现多页面跳转与数据传递

在上一篇中&#xff0c;我们学习了微信小程序的数据绑定和事件处理&#xff0c;实现了动态交互功能。然而&#xff0c;一个完整的小程序通常由多个页面组成&#xff0c;用户需要在不同页面之间进行跳转。本文将深入探讨微信小程序的页面导航与路由机制&#xff0c;帮助你实现多…

leetcode_位运算 2206. 将数组划分成相等数对

2206. 将数组划分成相等数对 给你一个整数数组 nums&#xff0c;它包含 2 * n 个整数。 你需要将 nums 划分成 n 个数对&#xff0c;满足&#xff1a; 每个元素 只属于一个数对。同一数对中的元素相等 。如果可以将 nums 划分成 n 个数对&#xff0c;请你返回 true &#xff0…

BOOST电路设计

目录 1电路模型 2器件选型 2.1设计需求 2.2参数计算 2.2.1电感L计算 2.2.2电容计算 2.2.3电阻计算 3仿真测试 4参数测试 4.1负载调整率 4.2电容测试 4.3电感测试 5实际应用 1电路模型 Boost升压电路,可以工作在电流断续工作模式(DCM)和电流连续工作模式(CCM)。CCM工…

LeetCodehot 力扣热题100 课程表

题目背景 这个问题要求我们判断是否可以完成所有课程的学习。每门课程可能依赖其他课程作为前置课程&#xff0c;构成了一个有向图。我们需要确定是否存在环&#xff0c;若存在环&#xff0c;说明课程之间互相依赖&#xff0c;无法完成所有课程&#xff1b;如果不存在环&#x…

RFID涉密载体柜:智能安全,全程守护,提供智能化的安全管控

行业背景 RFID智能载体柜&#xff08;DW-G101&#xff09;是一种便捷化的载体管控系统&#xff0c;它采用RFID技术实现信息化&#xff0c;可以大大提高载体管理的效率和准确性。 随着信息化的快速发展&#xff0c;涉密载体&#xff08;如文件、U盘、光盘等&#xff09;的管理…