week35 智能对话机器人 语音导航遇到的问题
在上一篇中,我们已经学习了如何安装和使用pocketsphinx,现在如何把它应用到我们的项目中去呢?在这里,我用它做了两件事情:一件是语音聊天机器人,另一件是语音导航。
chatbot
语音聊天机器人依靠语音识别和神经网络来识别输入语音。当你向机器人问好时,它也会向你问好。你可以像一个真正的人一样交流 有时它甚至和你开玩笑。机器人可以完成与人的基本沟通,并做出相应的行为,比如当你说“给我买杯啤酒”时,它会回答你喜欢‘啤酒,我不喜欢需要一杯啤酒,然后去储藏室给你拿杯啤酒。此外,一样回答你。然而,如果你和机器人在去你之前告诉他的任务的路上交谈,他会像“对不起,我在路上,没有意识到你在和我说话”由于我们的技术限制,在与我们的机器人的通信中仍然存在一些缺陷,不能像和真人对话一样流畅。
chatbot
语音导航遇到的问题
语音导航由两部分组成:语音识别和自动导航。
整体思路为:根据语音读取到目标点,在已有的地图中找到目标点的坐标,自动导航至目标处。
上一篇已经介绍了语音识别,而自动导航根据move_base和actionlib也可以实现,不再赘述。
这里主要记录遇到的问题。
geometry_msgs::PoseWithCovarianceStamped
该消息表示带有时间标签和参考坐标的估计位姿。两部分构成:
std_msgs/Header header
geometry_msgs/PoseWithCovariance pose
1. std_msgs/Header.msg主要由三部分构成:
(1) unit32 seq
#sequence ID: consecutively increasing ID
(2)time stamp
#Two-integer timestamp that is expressed as:
# * stamp.sec: seconds (stamp_secs) since epoch
# * stamp.nsec: nanoseconds since stamp_secs
# time-handling sugar is provided by the client library
(3) string frame_id
#Frame this data is associated with
# 0: no frame
# 1: global frame
2. geometry_msgs/PoseWithCovariance表示带有不确定性的一个空间位姿。由两部分组成:
geometry_msgs/Pose pose
float64[36] covariance
(1)Pose由两部分组成,分为为点和四元数表示的旋转。
geometry_msgs/Point position和geometry_msgs/Quaternion orientation
Point:
float64 x
float64 y
float64 z
Quaternion:
float64 x
float64 y
float64 z
float64 w
(2) covariance表示方差矩阵,具体的顺序为
(x, y, z, rotation about X axis, rotation about Y axis, rotation about Z axis)
可以看到,header里的seq表示序列ID、timestamp表示时间戳、frame_id表示参考坐标系
而pose里的position表示三维位置、orientation的四元数表示旋转,covariance表示方差矩阵
map_server: error while loading shared libraries: libSDL-1.2.so.0: cannot open shared object file: No such file or directory
启动保存好的地图时,由于我之前清空了一部分空间,这次发现无法启动map_server,报错缺少SDL包
$ sudo apt-get install libsdl1.2-dev libsdl-image1.2-dev
下面几个是学到的技巧,比如可以用while+wait_for_message来代替Subscriber和spin,这样更方便写循环
while not rospy.is_shutdown():
hello_str = "hello world %s" % rospy.get_time()
# 这个循环还调用rospy.loginfo(str),它执行三重任务:消息被打印到屏幕,它被写入Node的日志文件,并被写入rosout。
# rosout对于调试非常方便:可以使用rqt_console来提取消息,而不必使用Node的输出找到控制台窗口。
rospy.loginfo(hello_str)
pub.publish(hello_str)
rate.sleep()
if __name__ == '__main__':
rospy.wait_for_message(topic, topictype, timeout=None)
ros 出现Could not find a package configuration file provided by "move_base_msgs"
ImportError: No module named move_base_msgs.msg
这两个是一类错误,意思是一样的,都是缺少了move_base_msgs包,安装即可
sudo apt-get install ros-kinetic-move-base-msgs