ROS联合webots扩展(一)设定目标点进行导航

本文档介绍了如何通过ROS程序设定导航目标点,避免手动在Rviz中设置2DNavGoal。作者在尝试网上教程无果后,发现/move_base_simple/goal是2DNavGoal的发布topic,通过发布geometry_msgs/PoseStamped消息来设定目标点。在Webots中获取坐标后,创建了一个名为robot_set_goals.cpp的节点,该节点根据接收到的房间名设定目标点,并通过rostopic pub发布目标。经过测试,实现了通过编程方式控制机器人的自动导航。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设定目标点进行导航

注意:

  • 再学习本系列教程时,应该已经安装过ROS了并且需要有一些ROS的基本知识
  • 此教程以webots_demo为基础
    ubuntu版本:20.04
    webots版本:2021a
    ros版本:noetic
    为了能和读者进一步讨论问题,建立了一个微信群,方便给大家解答问题,也可以一起讨论问题。
    加群链接

前言

平时,我们都是在Rviz中选中2D Nav Goal来设置目标点的,这很麻烦。
如果我们想象我们的环境是一个100平的房子,里面有着厨房、卧室、客厅等等,想让机器人自动到达厨房或者卧室,就必须使用程序来解决,如果我们人为在Rviz中设置目标点就不叫自动了。

1. 想法

其实第一时间我是上百度查解决方案,网上教程如出一辙:ROS之用程序设定导航目标点

但是不知为何,笔者在修改参数运行后,move_base会直接崩溃。(未解决)

如出一辙的教程无果后,只能找解决方案。

1.1 另辟蹊径

2D Nav Goal发布到哪里了,那我直接publish那个topic应该就能达到同样的效果吧。

1.2 测试环境

测试环境如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lmvDJogK-1615100863091)(1.png)]

2. 测试方法是否可行

启动顺序如下:

  1. roslaunch webots.launch 启动webots
  2. slam_base_gmapping.launch 启动机器人始能检测元件程序、RVIZ、Gmapping和move_base

启动完成后,确保机器人能正常建图。使用rostopic list查找2D Nav Goalpublish的topic。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YWEN0Zju-1615100863094)(2.png)]

最终我找到/move_base_simple/goal这个topic是2D Nav Goalpublish的topic。
可以使用如下命令查看数据类型。

$ rostopic info /move_base_simple/goal

Type: geometry_msgs/PoseStamped

Publishers: 
 * /rviz (http://mckros-GL553VD:42121/)

Subscribers: 
 * /move_base (http://mckros-GL553VD:41431/)

可以看到使用的数据类型为geometry_msgs/PoseStamped
使用如下命令查看数据geometry_msgs/PoseStamped格式。

$ rosmsg show geometry_msgs/PoseStamped

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
geometry_msgs/Pose pose
  geometry_msgs/Point position
    float64 x
    float64 y
    float64 z
  geometry_msgs/Quaternion orientation
    float64 x
    float64 y
    float64 z
    float64 w

基本了解过了一些数据类型,和我们应该publish的目标topic,接下来可以在webots中获取坐标点。

3.在webots中获取坐标

我们可以在webots中拖动机器人至想去的地方.
例如,我将机器人拖至主卧室门口,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1iQ2nKz2-1615100863096)(3.png)]

有两种方法可以查看当前位姿(注意坐标轴):

  1. 从节点树窗口中找到机器人,查看他的坐标值和旋转轴,如下图所示
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SUc3t4Jd-1615100863098)(4.png)]

  2. 使用命令rostopic echo /robot/gps/values查看机器人的坐标值,如下图所示
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YHpG3kWm-1615100863099)(5.png)]

使用命令rostopic echo /robot/inertial_unit/quaternion查看机器人的IMU数据获取旋转角度,如下图所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0w2C575q-1615100863101)(6.png)]

从上面获取的数据可以看到当前机器人所处的位姿数据:

pose.position.x = -1.3;
pose.position.y = -2.5; //这里webots中的z轴为rviz中的y轴
pose.orientation.z = 0.0016;
pose.orientation.w = -0.6538;

其他位置可以使用这种方法获取,这里就以这一个位姿进行编程

4.编程

  1. 创建一个msg名为Goalname.msg, 创建一个字符串变量,用于接收用户发送的房间名。
string goal_name  
  1. 配置CMakeList.txt
 add_message_files(
    FILES
    Goalname.msg
  )
  1. catkin_make编译
  2. 创建一个名为robot_set_goals.cpp的代码文件。将在里面编程。源代码如下(含有注释)
#include "string.h"
#include "webots_demo/Goalname.h"           // 自己新建的msg头文件
#include "geometry_msgs/PoseStamped.h"
#include "ros/ros.h"
 
using namespace std;
 
ros::NodeHandle *n;
ros::Publisher pub_goal;
void goalCallback(const webots_demo::Goalname::ConstPtr &value);

int main(int argc, char **argv) {
   
    // create a node named 'robot' on ROS network
    ros::init(argc, argv, "robot_set_goal");
    n = new ros::NodeHandle;
    ros::Subscriber sub_goal;
    sub_goal = n->subscribe("/robot/goal",1,goalCallback); //订阅用户发布的topic
    
    pub_goal = n->advertise<geometry_msgs::PoseStamped>("/move_base_simple/goal",2);
    ROS_INFO("Started success ");
    ros::spin();
}
void goalCallback(const webots_demo::Goalname::ConstPtr &value){
    int isture=0;
    string goal_name = value->goal_name;
    geometry_msgs::PoseStamped target_pose;
    target_pose.header.seq = 1;
    target_pose.header.frame_id = "map";
    
    if (goal_name == "bedroom")         // 如果用户发送了bedroom
    {
        target_pose.pose.position.x = -1.3;
        target_pose.pose.position.y = -2.5;
        target_pose.pose.orientation.z = 0.0016;
        target_pose.pose.orientation.w = -0.6538;
        isture = 1;
    }

    if (isture)
    {
        target_pose.header.stamp = ros::Time::now();
        pub_goal.publish(target_pose);  // 目标点设置为主卧并且发布目标点
        ROS_INFO("Ready to go to the goal %s",goal_name.c_str());
    }
    else
    {
        ROS_ERROR("Can't compare the goal");
    }
}
  1. 配置CMakeLists.txt,添加如下程序
add_executable(robot_set_goals src/robot_set_goals.cpp)
add_dependencies(robot_set_goals webots_ros_generate_messages_cpp)
target_link_libraries(robot_set_goals	${catkin_LIBRARIES})
  1. catkin_make编译

5.测试

  1. 运行webots
  2. 运行slam
  3. 运行robot_set_goals.cpp
  4. 向/robot/goal 发布信息如下
$ rostopic pub /robot/goal webots_demo/Goalname "goal_name: 'bedroom'" 

效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SYor0USJ-1615100863102)(1.gif)]

可能是角度没搞好,转的方向还需要调整
经过测试,良好的导航算法可以减少误差并且更加平稳。

大家可以发挥想象更好的去利用自动导航程序,比如语音控制。

结语

本文也是基于笔者的学习和使用经验总结的,主观性较强,如果有哪些不对的地方或者不明白的地方,欢迎评论区留言交流~
为了能和读者进一步讨论问题,建立了一个微信群,方便给大家解答问题,也可以一起讨论问题。
加群链接
✌Bye

此项目github地址:https://github.com/JackyMao1999/webots_demo

<think>好的,我现在需要在Ubuntu 20.04上安装ROS的move_base包。首先,我得确认ROS的版本。因为用户提到的是Ubuntu 20.04,而ROS的版本通常和Ubuntu版本对应。例如,Ubuntu 20.04对应的是ROS Noetic Ninjemys,这是ROS 1的最后个版本。用户提供的引用[1]中提到了安装teb_local_planner时使用的命令是ros-noetic-teb-local-planner,这说明他们使用的是Noetic版本。所以,我应该建议用户安装ROS Noetic的move_base包。 接下来,安装move_base包的具体步骤是什么?通常,ROS中的包可以通过apt来安装。move_base属于navigation包的部分。根据ROS的惯例,可能需要安装ros-noetic-navigation这个包,其中包含了move_base及其依赖。用户提到的引用[1]中的命令是安装teb_local_planner,类似的,安装move_base应该使用类似的命令结构,比如sudo apt install ros-noetic-navigation。不过我需要确认这个包是否确实包含move_base。查阅资料,navigation包确实包括move_base,所以这个步骤是对的。 另外,用户可能已经安装了ROS Noetic,但如果没有,他们需要先安装完整的ROS。因此,在回答中应该先确认ROS的安装情况,如果未安装,需要指导他们先安装ROS Noetic。但用户的问题直接是关于安装move_base,所以可能假设他们已经安装了ROS基础环境。但为了全面性,可能需要提及这,以防用户尚未安装ROS。 然后,安装完navigation包后,用户可能需要验证安装是否成功。可以通过检查包是否存在,或者尝试运行些测试命令。例如,使用rospack find move_base来确认路径是否存在,或者运行roscd move_base来切换到包的目录。如果有错误,可能需要进步排查。 用户提供的引用[2]中提到了move_base在导航栈中的核心作用,以及如何配置和优化。这部分可以作为安装后的补充信息,说明安装完成后如何进步配置和使用move_base,但用户当前的问题主要是安装步骤,所以这部分可以作为后续的参考,或者在相关问题中提及。 最后,需要确保用户正确执行命令,可能需要提醒他们更新apt缓存,即先运行sudo apt update,然后再安装包,以确保获取最新的软件版本。此外,如果遇到依赖问题,可能需要安装其他依赖包,但通常通过安装ros-noetic-navigation应该会解决大部分依赖。 总结步骤应该是: 1. 确认已安装ROS Noetic。 2. 更新apt缓存。 3. 安装ros-noetic-navigation包。 4. 验证安装。 此外,生成的相关问题可能涉及如何使用move_base,如何配置导航栈,或者如何处理安装中的常见问题等。</think>在 Ubuntu 20.04 上安装 ROS 的 `move_base` 包需要以下步骤: --- ### **步骤 1:确认 ROS 版本** Ubuntu 20.04 对应 ROS 的 **Noetic Ninjemys** 版本[^2]。若尚未安装 ROS Noetic,需先执行: ```bash sudo apt update sudo apt install ros-noetic-desktop-full ``` --- ### **步骤 2:安装 move_base** `move_base` 包含于 `navigation` 元功能包中。通过以下命令安装: ```bash sudo apt update sudo apt install ros-noetic-navigation ``` 此命令会安装 `move_base` 及其依赖的全局规划器、局部规划器(如 `teb_local_planner`[^1])和代价地图工具。 --- ### **步骤 3:验证安装** 1. 检查包路径: ```bash rospack find move_base ``` 若输出类似 `/opt/ros/noetic/share/move_base`,则安装成功。 2. 尝试运行测试节(需先启动 ROS 核心): ```bash roscore & rosrun move_base move_base ``` --- ### **常见问题排查** - **依赖缺失**:若安装失败,尝试修复依赖: ```bash rosdep install --from-paths src --ignore-src -r -y ``` - **环境变量未生效**:确保在 `~/.bashrc` 中添加: ```bash source /opt/ros/noetic/setup.bash ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

锡城筱凯

你的鼓励是我创造的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值