虚拟机作为master远程控制台式机中的机器人在仿真环境中进行slam地图构建与自主导航
最近有时间一直在搞Ubuntu虚拟机与台式机的通讯,想要实现不仅仅是通过ssh登陆到台式机中,通过键盘控制节点控制机器人的移动,期望的效果是把虚拟机作为MASTER,在虚拟机中能启动RVIZ等,实时的看到机器人的运动情况。
至于为什么不用向日葵,前面文章也提到了,后面要在Ubuntu环境下进行多机器人编队等功能。
第一部分是想记录下自己的摸索过程,成功实现后回头看起来也很简单,但在实际的摸索中确实是走了很多的弯路,遇到了很多的问题,这也是写csdn的初衷。
在前面成功实现了虚拟机和Ubuntu双系统中单个机器人的SLAM地图构建、机器人自主导航等功能。接着进行ROS多机通讯,开始按照(rosrobot.cn)官网对虚拟机和双系统的.bashrc
文件进行互通ip的配置,一直无法成功通讯,尝试了很久后,暂时放弃了这个思路…
之后去找以前参加传感器比赛时ssh多机通讯的资料,中间也遇到了各种各样的问题像安装ssh通讯的依赖、添加通讯密钥、(ROS_URI_MASTER/HOST_NAME)等的匹配问题,最终成功;实现了通过虚拟机连接到台式机进而控制机器人的移动(这种方法本篇就不再赘述了)。
但正如上面所说预期是要在虚拟机上观测的到机器人建图/导航的情况,因为后面想要做的实机操作机器人没有显示器,想要能更直观的控制机器人,而不是简单控制其移动,又去摸索其他方法,最终绕了一圈,还是通过最初的方法实现了预期的效果。
注意:一定要确台式机的ip和PC的ip在同一个网段下,否则会影响机器人与PC之间的通讯,不要使用校园网,在没有局域网的条件下,可以使用手机热点来操作。
(1)打开虚拟机
右键,打开终端(Open Terminal)
输入指令:ifconfig
查询虚拟机的(个人PC的IP地址)、这里有第一个非常需要注意的点,默认情况下虚拟机和台式机只能单项连通,即台式机作为master来启动roscore,虚拟机可以接收到台式机传来的信息,但反过来却不行。
需要进行如下操作:
点击虚拟机里的设置,找到网络适配器,选择桥接模式,点击确定。这时PC端的ip地址会发生改变。
输入指令:gedit .bashrc
将以下两行内容,把ip修改为上述ifconfig查到的ip,如果.bashrc中没有这两行指令也不要紧,直接输入到最后面即可。
export ROS_HOSTNAME=192.168.31.164
export ROS_MASTER_URI=http://192.168.31.164
保存退出。
source .bashrc
输入指令:ifconfig
查看ip
输入指令:gedit .bashrc
对.bashrc文件进行修改。
略有不同的是台式机export ROS_MASTER_URI=http:
后面接的不是台式机自己的ip而是远程操控的PC的ip。
Ctrl+x保存退出
立即生效
source .bashrc
【远程PC】运行
开启roscore
roscore
【台式机】端运行
rostopic list
当出现/rosout 和rosout_agg时候,说明通信成功。
在进行建图和导航功能之前,先确保自己虚拟机和台式机中的功能包及相关依赖包都已安装完整且编译成功,若还没配置成功可参考之前的文章 :
从0实现Gazebo仿真slam建图
(1)【笔记本】启动roscore
PC端新建Terminal(命令提示符),键入roscore,按下enter,启动roscore
(2)【台式机】 打开终端启动gazebo仿真场景。
roslaunch turtlebot3_gazebo turtlebot3_world.launch
(3)【笔记本】打开终端,然后运行SLAM启动文件。
roslaunch turtlebot3_slam turtlebot3_slam.launch
(4)【笔记本】 启动键盘操作
roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
(5)【笔记本】打开终端,然后运行地图保存节点
rosrun map_server map_saver -f ~/map_world
地图自动保存在~/home/map目录下,名为map_world.yaml和map_world.pgm
导航技术的主要用途:使机器人能自主进入期望的位置且在到达目标点的过程中能自主的躲避障碍物。
(1)【笔记本】启动roscore
PC端新建Terminal(命令提示符),键入roscore,按下enter,启动roscore
(2)【台式机】 打开终端启动gazebo仿真场景。
roslaunch turtlebot3_gazebo turtlebot3_world.launch
(3)【笔记本】打开终端,键入下面代码启动导航功能
roslaunch turtlebot3_navigation turtlebot3_navigation.launch
[远程主机(笔记本电脑)] 在开始导航之前,TurtleBot3需知道它的位置和姿态。
为了更新初始位置数据,可以按照以下步骤进行:
1). 点击2D Pose Estimate按键。
2). 通过单击并拖动地图上的方向来设置机器人在地图上的大致位置。
每个绿色箭头代表TurtleBot3的预期位置。 激光扫描仪将在地图上绘制线条,如地图上的墙壁。 如果图形没有正确显示图形,请从上面的“2D Pose Estimate”按钮重复定位TurtleBot3。
如果图形没有显示线条,请重复上述过程。
为了到达目标位置,需遵循以下做法:
点击 2D Nav Goal按钮
点击地图上的一个特定点来设置一个目标位置,拖动光标到TurtleBot3应该面对的方向。
注意:如果无法创建目标位置的路径,则设置目标位置可能会失败。 如果可以,请重新建立一个比较宽敞的地图,给机器人足够的反应空间,有利于导航顺利进行。
如果您希望在机器人到达目标位置之前停止机器人,请将TurtleBot3的当前位置设置为目标位置。使得机器人放弃之前任务,跑向该任务位置。