ROS小车设置一系列导航点,使其沿着规划路径直线行驶

您所在的位置:网站首页 地图怎么设定路线 ROS小车设置一系列导航点,使其沿着规划路径直线行驶

ROS小车设置一系列导航点,使其沿着规划路径直线行驶

2024-06-26 12:44| 来源: 网络整理| 查看: 265

前言

ROS系统内置了许多建图以及导航节点,在导航时我们通过拖拽箭头的方式实现目的地的设置,那么能不能通过程序写入一系列导航点,让小车依次沿着这些点前行呢?

基础知识

ROS中使用action传递导航目的点,可以通过该博文看看action的基础知识。在这个博文里面已经实现了给定若干个坐标点,小车依次走过这些点。 本文在该基础上加上了走直线功能,举例说明。若想要小车依次走过三个坐标点a b c,按照上面的博客,a到b的小车路径是不可控的,b到c的同样如此,本文将实现小车导航到a点后,沿直线ab走到b,再沿直线bc走到c。

代码 #include #include #include #include #include #include #include using namespace std; #define step_line 0.3 //单位m,每隔0.3m设置一个导航点 typedef actionlib::SimpleActionClient MoveBaseClient; typedef geometry_msgs::PointStamped Point; move_base_msgs::MoveBaseGoal goal[100];//导航点数组 //函数输入为线段的起始点和终点,以及前面已设置的导航点个数,输出为加上该直线当前已设置的导航点个数 int common_line(move_base_msgs::MoveBaseGoal origin, move_base_msgs::MoveBaseGoal end, int begin){ int num = ceil(sqrt(pow(origin.target_pose.pose.position.x-end.target_pose.pose.position.x,2)+pow(origin.target_pose.pose.position.y-end.target_pose.pose.position.y,2))/step_line);//通过线段长度计算所需要的导航点个数,实际个数为num加一 goal[begin] = origin; goal[num+begin] = end; int i = begin + 1; double yaw; geometry_msgs::Quaternion q; double x1 = origin.target_pose.pose.position.x; double y1 = origin.target_pose.pose.position.y; double x2 = end.target_pose.pose.position.x; double y2 = end.target_pose.pose.position.y;//提取起始点和终点的横纵坐标 //根据线段在二维坐标轴中的具体位置,计算线段上的点的坐标以及导航需要的朝向,间距为0.3m,并将这些坐标放入goal数组 if(x1==x2){ if(y1>y2){ yaw = -M_PI/2; q = tf::createQuaternionMsgFromRollPitchYaw(0,0,yaw); goal[begin].target_pose.pose.orientation = q; goal[num+begin].target_pose.pose.orientation = q; for(; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3