|
使⽤Gmapping算法对场地进⾏⼆维建图,建图过程中⼿动标定任务⽬标点。
您正在描述的是使用ROS(机器人操作系统)进行机器人导航和地图构建的过程。在这个过程中,您使用了Gmapping算法来构建二维地图,并且通过一个脚本手动标定了几个导航点(例如分类区、收取区B、分拣区北、分拣区西)。这个过程包括了启动SLAM算法、运行地点记录脚本以及保存地图等步骤。
在`auto_match.launch`文件中,您定义了启动SLAM算法的参数和节点,以及运行地点记录脚本的命令。SLAM算法在这里是用来构建地图的,而地点记录脚本则用来在构建好的地图上标定特定的位置。
在地点记录脚本`cmd_location_learn_guide.sh`中,您通过控制机器人移动到特定的位置,并使用ROS的话题发布机制来标定这些位置。用户被提示移动机器人到指定的区域,并通过按回车键来确认位置,然后脚本发布一个ROS话题,将这个位置作为导航点记录下来。
在`mark_move.py`文件中,您定义了一个`mark_nav`函数,用来处理导航点的标定和保存。这个函数将导航点保存在一个.pkl文件中,这个文件是以Python的pickle格式保存的,可以存储Python对象的结构。
整个流程体现了机器人导航和地图构建中的关键步骤,包括地图创建(使用Gmapping)、导航点标定(通过脚本和用户交互)以及数据的保存(通过ROS节点和Python脚本)。这些步骤对于实现机器人在特定环境中的自主导航至关重要。
1 # auto_match.launch:60⾏
2 <!-- =====⼀开始准备记录地点====== -->
3 <group if="$(arg open_guide)">
4
5 <!-- SLAM: Gmapping, Cartographer, Hector, Karto, Frontier_exploration-->
6 <include file="$(find spark_slam)/launch/spark_$(arg slam_methods).launch">
7 <arg name="configuration_basename" value="$(arg
configuration_basename)"/>8 </include>
9
10 <!-- 地点记录引导脚本 -->
11 <node pkg="auto_match" type="cmd_location_learn_guide.sh"
name="cmd_location_learn_guide" />
12
13 <!--创建新的终端,spark键盘控制 “wsad”分别代表“前后左右”-->
14 <node pkg="spark_teleop" type="keyboard_control.sh" name="kc" if="$(arg
open_guide)"/>
15
16 </group>
地点记录脚本:
1 #!/bin/bash
2
3 Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" &&
Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m"
&& Yellow_background_prefix="\033[43;37m" && Font_color_suffix="\033[0m" &&
Yellow_font_prefix="\e[1;33m" && Blue_font_prefix="\e[0;34m"
4 Info="${Green_font_prefix}[信息]${Font_color_suffix}"
5 echo -e "${Info} 这个是在 ROS 层⾯上地点记录的脚本, 仅仅⽤于 debug"
6 echo -e "${Info} 脚本运⾏过程任意时候可按 Ctrl+C 退出脚本"
7 echo -e ""
8 echo -e "${Info} 接下来请根据提⽰进⾏操作"
9
10 echo -e ""
11 echo -e "${Info} 控制 spark 移动到 ${Yellow_background_prefix}分类区
${Font_color_suffix}\c"
12 echo && stty erase '^H' && read -p " 然后在这个界⾯内按回⻋..."
13 rostopic pub /mark_nav std_msgs/String "data: 'learn Classification_area'" -1
>/dev/null
14 echo -e "${Info} 地点名为
${Yellow_background_prefix}Classification_area${Font_color_suffix}"
15
16 echo -e ""
17 echo -e "${Info} 控制 spark 移动到 ${Yellow_background_prefix}收取区
B${Font_color_suffix}\c"
18 echo && stty erase '^H' && read -p " 然后在这个界⾯内按回⻋..."
19 rostopic pub /mark_nav std_msgs/String "data: 'learn Collection_B'" -1
>/dev/null
20 echo -e "${Info} 地点名为
${Yellow_background_prefix}Collection_B${Font_color_suffix}"
2122
23 echo -e ""
24 echo -e "${Info} 控制 spark 移动到 ${Yellow_background_prefix}分拣区北
${Font_color_suffix}\c"
25 echo && stty erase '^H' && read -p " 然后在这个界⾯内按回⻋..."
26 rostopic pub /mark_nav std_msgs/String "data: 'learn Sorting_N'" -1 >/dev/null
27 echo -e "${Info} 地点名为
${Yellow_background_prefix}Sorting_N${Font_color_suffix}"
28
29 echo -e ""
30 echo -e "${Info} 控制 spark 移动到 ${Yellow_background_prefix}分拣区西
${Font_color_suffix}\c"
31 echo && stty erase '^H' && read -p " 然后在这个界⾯内按回⻋..."
32 rostopic pub /mark_nav std_msgs/String "data: 'learn Sorting_W'" -1 >/dev/null
33 echo -e "${Info} 地点名为
${Yellow_background_prefix}Sorting_W${Font_color_suffix}"
34
35
36 echo -e ""
37 echo -e "${Info} 是否标记完成,保存地图? \c"
38 echo && stty erase '^H' && read -p " 然后在这个界⾯内按回⻋..."
39 rostopic pub /mark_nav std_msgs/String "data: 'finish'" -1 >/dev/null
40 # 保存地图
41 CURRENTPATH=$(cd `dirname $0`; pwd)
42 gnome-terminal -x bash -c "rosrun map_server map_saver -f
$CURRENTPATH/../config/test_map"
43 echo -e "${Info} 结束标记地点,已保存地图"
44
45
46 echo -e ""
47 echo -e "${Info} 地点记录已完成\c"
48 echo -e ""
49 echo && stty erase '^H' && read -p "现在可以按回⻋退出脚本..."
1 rostopic pub /mark_nav std_msgs/String "data: 'learn Classification_area'" -1
>/dev/null
💡 解析:发布⼀个话题名为 /mark_nav 的⾃定义消息话题,内容 “learn
Classification_area” ,作为记录分类区点位的信号。
地点数据保存:1 # mark_move.py:40⾏
2
3 def mark_nav(self,mark_name):
4 '''
5 设定标定地点,与后⾯导航相关,采⽤字典的⽅式存放
6 建议标记地点名字,分类区、分拣区、收取区
7 '''
8
9 rospack = rospkg.RosPack()
10 mark_map_path = os.path.join(rospack.get_path('auto_match'),'config',
'mark_map.pkl') # 标记地图yaml⽂件地址
11
12 # 转化成字符型变量
13 mark_name = str(mark_name)
14 # 结束地点标记
15 if str.find(mark_name,str("finish"))!= -1:
16 # 将字典信息写⼊ pkl ⽂件
17 with open(mark_map_path, 'wb') as file:
18 pickle.dump(dict_mark, file)
19 print("已保存pkl⽂件,⽂件保存在:",mark_map_path)
20 print("当前字典内容:\n",dict_mark)
21
22 # 前往地点
23 if str.find(mark_name,str("go"))!= -1:
24 # 从⽂件中加载数据
25 with open(mark_map_path, 'rb') as file:
26 self.mark_map = pickle.load(file)
27 # 输出加载的数据
28 print("mark_dict=",self.mark_map)
29 # 提取mark名称
30 mark_name = (mark_name.split())[2]
31 # 判断地点位置是否在地点字典中
32 if mark_name in self.mark_map:
33 self.navigation(mark_name)
34 else:
35 print("此地点尚未登陆在字典中")
36
37 # 学习地点
38 if str.find(mark_name,str("learn"))!= -1:
39 # 提取mark名称
40 mark_name = (mark_name.split())[2]
41 # 获取当前位置
42 self.currrent_position = self.get_currect_pose()
43 # 标记当前位置
44 dict_mark[mark_name] = self.currrent_position
45 print("当前字典内容:\n",dict_mark)
|
|