引言
我们在用 C++ 写 ROS 代码的时候每次都会写下面这几个必须项,是否有时候会有疑问为什么要这样写?下面我将从 C++ 和 ROS 的两个角度分别去解释这些。
int main(int argc, char *argv[]) { ros::(argc,argv,); ros::NodeHandle n; ; }
对比了标准 C++ 与 ROS 环境下 main 函数的差异。重点解释了 argc 和 argv 的含义及其在 ROS 初始化中的必要性。说明了 ros::init 如何解析命令行参数以支持节点名覆盖、命名空间设置及 Master 地址指定。指出在 ROS 中 argc/argv 是必须的,否则 remap 等功能将失效。
我们在用 C++ 写 ROS 代码的时候每次都会写下面这几个必须项,是否有时候会有疑问为什么要这样写?下面我将从 C++ 和 ROS 的两个角度分别去解释这些。
int main(int argc, char *argv[]) { ros::(argc,argv,); ros::NodeHandle n; ; }
这是 程序的入口函数,操作系统在启动程序时:
int main(int argc, char* argv[])
不是你在'创建变量',而是 操作系统帮你填好的参数。
argument count(参数个数)
int argc
表示 命令行参数的数量
注意:
例子:
./demo123、abc./demo 10 hello
那么:
argc == 3
argument vector(参数数组)
char* argv[]
本质是:
char** argv
在 C++ 中:char** argv = char* argv[]
一个字符串数组
| 索引 | 内容 |
|---|---|
| argv[0] | 程序路径 |
| argv[1] | 第一个参数 |
| argv[2] | 第二个参数 |
因为:
char*return 0;
表示:
return 1;
表示:
完全一样
int main(int argc, char** argv)
这仍然是:
ROS 并没有改 C++ 规则
关键在这一句
ros::init(argc, argv, "node_name");
ros::init(argc, argv, "talker");
它做的事情包括:
这里必须传入 argc / argv
举个非常重要的例子
rosrun my_pkg my_node __name:=node1
或:
rosrun my_pkg my_node _rate:=10
这些:
__name:=node1 _rate:=10
不是你的参数 是 ROS 的参数
ROS 里以 __ 开头的参数,是"ROS 保留的内部参数',用来和用户自己的参数做'强区分'。
__xxx:=yyy ROS 自己用xxx:=yyy 你写节点、launch 文件用解释:
__name:=xxx 覆盖节点名rosrun pkg node __name:=camera_node
等价于:
ros::init(argc, argv, "camera_node");
但 命令行优先级更高
__ns:=xxx 设置节点命名空间__ns:=/robot1
节点里的话题:
nh.advertise("cmd_vel", 10);
实际变成:
/robot1/cmd_vel
__log:=xxx 指定日志文件路径常用于:
__master:=xx 指定 ROS Master 地址__master:=http://192.168.1.2:11311
等价于环境变量:
export ROS_MASTER_URI=...
答案就是:
int argc, char* argv[]
操作系统 → 把参数交给 main main → 把参数交给 ros::init ros::init → 解析 ROS 参数
错误示例:
ros::init(0, nullptr, "node");
后果:
_param:= 失效__name:= 失效| 项目 | 普通 C++ | ROS |
|---|---|---|
| main 入口 | OS 调用 | OS 调用 |
| argc | 命令行参数个数 | 命令行参数个数 |
| argv | 字符串数组 | 字符串数组 |
| 是否必须 | 可选 | 必须 |
| 参数用途 | 程序逻辑 | ROS 初始化 + remap |
在普通 C++ 中,
argc/argv是你'可用可不用'的参数 在 ROS 中,argc/argv是 ROS 节点的'生命线'

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online