引言
我们在用 C++ 写 ROS 代码的时候每次都会写下面这几个必须项,是否有时候会有疑问为什么要这样写?下面我将从 C++ 和 ROS 的两个角度分别去解释这些。
int main(int argc, char *argv[]) {
ros::init(argc, argv, "节点名称");
ros::NodeHandle n;
;
}
文章解析了 C++ 标准程序中 main 函数的参数 argc 和 argv 的含义及作用,并对比了在 ROS 环境下这些参数的特殊性。重点说明了 ros::init 函数依赖 argc/argv 来解析 ROS 命令行参数(如节点名、命名空间、Master 地址等),强调在 ROS 开发中 argc/argv 是初始化节点的必要条件,否则会导致 remap 等功能失效。
我们在用 C++ 写 ROS 代码的时候每次都会写下面这几个必须项,是否有时候会有疑问为什么要这样写?下面我将从 C++ 和 ROS 的两个角度分别去解释这些。
int main(int argc, char *argv[]) {
ros::init(argc, argv, "节点名称");
ros::NodeHandle n;
;
}
这是 程序的入口函数,操作系统在启动程序时:
mainint 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
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online