(54 封私信 / 80 条消息) vscode下调试ROS项目,节点调试,多节点调试,roslauch调试 - 知乎
版本:core desktop desktop-full
包含工具有点差别

如何理解ROS的ros::NodeHandle,学习ROS一年后的体会-CSDN博客

【ROS学习笔记】16.常用可视化工具的使用_rqt image view-CSDN博客

其实就是:通信框架+实用软件。ROS能做到的,失去ROS也能做到。

(48 封私信 / 80 条消息) 如何优雅地在windows上玩ROS(一个紧致的解决方案) - 知乎
Windows版Ros环境的搭建以及Rviz显示激光点云信息_rviz windows-CSDN博客

(48 封私信 / 72 条消息) ROS核心概念解析:从Node到Master,再到roslaunch的全面指南 - 知乎
ROS基础(三):参数服务器、命名空间与launch文件大全解_ros 中的参数空间-CSDN博客
如何理解ROS的ros::NodeHandle,学习ROS一年后的体会-CSDN博客

rospy & roscpp

(57 封私信 / 80 条消息) ROS学习笔记(2)--roscpp和rospy - 知乎
rospy 和 roscpp 的区别以及 rospy 的常用函数 - 简书
ROS 1中rospy与roscpp常用函数对照表 - DeepSeek
关于rospy和roscpp订阅中的spin - Zyhaire - 博客园
机器人操作系统入门(七)rospy客户端库 - 从头再来,不要慌 - 博客园
以下是一个 rospy(Python)和 roscpp(C++)常用函数的对照表(ROS 1),涵盖节点初始化、话题、服务、参数服务器等核心功能:


1. 节点初始化

功能 rospy (Python) roscpp (C++)
初始化节点 rospy.init_node('node_name') ros::init(argc, argv, "node_name")
检查节点是否关闭 rospy.is_shutdown() ros::ok()
关闭节点 rospy.signal_shutdown("reason") ros::shutdown()
获取节点名称 rospy.get_name() ros::this_node::getName()

2. 话题发布与订阅

功能 rospy (Python) roscpp (C++)
发布者 pub = rospy.Publisher('topic', MsgType, queue_size) ros::Publisher pub = nh.advertise<MsgType>("topic", queue_size)
订阅者 rospy.Subscriber('topic', MsgType, callback) ros::Subscriber sub = nh.subscribe("topic", queue_size, callback)
发布消息 pub.publish(msg) pub.publish(msg)
等待连接 rospy.wait_for_message('topic', MsgType) 需手动实现(如循环检查 pub.getNumSubscribers()

3. 服务服务器与客户端

功能 rospy (Python) roscpp (C++)
服务服务器 srv = rospy.Service('service', SrvType, handler) ros::ServiceServer srv = nh.advertiseService("service", handler)
服务客户端 rospy.ServiceProxy('service', SrvType) ros::ServiceClient client = nh.serviceClient<SrvType>("service")
调用服务 response = srv.call(request) client.call(request, response)

4. 参数服务器

功能 rospy (Python) roscpp (C++)
设置参数 rospy.set_param('key', value) ros::param::set("key", value)
获取参数 value = rospy.get_param('key') ros::param::get("key", value)
检查参数是否存在 rospy.has_param('key') ros::param::has("key")
删除参数 rospy.delete_param('key') ros::param::del("key")

5. 定时器(Timer)

功能 rospy (Python) roscpp (C++)
创建定时器 rospy.Timer(rospy.Duration(secs), callback) ros::Timer timer = nh.createTimerDuration(secs), callback

6. 日志输出

功能 rospy (Python) roscpp (C++)
打印日志 rospy.loginfo(msg) ROS_INFO("%s", msg)
警告日志 rospy.logwarn(msg) ROS_WARN("%s", msg)
错误日志 rospy.logerr(msg) ROS_ERROR("%s", msg)

7. 时间操作

功能 rospy (Python) roscpp (C++)
获取当前时间 rospy.Time.now() ros::Time::now()
创建时间对象 rospy.Time(secs, nsecs) ros::Time(secs, nsecs)
持续时间 rospy.Duration(secs) ros::Duration(secs)
休眠 rospy.sleep(duration) ros::Duration(duration).sleep()

8. 其他工具

功能 rospy (Python) roscpp (C++)
获取命名空间 rospy.get_namespace() ros::this_node::getNamespace()
解析ROS路径 rospy.get_package_path('pkg_name') 需使用 ros::package::getPath("pkg_name")

关键区别说明

  1. 命名空间处理
    • rospy 自动处理 ~(私有命名空间),而 roscpp 需显式调用 ros::NodeHandle("~")
  2. 消息类型
    • Python 中消息类型为 module_name.msg.MsgType(如 std_msgs.msg.String)。
    • C++ 中需包含头文件(如 #include <std_msgs/String.h>),类型为 std_msgs::String
  3. 线程模型
    • rospy 默认单线程(需手动开启 rospy.spin()),roscpp 多线程由 ros::spin()ros::MultiThreadedSpinner 管理。

希望这个对照表能帮助你快速切换或对比两种语言的ROS开发!

Master & Nodes

(48 封私信 / 64 条消息) ROS入门(四)---ROS节点 - 知乎
Master节点管理器(比如帮助节点找到彼此);Node节点,一个可执行文件(进程),就是我提的编程“元件”

Messages & Topics

消息和话题,一种不同时不同地的通信机制及分类方式。节点可以发布消息到话题,也可以订阅话题以接收消息。

Workspace

(48 封私信 / 80 条消息) 【ROS笔记】工作空间(workspace)、功能包(package)的介绍及创建 - 知乎
工作空间,很像VSCode打开的工作目录来管理许多文件;
更像Python的venv虚拟环境来设定环境变量、各个软件包的定位。

四个部分:

  1. src: 代码空间(Source Space),最常用、最重要的文件夹,用来存储所有ROS功能包(package)的源文件。功能包(package)是ROS中的基本单元,包含ROS节点、库、配置文件等:
    1. config:功能包的配置文件,用户创建。
    2. include:需要用到的头文件。
    3. scripts:可以直接运行的Python脚本。
    4. src:需要编译的C++代码。
    5. launch:所有启动文件。
    6. msg:自定义的消息类型。
    7. srv:自定义的服务类型。
    8. action:自定义的动作指令。
    9. CMakeLists.txt:Catkin编译器编译功能包的规则。
    10. package.xml: 功能包清单,可得到该package的名称、版本号、信息描述、作者信息和许可信息等。更重要的,<build_depend> ... </build_depend>标签定义了代码编译所依赖的其它功能包,<exec_depend> ... </exec_depend>标签定义了可执行程序运行时所依赖的其它功能包。
  2. build: 编译空间(Build Space),catkin_make命令自动生成,用来存储工作空间编译过程中产生的缓存信息和中间文件。
  3. devel: 开发空间(Development Space),catkin_make命令自动生成,用来放置编译生成的可执行文件
  4. install: 安装空间(Install Space),不是必需的,很多工作空间没有该文件夹。编译成功后,可以使用make install命令将可执行文件安装到该空间中,运行该空间中的环境变量脚本,即可在终端中运行这些可执行文件。

创建工作空间

创建一个ROS工作空间(ROS Workspace) - Jason_hjx - 博客园
名称以catkin_ws为例。

mkdir -p ~/catkin_ws/src        #使用系统命令创建工作空间目录
cd ~/catkin_ws/src
catkin_init_workspace           # ROS的工作空间初始化命令

创建功能包

ROS不允许功能包的嵌套,多个功能包必须平行放置在代码空间(src)中。

ROS直接创建功能包的命令catkin_create_pkg,用法:

catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

即需要输入功能包名称和所依赖的其它功能包。举例,进入代码空间,创建功能包:

cd ~/catkin_ws/src
catkin_create_pkg leraning_communication std_msgs rospy roscpp

对于新的功能包,现在往里面写代码吧……Happy Coding~

我的观念里,驱动代码和决策代码是分开的。对于特定的比赛任务,我们只需要留一个功能包来存放决策代码,毕竟决策代码也难以复用。

编译工作空间

创建完成后,在工作空间的根目录下使用catkin_make命令编译整个工作空间:

cd ~/catkin_ws                  # 回到工作空间的根目录
catkin_make                     # 编译整个工作空间

编译中,工作空间的根目录会自动产生develbuild两个文件夹即其中的文件。

激活工作空间

编译完成后,在devel文件夹中已经产生几个setuo.*sh形式的环境变量设置脚本,使用source命令运行这些脚本,可以使工作空间中的环境变量生效。

source ~/catkin_ws/devel/setup.bash # ~/catkin_ws是工作空间目录

这样即可直接使用工作空间内的软件包(就像激活python虚拟环境后才可以执行python的可执行包)。检查环境变量是否生效:

echo $ROS_PACKAGE_PATH

如果打印的路径中包含当前工作空间中的路径,则说明环境变量设置成功。

注意

source命令设置的环境变量只能在当前终端生效,如果希望在所有终端生效,需要在终端配置文件中加入环境变量设置:echo "source /home/xxx/catkin_ws/devel/setup.bash" >> ~/.bashrc

使用工作空间里的功能包

rospack             # 获取功能包的信息
rosdep              # 自动安装功能包依赖的其它包
roscd               # 功能包目录跳转
roscp               # 拷贝功能包中的文件
rosed               # 编辑功能包中的文件
rosrun              # 运行功能包中的可执行文件
roslaunch           # 运行启动文件,一次性把多个节点按照我们预先的配置启动起来

rosparam

参数服务器,管参数,可能还调参吧

roscore

总程序。rosout类似stdout

roslaunch

一次性把多个节点按照我们预先的配置启动起来
格式包括以下标签:

<launch>    <!--根标签-->
<node>    <!--需要启动的node及其参数-->
<include>    <!--包含其他launch-->
<machine>    <!--指定运行的机器-->
<env-loader>    <!--设置环境变量-->
<param>    <!--定义参数到参数服务器-->
<rosparam>    <!--启动yaml文件参数到参数服务器-->
<arg>    <!--定义变量-->
<remap>    <!--设定参数映射-->
<group>    <!--设定命名空间-->
</launch>    <!--根标签-->

调试

vscode下调试ROS项目,节点调试,多节点调试,roslauch调试 - 知乎

可视化工具

【ROS学习】- PlotJuggler绘图工具的安装使用-CSDN博客
ROS:Dynamic Reconfigure 动态参数调节_ros dynamic reconfigure-CSDN博客