You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在C++脚本中打印Bash与roslaunch定义的ros::params

问题描述

启动后控制台仅打印"hi",从Bash传入的foldername、image_name及roslaunch中定义的size_name均为空,无法正常输出。但Python脚本可正常获取这些参数,请问C++脚本哪里有误?

相关代码

Bash启动脚本

foldername=camera_calibration_$(date +"%m-%d-%Y")
im_name="/cam0"
roslaunch image_pub cam_calibration.launch foldername:=$foldername image_name:=$im_name

roslaunch文件(cam_calibration.launch)

<launch>
  <arg name = "foldername" default="camera_calibration" />
  <arg name = "image_name" default="/cam1" />
    
  <param name="foldername" type="string" value="$(arg foldername)" />
  <param name="image_name" type="string" value="$(arg image_name)" />
  <param name="size_name" type="string" value="12x8" />
  <param name="square" type="string" value="0.05" />
    
  <node name="im_pub_sub_node" pkg="image_pub" type="im_pub_sub" output="screen"/>
  <node name="cameracalibrator_node" pkg="camera_calibration" type="cameracalibrator.py" output="screen"/>
</launch>

C++节点代码(im_pub_sub.cpp)

int main(int argc, char** argv) {
    std::string foldername;
    std::string imagename;
    std::string si_name;
    ros::param::get("/size_name", si_name);
    ros::param::get("/foldername", foldername);
    ros::param::get("/image_name", imagename);
    std::cout<<imagename<<std::endl;
    std::cout<<foldername<<std::endl;
    std::cout<<si_name<<std::endl;
    std::cout<<"hi"<<std::endl;
}

问题原因及解决方法

你的C脚本没有初始化ROS节点——这是访问ROS参数服务器的必要前提。Python的ROS客户端会隐式处理部分初始化逻辑,但C必须显式完成节点初始化,才能和参数服务器建立通信。

修改后的C++代码如下:

#include <ros/ros.h>
#include <iostream>
#include <string>

int main(int argc, char** argv) {
    // 初始化ROS节点,节点名需与launch文件中定义的一致
    ros::init(argc, argv, "im_pub_sub_node");
    
    std::string foldername;
    std::string imagename;
    std::string si_name;
    
    // 现在可正常获取参数
    ros::param::get("/size_name", si_name);
    ros::param::get("/foldername", foldername);
    ros::param::get("/image_name", imagename);
    
    std::cout<<imagename<<std::endl;
    std::cout<<foldername<<std::endl;
    std::cout<<si_name<<std::endl;
    std::cout<<"hi"<<std::endl;
    
    // 若需节点持续运行,可添加ros::spin()或ros::Rate循环
    // ros::spin();
    return 0;
}

同时需确认CMakeLists.txt中已正确链接roscpp库,确保编译时包含ROS相关依赖。

内容的提问来源于stack exchange,提问作者Nagarjun Vinukonda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:45:38