ROS学习之完全搞不懂篇(知道原因后发现自己好弱智...)

本文解决ROS中rospy.get_param()失效问题,因节点注册顺序不当导致参数读取失败,及通过修改文件权限解决roslaunch XML语法错误。

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

一、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

然后重新启动,竟然可以了,哈哈,万幸,以后出类似的问题还是多考虑一下权限问题,先将权限改为最大,这样开发过程中可以避免很多错误哈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值