运动路径规划,ROS发布期望运动轨迹

目录

一、Python实现(推荐方法)

1.1代码cubic_spline_path.py

1.2使用方法

 二、C++实现

参考博客


想让机器人/智能车无人驾驶,要有期望路径,最简单的是一条直线,或者是一条光滑曲线。

生成路径的方法有两种:

  1. 手动遥控机器人运动一段路径,并保存轨迹
  2. 人为设定几个关键点,拟合出直线或曲线

方法1通常是根据GNSS/INS位姿数据记录轨迹,可参考ROS之rviz显示GNSS/INS运动轨迹_可见一班的博客-CSDN博客

方法2是这篇博客讨论的内容。分别使用C++和Python在ROS下实现。

一、Python实现(推荐方法)

1.1代码cubic_spline_path.py

根据指定的插值算法 alg,创建一个插值函数 cubic_spline。如果 alg 为 “linear”,则使用线性插值函数 interp1d 创建插值函数;如果 alg 为 “cubic”,则使用三次样条插值函数 interp1d 创建插值函数。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import rospy
import rosparam
from nav_msgs.msg import Path
from geometry_msgs.msg import PoseStamped
import sys
import os
import yaml
import numpy as np
from scipy.interpolate import interp1d

# def interpolation(waypoint_list, alg="cubic"):
def interpolation(alg="linear"):
    ix = []
    iy = []

    temp_x = np.array([1,5,8,10])
    temp_y = np.array([1,4,9,10])
        
    cubic_spline = None
    if alg == "linear":
        cubic_spline = interp1d(temp_x, temp_y)
    elif alg == "cubic":
        cubic_spline = interp1d(temp_x, temp_y, kind='cubic')

    waypoint_x_start = temp_x[0]
    waypoint_x_end = temp_x[-1]
    length = int(abs(waypoint_x_end - waypoint_x_start) / 0.01)
    print(length)
    ix = np.linspace(waypoint_x_start, waypoint_x_end, num=length)
    iy = cubic_spline(ix)

    return ix, iy


if __name__ == '__main__':
    rospy.init_node("cubic_spline_path")

    waypoint_x, waypoint_y = interpolation()

    path_pub = rospy.Publisher('/spline_path', Path, queue_size=10)

    path = Path()
    for index in range(len(waypoint_x)):
        pose = PoseStamped()
        pose.pose.position.x = waypoint_x[index]
        pose.pose.position.y = waypoint_y[index]
        print(pose)
        path.poses.append(pose)
    path.header.frame_id = "map"
    path.header.stamp = rospy.Time.now()

    rate = rospy.Rate(10)
    while not rospy.is_shutdown():
        path_pub.publish(path)
        rate.sleep()
    rospy.spin()

1.2使用方法

  1. 在ROS工作空间中新建文件夹scripts
  2. 新建.py文件,复制上述代码
  3. 更改文件权限允许作为程序执行
  4. 终端执行 ./cubic_spline_path.py
  5. 打开rviz,订阅spline_path话题显示路径

 

 二、C++实现

 直线插值比较简单,三次样条插值比较复杂。

主函数中调用这个函数即可,传入参数为A、B点x,y坐标值,返回nav_msgs::Path路径。

// 线性插值路径
nav_msgs::Path LinearInterpolation(const double &Ax, const double &Ay, const double &Bx, const double &By, const double &stepsize)
{

  double x1 = Ax;
  double y1 = Ay;
  double z1 = 0;
  double x2 = Bx;
  double y2 = By;
  double z2 = 0;

  double step_size = stepsize;

  double dist = std::sqrt(std::pow((x2 - x1), 2) + std::pow((y2 - y1), 2) + std::pow((z2 - z1), 2));
  int num_steps = dist / step_size;

  for (int i = 0; i < num_steps; ++i)
  {
    double ratio = static_cast<double>(i) / num_steps;

    geometry_msgs::PoseStamped interpolated_pose;
    interpolated_pose.header.frame_id = "map";
    interpolated_pose.header.stamp = ros::Time::now();
    interpolated_pose.pose.position.x = x1 + ratio * (x2 - x1);
    interpolated_pose.pose.position.y = y1 + ratio * (y2 - y1);
    interpolated_pose.pose.position.z = z1 + ratio * (z2 - z1);

    interpolated_pose.pose.orientation.x = 1;
    interpolated_pose.pose.orientation.y = 0;
    interpolated_pose.pose.orientation.z = 0;
    interpolated_pose.pose.orientation.w = 0;

    scatter_path.poses.push_back(interpolated_pose);
  }

  return scatter_path;
}

参考博客

【运动规划算法项目实战】路径规划中常用的插值方法(附ROS C++代码)_路径插值

【运动规划算法项目实战】如何使用Pure Pursuit算法进行路径跟踪(附ROS C++代码)

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
蚁群算法是一种基于蚁群寻食行为的启发式算法,可以在路径规划问题中找到较优解。ROS机器人操作系统)是一个用于开发机器人应用程序的开源框架。要实现蚁群算法路径规划,可以结合ROS提供的机器人控制和仿真工具,实现一个基于蚁群算法的路径规划程序。 首先,需要在ROS中创建一个适合路径规划的仿真场景或者真实环境。可以使用ROS提供的仿真工具,如Gazebo,建立一个包含障碍物和目标点的环境。然后,需要编写一个ROS节点,用于实现蚁群算法的路径规划。这个节点可以使用C++或者Python编写,通过ROS的通信机制与其他节点进行数据交换。 接着,需要实现蚁群算法的逻辑。在蚁群算法中,蚂蚁会根据信息素的浓度选择路径,并在路径上释放信息素,从而影响其他蚂蚁的选择。在路径规划中,可以将地图上的每个点看作一个节点,蚂蚁在节点间移动并释放信息素。节点间信息素浓度的更新和路径的选择规则是蚁群算法的关键,可以根据实际情况进行调整和优化。 最后,需要将蚁群算法路径规划的结果应用到机器人控制中。可以使用ROS提供的导航功能包,将蚁群算法找到的路径应用到机器人运动控制中,实现机器人在环境中的路径规划和移动。同时,还可以通过ROS的可视化工具,如Rviz,实时可视化机器人路径规划和移动过程。 通过以上步骤,就可以在ROS中实现蚁群算法路径规划,让机器人能够根据蚁群算法找到较优的路径,并在环境中进行自主移动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可见一班

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值