转自:http://www.ncnynl.com/archives/201611/1061.html
使用roslaunch文件来启动功能包的一个或多个节点肯定是非常方便的,也很好理解。可是,我在编写roslaunch文件后,运行时出现一个问题:说找不到某某功能包的某某节点,我怎么看都不像,参照网上博客,cmake,romake都试过了,就是不行。无奈翻看原来教程,发现落了一项工作没做。
总结起来就是:下述情况下,进行roslaunch启动节点时,不用cmake,roamake等对功能包进行编译,只需对节点的文件(xx.cpp或xx.py)设置可执行权限就行!!!!!!(我就是没有)
在当前情况是这样,launch文件内容简单,后续复杂的roslaunch方法,也许需要编译功能包,现在正在学习中......有错还望指正,谢谢!
具体步骤如下:
(1)编写节点文件
$ roscd beginner_tutorials/scripts
$ touch param_talker.py
代码如下:
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
def param_talker():
rospy.init_node('param_talker')
# Fetch values from the Parameter Server. In this example, we fetch
# parameters from three different namespaces:
#
# 1) global (/global_example)
# 2) parent (/foo/utterance)
# 3) private (/foo/param_talker/topic_name)
# fetch a /global parameter
global_example = rospy.get_param("/global_example")
rospy.loginfo("%s is %s", rospy.resolve_name('/global_example'), global_example)
# fetch the utterance parameter from our parent namespace
utterance = rospy.get_param('utterance')
rospy.loginfo("%s is %s", rospy.resolve_name('utterance'), utterance)
# fetch topic_name from the ~private namespace
topic_name = rospy.get_param('~topic_name')
rospy.loginfo("%s is %s", rospy.resolve_name('~topic_name'), topic_name)
# fetch a parameter, using 'default_value' if it doesn't exist
default_param = rospy.get_param('default_param', 'default_value')
rospy.loginfo('%s is %s', rospy.resolve_name('default_param'), default_param)
# fetch a group (dictionary) of parameters
gains = rospy.get_param('gains')
p, i, d = gains['P'], gains['I'], gains['D']
rospy.loginfo("gains are %s, %s, %s", p, i, d)
# set some parameters
rospy.loginfo('setting parameters...')
rospy.set_param('list_of_floats', [1., 2., 3., 4.])
rospy.set_param('bool_True', True)
rospy.set_param('~private_bar', 1+2)
rospy.set_param('to_delete', 'baz')
rospy.loginfo('...parameters have been set')
# delete a parameter
if rospy.has_param('to_delete'):
rospy.delete_param('to_delete')
rospy.loginfo("deleted %s parameter"%rospy.resolve_name('to_delete'))
else:
rospy.loginfo('parameter %s was already deleted'%rospy.resolve_name('to_delete'))
# search for a parameter
param_name = rospy.search_param('global_example')
rospy.loginfo('found global_example parameter under key: %s'%param_name)
# publish the value of utterance repeatedly
pub = rospy.Publisher(topic_name, String, queue_size=10)
while not rospy.is_shutdown():
pub.publish(utterance)
rospy.loginfo(utterance)
rospy.sleep(1)
if __name__ == '__main__':
try:
param_talker()
except rospy.ROSInterruptException: pass
(2)编写完成后,保存,并设置可执行权限(一定要注意!!!!)
$ chmod +x param_talker.py
(3)编写启动文件,param_talker.launch文件中写如下代码
$ roscd beginner_tutorials/bringup
$ touch param_talker.launch
$ rosed beginner_tutorials param_talker.launch
代码如下:
<launch>
<!-- set /global_example parameter -->
<param name="global_example" value="global value" />
<group ns="foo">
<!-- set /foo/utterance -->
<param name="utterance" value="Hello World" />
<param name="to_delete" value="Delete Me" />
<!-- a group of parameters that we will fetch together -->
<group ns="gains">
<param name="P" value="1.0" />
<param name="I" value="2.0" />
<param name="D" value="3.0" />
</group>
<node pkg="rospy_tutorials" name="param_talker" type="param_talker.py" output="screen">
<!-- set /foo/utterance/param_talker/topic_name -->
<param name="topic_name" value="chatter" />
</node>
</group>
</launch>
(4)
启动launch文件
$ roslaunch beginner_tutorials param_talker.launch
注意:上述整个过程无须catkin_make或者rosmake!!!!