ros小车固定路径导航并且遇到障碍停止

一.思路

        固定路径导航的思路以及源码来自于这位博主,我只是在他的代码基础上进行了移植。

ROS中编写自己全局路径规划插件实现固定路线规划(2)_ros中实现固定路径规划-优快云博客

遇见障碍物停止则是在move_base与小车底盘节点中增加了一个节点来对不同的cmd_vel进行处理,再发布给地盘。

二.实现流程

1.首先根据博主的教程编写read_road以及save_road两个节点,第二个用来保存你的固定路径,第一个则是用来在导航运行时读取固定路径。

2.随后编写固定路径的全局规划器,并且在package.xml中对自己的全局路劲进行注册。随后运行命令查看一下是否修改成功。由于具体过程都在上面的链接中,我就不再赘述。需要注意的是要在cmaklist里面将源代码cpp文件添加进去

3.编写速度控制节点,如下。可以根据自己的需求进行更改

import rospy
import os
import subprocess
from sensor_msgs.msg import LaserScan
from geometry_msgs.msg import Twist

class ObstacleAvoidance:
    def __init__(self):
        self.move_cmd = Twist()
        self.pub1 = rospy.Publisher('/cmd_vel1', Twist, queue_size=1)
        self.sub = rospy.Subscriber('/scan', LaserScan, self.callback)

    def callback(self, msg):
        if min(msg.ranges)<1.5:
            self.move_cmd.linear.x = 0
            self.move_cmd.angular.z = 0
            print("停止前进,因为检测到障碍物在1.5米内")
        else:
            self.move_cmd.linear.x = 0.05
            self.move_cmd.angular.z = 0.05
            print("前进,因为没有检测到近距离的障碍物")
        self.pub1.publish(self.move_cmd)
        #print("发布速度命令")

class CmdVelCoordinator:
    def __init__(self):
        self.your_cmd = None
        self.move_base_cmd = None
        self.final_cmd = Twist()

        self.pub = rospy.Publisher('/cmd_vel2', Twist, queue_size=1)

        rospy.Subscriber('/cmd_vel1', Twist, self.your_cmd_callback)
        rospy.Subscriber('/cmd_vel', Twist, self.move_base_cmd_callback)

    def your_cmd_callback(self, msg):
        self.your_cmd = msg
        

    def move_base_cmd_callback(self, msg):
        self.move_base_cmd = msg
        

    def publish_cmd(self):
        rate = rospy.Rate(10)
        while not rospy.is_shutdown():
            if self.your_cmd and self.your_cmd.linear.x == 0.0 and self.your_cmd.angular.z == 0.0:
                self.final_cmd = self.your_cmd
                print("发布停止速度")
                command = ["mplayer", ma3_file]
                subprocess.call(command)
            elif self.move_base_cmd:
                self.final_cmd = self.move_base_cmd
                print("x:%f",self.final_cmd.linear.x)
                print("z:%f",self.final_cmd.angular.z)
                print("发布movebase速度")

            self.pub.publish(self.final_cmd)
            rate.sleep()

if __name__ == '__main__':
    rospy.init_node('coordinator_avoidance_node')

    avoidance = ObstacleAvoidance()
    coordinator = CmdVelCoordinator()
    coordinator.publish_cmd()
        
    rospy.spin()

4.按照你写的脚本修改底盘订阅的cmd_vel,因为修改move_base发布的需要在源代码修改,比较麻烦,所以直接修改小车底盘订阅的速度。应该修改为以下你发布的cmd_vel2。

self.final_cmd = Twist()

self.pub = rospy.Publisher('/cmd_vel2', Twist, queue_size=1)

这样就能实现小车在使用固定路径导航能够碰见障碍物停下来而不是避开他的功能。

三.运行

在运行时,打开三个终端,一个终端运行导航节点,一个终端运行read_road节点,一个终端运行速度发布脚本。

ROS系统中实现小车路径规划与导航时,速度的设置与规划是导航栈(navigation stack)配置的重要组成部分。ROS导航功能主要依赖于`move_base`包,其中包含了全局路径规划器(global planner)和局部路径规划器(local planner),而局部路径规划器通常使用Trajectory Rollout或DWA(Dynamic Window Approach)算法来生成机器人运动的速度指令[^3]。 ### 速度设置方法 1. **配置`move_base`参数文件** 在导航配置中,速度相关参数通常定义在`move_base`的配置文件中,例如`base_local_planner_params.yaml`。以下是常见的速度参数设置示例: ```yaml TrajectoryPlannerROS: max_vel_x: 0.5 # 最大线速度(m/s) min_vel_x: 0.1 # 最小线速度(m/s) max_vel_theta: 1.0 # 最大角速度(rad/s) min_vel_theta: -1.0 # 最小角速度(rad/s) acc_lim_x: 0.5 # 线加速度限制(m/s²) acc_lim_theta: 1.0 # 角加速度限制(rad/s²) ``` 2. **动态调整速度** 使用`dynamic_reconfigure`工具可以在运行时动态调整速度参数,而无需重启导航节点。通过创建一个`cfg`配置文件并注册速度参数,用户可以在ROS的`rqt_reconfigure`界面中实时修改速度限制。 3. **基于传感器数据调整速度** 在避障或复杂环境中,可以根据传感器数据(如激光雷达、红外传感器)反馈的距离信息动态调整速度。例如,当检测到前方障碍物距离较近时,自动降低线速度以增加反应时间[^2]。 4. **路径跟踪与速度优化** 在局部规划器中,Trajectory Rollout算法会根据当前速度、加速度限制以及目标路径的曲率等因素生成最优的速度指令。用户可以通过调整`sim_time`(模拟时间)和`sim_granularity`(模拟粒度)等参数优化速度输出。 ### 速度规划策略 - **恒定速度模式**:适用于结构化环境,如工厂车间,路径清晰且障碍物少。 - **自适应速度模式**:根据环境复杂度和传感器反馈动态调整速度,适用于动态或未知环境。 - **基于行为的速度控制**:结合避障、路径跟踪等行为模块,通过状态机切换不同速度策略。 ### 实现示例 以下是一个启动`move_base`并加载速度配置的`launch`文件示例: ```xml <launch> <node name="move_base" pkg="move_base" type="move_base" output="screen"> <rosparam file="$(find your_robot_description)/params/costmap_common_params.yaml" command="load" ns="global_costmap" /> <rosparam file="$(find your_robot_description)/params/costmap_common_params.yaml" command="load" ns="local_costmap" /> <rosparam file="$(find your_robot_description)/params/local_planner_params.yaml" command="load"/> <param name="base_global_planner" value="global_planner/GlobalPlanner"/> </node> </launch> ``` 通过上述配置,可以实现对ROS小车路径规划与导航过程中的速度控制与优化。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值