一、rospy.get_param()失效
1、开发过程中发现一个非常奇怪的问题,因为我需要在.yaml文件中配置参数来让ROS的python脚本使用,所以用到了rospy.get_param()语法来导入该文件,大概使用方法为:
yaml文件中
NETWORK_IMAGE_WIDTH: 448
NETWORK_IMAGE_HEIGHT: 448
#计算棒人体框选移动判定阈值设置
CENTER_THRESHOLD: 50
#计算棒人体识别成功阈值设置
PROBABILITY_THRESHOLD: 0.20
在python中获取片段
self.NETWORK_IMAGE_WIDTH = rospy.get_param("~NETWORK_IMAGE_WIDTH",440)
self.NETWORK_IMAGE_HEIGHT = rospy.get_param("~NETWORK_IMAGE_HEIGHT",448)
self.CENTER_THRESHOLD = rospy.get_param("~CENTER_THRESHOLD",50)
self.PROBABILITY_THRESHOLD = rospy.get_param("~PROBABILITY_THRESHOLD",0.20)
2、问题描述
按照上面的配置以及官方的方法,这样确实可以使用了哈,然后问题就在这里,就是不能用!!!见下面现象
PARAMETERS
* /ncs_detect/CENTER_THRESHOLD: 50
* /ncs_detect/NETWORK_IMAGE_HEIGHT: 448
* /ncs_detect/NETWORK_IMAGE_WIDTH: 448
* /ncs_detect/PROBABILITY_THRESHOLD: 0.2
* /ncs_detect/tiny_yolo_graph_file: /home/zolar/zolar...
* /rosdistro: kinetic
* /rosversion: 1.12.14
NODES
/
ncs_detect (simple_navigation_goals/ncs_person_server.py)
ROS_MASTER_URI=http://localhost:11311
process[ncs_detect-1]: started with pid [20069]
Running NCS Caffe TinyYolo example
THRESHOLD is 51
IMAGE_WIDTH is 440
明明显示我的参数都导入成功了,50,448,448,0.2,但是我挑选了两个打印出来,结果呢,不对,是51,440,代码里这么打印的
print "THRESHOLD is "+str(self.CENTER_THRESHOLD)
print "IMAGE_WIDTH is "+str(self.NETWORK_IMAGE_WIDTH)
3、解决
这就奇了怪了哈,真的没问题哈,已经导入了,怎么就是不行呢(打印出的51,440是代码里的默认值),我已经赋值了,怎么还是显示默认值呢,没办法,找原因呗。。。
...........................................................................................................................................................................................................
一个小时后........................
额额额...........................
要崩溃了,不科学啊,完全找不到原因啊..........................
我类个去,没办法,只能出终极方法,重新配置一个小脚本了,精简也容易看出问题,于是乎,继续写...........
现象出现了,写的小脚本竟然可以!!!!这就尴尬了,那说明还是我的脚本的问题,但是我真的在参数中已经获取到了哈,怎么就最后得不到呢,找啊找......................
额,原来在这,找来找去,发现这原因简直要哭,竟然是节点注册问题,也就是我把ROS的节点注册放到了获取参数之后,这样就导致了获取不到参数,原因嘛,没启动人家ROS规定的节点来干活,肯定不给你干活弄参数啦。好啦原因找到啦,不是问题的问题,但却坑的不行啊,几个小时没了,将节点注册放在最前面的位置啦,这样才能给咱开始干活啦。
以前这样:
self.myZolarNCS = ZolarNCS()
self.ncs_state = ''
rospy.init_node("ncs_person_server")
现在这样:
rospy.init_node("ncs_person_server")
self.myZolarNCS = ZolarNCS()
self.ncs_state = ''
是的,就差这么一点,但很容易出问题哈,一定注意!!!
好啦,几个小时就这么坑掉了,一入技术深似坑,继续搬砖...
4、拓展,后来发现,不仅仅是参数,比如topic转换等这些,如果节点注册放在后面也会出问题,因此,一定记得把节点注册放在最前面哈,这样才能直接避免,省得出现各种莫名奇妙的错误导致时间的浪费
二、Invalid roslaunch XML syntax: not well-formed (invalid token)问题
1、在进行cartographer建图过程中,发现一个奇怪的问题,我将官方的demo_revo_lds.launch文件进行简单修改后,进行自己的地图构建,参考:cartographer地图构建,结果奇怪的问题出现了,一直报下面的错误:
Invalid roslaunch XML syntax: not well-formed (invalid token): line 34, column 14
The traceback for the exception was written to the log file
2、这就奇怪了哈,借用官方的脚本文件,自己只做了微小的调整,怎么就不行了,没办法,向万能的百度求助吧,于是乎,找到几种说法:建议重新建立脚本,而不是复制过来,这个方法试了,不行,因为我不是复制的代码,而是直接复制的文件然后改名;配置文件路径不对,修改,这个方法也试了,自己路径确认没问题。那就奇怪了,就是报错哈,找不到原因
3、最后,突然抱着试一试的心态,重新修改权限吧,执行
chmod 777 ./* -R
将目前用的文件下所有权限进行修改,然后重新编译
catkin_make_isolated --install --use-ninja
然后重新启动,竟然可以了,哈哈,万幸,以后出类似的问题还是多考虑一下权限问题,先将权限改为最大,这样开发过程中可以避免很多错误哈。