ROS节点无法读入launch参数问题

总述

由于没有注意 参数 与 句柄的 全局/局部 关系,从而使得launch文件的参数无法正常进入节点中。

表现

问题代码来自 https://github.com/RuPingCen/publish_pointcloud
launch文件。

<launch>
  <node name="publish_pointcloud" pkg="publish_pointcloud" type="publish_pointcloud" output="screen">
	<param name="path" value="$(find publish_pointcloud)/data/test3.pcd" type="string" />
	<param name="frame_id" value="camera" type="string" />
	<param name="topic" value="/pointcloud/output" type="string" />
	<param name="hz" value="20" type="int" />
  </node>
</launch>

节点文件 .cpp

int main (int argc, char **argv)  
{  

    
	std::string topic,path,frame_id;
    int hz;

	ros::init (argc, argv, "publish_pointcloud");  
	ros::NodeHandle nh;  

    nh.param<std::string>("path", path, "/home/shuangyu/catkin_pcd2ros/src/publish_pointcloud/data/test.pcd");
    cout << "path:: "<<path << endl;
	nh.param<std::string>("frame_id", frame_id, "camera");
	nh.param<std::string>("topic", topic, "/pointcloud/output");
    nh.param<int>("hz", hz, 2);
   	cout << "path:: "<<path << endl;
...

运行的结果
在这里插入图片描述
代码仍然我行我素地采用 nh.param 中的默认值。

原因

nh是全局句柄,launch文件中的参数都是局部参数,所以可以:

  1. 改为局部句柄
    ros::NodeHandle nh("~");

或者
2. launch文件采用全局参数
只有"path"是全局参数。

<launch>
  <param name="path" value="test3.pcd" type="string" />
  <node name="publish_pointcloud" pkg="publish_pointcloud" type="publish_pointcloud" output="screen">
	<param name="frame_id" value="camera" type="string" />
	<param name="topic" value="/pointcloud/output" type="string" />
	<param name="hz" value="20" type="int" />
  </node>
</launch>
  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS(Robot Operating System)是一个开源的机器人操作系统,它提供了很多工具和库,方便我们构建、测试和部署机器人应用。ROS节点(node)是ROS系统中的基本构建块,它们可以执行各种任务,并通过ROS通信机制与其他节点通信。 在ROS中,我们可以使用launch文件来管理节点的启动和运行。launch文件是一个XML格式的文件,其中包含了我们需要启动的节点参数、话题、服务等信息。在本次实验中,我们将学习如何编写一个简单的launch文件来管理ROS节点的启动和运行,并对实验过程进行总结。 实验步骤: 1. 创建ROS工作空间 首先,我们需要创建一个ROS工作空间,如果已经有了可以跳过此步骤。在终端输入以下命令: ``` mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make source devel/setup.bash ``` 2. 创建ROS节点ROS工作空间的src目录下创建一个ROS节点。在终端输入以下命令: ``` cd ~/catkin_ws/src catkin_create_pkg my_node rospy ``` 这里创建了一个名为“my_node”的ROS包,其中使用了ROS的Python库rospy。 3. 编写ROS节点代码 在my_node包中创建一个名为“my_node.py”的Python文件,并将以下代码复制到文件中: ``` #!/usr/bin/env python import rospy def main(): rospy.init_node('my_node') rospy.loginfo('Hello, ROS!') if __name__ == '__main__': main() ``` 这个ROS节点非常简单,它只是打印了一条信息“Hello, ROS!”。当然,我们也可以在这里添加更多的代码来完成其他任务。 4. 编写ROS launch文件 在my_node包中创建一个名为“my_node.launch”的launch文件,并将以下代码复制到文件中: ``` <launch> <node pkg="my_node" type="my_node.py" name="my_node" output="screen"/> </launch> ``` 这个launch文件定义了一个ROS节点,其中“pkg”属性指定了节点所在的ROS包,“type”属性指定了节点的Python文件,“name”属性指定了ROS节点的名称,“output”属性指定了节点输出的消息类型。 5. 运行ROS launch文件 在终端输入以下命令来启动ROS launch文件: ``` roslaunch my_node my_node.launch ``` 在终端中将会看到输出“Hello, ROS!”,说明ROS节点已经成功启动。 实验总结: 通过本次实验,我们学习了如何使用ROS launch文件来管理ROS节点的启动和运行。在编写launch文件的过程中,需要注意以下几点: 1. 在launch文件中定义的节点必须与Python文件中的节点名称相同。 2. 在编写launch文件时,需要指定节点所在的ROS包、Python文件以及节点的名称。 3. 在运行launch文件时,需要使用“roslaunch”命令,并指定launch文件所在的ROS包和launch文件的名称。 总的来说,ROSlaunch文件非常方便,可以大大简化我们的节点管理工作。在实际的机器人应用中,我们可以使用launch文件来启动多个节点,并通过ROS通信机制将它们连接在一起,完成更加复杂的任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值