ROS1入门之节点与指令

本文详细介绍了ROS1的安装与测试过程,包括创建工作空间、功能包和节点,以及ROS1中的常用指令,如rosnode、rostopic、rosmsg和rosservice等,为初学者提供了全面的教程。
摘要由CSDN通过智能技术生成


  • 💂 个人主页:风间琉璃
  • 🤟 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主
  • 💬 如果文章对你有帮助欢迎关注点赞收藏(一键三连)订阅专栏

前言

提示:这里可以添加本文要记录的大概内容:

笔记均来源于Autolabor,B站视频教程:ROS1


一、RO1的安装与测试

在这里插入图片描述

1.ROS1安装

ROS1的安装在网上基本上都能找到的,ROS1安装文章推荐:ROS1安装,这里包含了从虚拟机的安装以及ROS1的安装。

2.ROS1测试

当你的ROS安装成功后,可以通过运行ROS 内置的小程序以检测 ROS 环境是否可以正常运行,运行小乌龟流程如下:

  • 打开三个命令行终端(ctrl + alt + T)
  • 命令行终端1输入:roscore
  • 命令行终端2输入:rosrun turtlesim turtlesim_node(此时会弹出图形化界面)
  • 命令行终端3输入:rosrun turtlesim turtle_teleop_key(在3中可以通过上下左右控制2中乌龟的运动)

运行结果如下所示:
在这里插入图片描述

注意:光标必须聚焦在键盘控制窗口,否则无法控制乌龟运动。

二、ROS1创建节点

1.创建工作空间

节点需要存在于功能包当中,功能包需要存在于工作空间当中,因此,想要想创建一个节点,就必须先创建一个工作空间,然后再创建功能包。本质上工作空间就是我们所熟知的文件夹。

mkdir -p 自定义空间名称/src
mkdir -p catkin/src

目录创建成功后,需要进去到此目录下,也就是我们所需要的工作空间,在此工作空间下使用catkin_make 这个指令来构建catkin工作空间中的ROS项目。catkin是ROS中使用的一种构建系统,类似于catkin工作空间中的 Makefile。它会读取package中的package.xml文件,并根据其中的依赖关系和指令来编译和安装所有的ROS包。

catkin_make

运行过程如下:
在这里插入图片描述
结果如下图所示,会自动生成build和devel目录。
在这里插入图片描述

2.创建功能包

在上面的步骤中我们创建好了我们ROS的工作空间后,就可以创建功能包了。这里创建功能包有两种方式:

  • 命令行
    进入src目录下,创建功能包,并为其添加roscpp、rospy和std_msgs依赖。
cd src
catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs

在这里插入图片描述
turtle_circle就是我们创建的功能包,该功能包依赖于 roscpp、rospy 与 std_msgs,其中roscpp是使用C++实现的库,而rospy则是使用python实现的库,std_msgs是标准消息库,创建ROS功能包时,一般都会依赖这三个库实现。

  • vscode
    进入工作空间启动 vscode,注意一点要在工作空间这个大目录下,为了等下方便一键编译。
cd 工作空间
code .

选定 src 右击 —> create catkin package
在这里插入图片描述
设置包名和添加依赖
在这里插入图片描述
在这里插入图片描述
至此功能包创建完毕,如下图所示。
在这里插入图片描述

3.创建节点

进入 ros 功能包的 src 目录编辑源文件,即就是CPP文件。
在这里插入图片描述
这里建议源文件名称功能包名称+"_node",这样就不需要修改CMakeLists下的部分内容。比如说添加可执行程序这里。
在这里插入图片描述
这里写一个简单的hello world!

#include "ros/ros.h"

int main(int argc, char *argv[])
{
    //执行 ros 节点初始化
    ros::init(argc,argv,"hello");
    //创建 ros 节点句柄(非必须)
    ros::NodeHandle n;
    //控制台输出 hello world
    ROS_INFO("hello world!");

    return 0;
}

4.配置CMakeLists

设置添加为可执行文件,并设置库链接文件。

add_executable(可执行程序名
  src/源文件名.cpp
)
target_link_libraries(可执行程序名
  ${catkin_LIBRARIES}
)

如果按照我上面建议的命名源文件这里直接把注释打开,不用修改即可,还是比较方便的。
在这里插入图片描述

5.编译运行节点

注意以下都是在工作空间下执行的。

🍉编译节点

这里编译也有两种方式:

  • 命令行
cd 自定义空间名称
catkin_make

在这里插入图片描述

  • vscode
    快捷键:Ctrl+Shift+B
    在这里插入图片描述
    在这里插入图片描述

🍓source环境

打开两个命令行终端,第一个输入(不需要到工作空间下)

roscore

roscore是节点和程序的集合,这些节点和程序是基于ROS的系统所必需的,于是可以称为ros核心core服务即名字。必须运行 roscore 才能使 ROS 节点进行通信。它是使用 roscore 命令启动的。

第二个输入(需要到工作空间下)

cd 工作空间
source ./devel/setup.bash

可以将这些新编译后的软件包的路径添加到当前终端的环境变量中,使得 ROS系统能够找到这些软件包。

🍎运行节点

然后就可以运行节点,注意这里的节点是在CMakeLists.txt中添加的可执行程序的名字的,即可执行节点。

rosrun 包名 C++节点

在这里插入图片描述

三、ROS1常用指令

1.rosnode

rosnode 是用于获取节点信息的命令。

✨rosnode list

rosnode list命令的作用是列出当前运行的ROS节点(processes)。节点是ROS中通信的基础,它对应于一个执行的ROS进程。这个命令会显示所有正在运行的ROS节点的名称和它们的状态信息。这对于监控一个ROS系统的运行状态非常有用,尤其是在系统中有多个节点在同时运行时。
指令格式如下:

rosnode list

在这里插入图片描述

🎊rosnode info

rosnode info 的作用是提供关于指定节点的详细信息
指令格式:

rosnode info <node_name>
  • <node_name>是你想要获取信息的ROS节点名称。

在这里插入图片描述

🎆rosnode kill

rosnode kill 杀死某个节点,用于终止指定的 ROS 节点。这个命令类似于 Unix 系统中的 kill 命令,它发送一个信号到指定的节点进程,以请求它终止。
指令格式如下:

rosnode kill <node_name> [<signal>]
  • <node_name> 是你想要终止的 ROS 节点的名称
  • 是一个可选的信号编号,默认是 SIGTERM(终止信号),表示请求节点正常退出。如果你想要强制终止节点,可以使用 SIGKILL 信号,但这通常不推荐,因为它不会给节点机会执行清理工作或保存状态。

🧨rosnode cleanup

rosnode cleanup 清除不可连接的节点,用于清理 ROS 节点留下的残余文件和临时数据。当一个 ROS 节点被终止时,它可能会留下一些临时文件或未完成的日志文件,rosnode cleanup 命令可以帮助你删除这些文件,释放磁盘空间。
指令格式如下:

rosnode cleanup [<node_name>]
  • <node_name> 是你想要清理的 ROS 节点的名称。如果省略 <node_name>,rosnode cleanup 将会清理所有已终止的节点留下的残余文件。

rosnode cleanup 命令在节点意外终止或需要重新启动节点时非常有用,它可以帮助你清理不必要的文件,保持系统的整洁。在使用这个命令时,请确保你已经结束了与节点相关的所有操作,因为清理过程是不可逆的,一旦文件被删除,你就无法恢复它们。

🎉rosnode ping

rosnode ping 测试到节点的连接状态,该命令通过向指定的节点发送ping消息并等待回复来判断节点是否可达,以及估算通信的往返时间(RTT)。这对于诊断ROS网络中的故障和性能问题非常有用。

rosnode ping 的基本指令格式如下:

rosnode ping [node]
  • node是要ping的目标节点的名称或话题名称。
  • 如果你不知道节点的确切名称,可以使用 rosnode list 命令来获取当前运行的节点列表。

示例如下:
在这里插入图片描述

2.rostopic

rostopic包含rostopic命令行工具,用于显示有关ROS 主题的调试信息,包括发布者,订阅者,发布频率和ROS消息。它还包含一个实验性Python库,用于动态获取有关主题的信息并与之交互。

🎄rostopic list

rostopic list用于列出当前 ROS 系统中所有激活的主题
指令格式:

rostopic list 

在这里插入图片描述

🎈rostopic type

rostopic type 是用来查看主题(topic)的数据类型的命令,ROS 将解析指定的主题,并输出该主题预期接收或发送的消息类型

指令格式:

rostopic type [options] <topic>
  • [options] 表示一系列可选参数,可以用来调整命令的行为。
  • 是你想要查询数据类型的ROS主题名称。
    在这里插入图片描述
    启动一个乌龟节点附带产生了三个话题,分别是:

/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

其消息格式(消息格式定义了如何在节点之间传递的数据的结构)分别为:

geometry_msgs/Twist
turtlesim/Color
turtlesim/Pose

🎁rostopic info

rostopic info用于显示有关活动的主题的详细信息。
基本格式如下:

rostopic info [topic]

在这里插入图片描述
打印出来的内容包含三个信息:Type,Pubulisher,Subscribers.

  • Type就是前面说的消息格式,即节点之间传递的数据的结构
  • Pubulisher 发布者,即teleop_turtle:键盘按下发布消息
  • Subscribers 订阅者,即turtlesim:订阅主题接受键盘的消息

🎎rostopic echo

rostopic echo 用于打印出 topic 正在发布的消息内容
指令格式:

rostopic echo [topic]

在这里插入图片描述

🎏rostopic pub

rostopic pub 用于向 topic 发布消息。
指令格式:

rostopic pub [topic] [msg-type] [data...]
  • [topic] 是你想要发布消息的 topic 名称。
  • [msg-type] 是消息的类型,格式为 package-name/type-name,例如 std_msgs/String 或 geometry_msgs/Twist。
  • [data…] 是将要发布的消息数据,根据消息类型的不同,数据的格式也会有所不同。

要向名为 chatter 的 topic 发布一个包含字符串的消息,配合 -r 选项可以指定发布消息的速率。

rostopic pub chatter std_msgs/String "Hello, world!"

执行这个命令后,chatter topic 将接收到一个字符串类型的消息,内容为 “Hello, world!”,并且这将会以每秒一次的速率向 chatter topic 发布消息。
在这里插入图片描述
新打开一个终端可以看到新增了一个话题chatter,然后将此话题的内容打印出来如下所示。
在这里插入图片描述

3.rosmsg

rosmsg是用于显示有关 ROS消息类型的 信息的命令行工具。

🎨rosmsg list

rosmsg list用于列出所有可用的消息类型。

rosmsg list 

在这里插入图片描述### 🎡rosmsg info

rosmsg info显示消息信息。
指令格式:

rosmsg info [message-type]
  • [message-type] 是你想要查询信息的 ROS 消息类型。
    在这里插入图片描述
    这是消息类型就是上面 /turtle1/cmd_vel话题的,其消息格式如上所示。这条消息包含两个内容,六个参数。第一个内容 linear 是线速度,第二个内容 angular 是角速度。线速度用于控制乌龟的前进与后退;角速度用于控制乌龟的旋转方向.

🧶rosmsg show

rosmsg show显示信息描述。
指令格式:

rosmsg show [message-type]
  • [message-type] 是你想要查询信息的 ROS 消息类型。

在这里插入图片描述

4.rosservice

rosservice包含用于列出和查询ROSServices的rosservice命令行工具。调用部分服务时,如果对相关工作空间没有配置 path,需要进入工作空间调用 source ./devel/setup.bash

🧵rosservice list

rosservice list 用于列出当前正在运行的 ROS 服务及其相关信息
指令格式:

rosservice list

在这里插入图片描述

🍬rosservice type

rosservice type用于查看服务的类型信息。
指令格式:

rosservice type [service-name]

在这里插入图片描述

🍭rosservice info

rosservice info主要用于获取关于特定服务的详细信息,如服务的类型、服务器的接口、服务调用的时间等。

rosservice info [service-name]

在这里插入图片描述

🍡rosservice args

rosservice args 用于查看服务请求的参数。
指令格式:

rosservice args [service-name]

在这里插入图片描述

🧁rosservice call

rosservice call用于从命令行发起服务调用。它允许你在不编写代码的情况下,通过发送服务请求来执行远程过程调用(RPC)。
指令格式如下:

rosservice call [service-name] arg1=value1 arg2=value2 ...

5.rossrv

rossrv是用于显示有关ROS服务类型的信息的命令行工具,与 rosmsg 使用语法高度雷同。

🍫rossrv list

rossrv list 用于列出可用服务信息。

rossrv list

在这里插入图片描述

🍧rossrv info

rossrv info 是用于显示关于特定服务的详细信息,包括服务的类型、参数和服务提供者的信息。
指令格式

rossrv info [service-name]

在这里插入图片描述

🍹rossrv show

rossrv show显示服务消息详情的。
指令格式

rossrv show [service-name]

在这里插入图片描述

6.rosparam

rosparam包含rosparam命令行工具,用于使用YAML编码文件在参数服务器上获取和设置ROS参数。

🌺rosparam list

rosparam list 用于列出所有可用的参数。
指令格式:

rosparam list

在这里插入图片描述

🌻rosparam get

rosparam get 用于获取参数值。

rosparam get [param-service]

在这里插入图片描述

🌼rosparam set

rosparam set用于设置或者修改参数值。

rosparam set [param-service]  [value]

在这里插入图片描述

🌷rosparam delete

rosparam delete 用于删除参数。

rosparam delete [param-service]

在这里插入图片描述

🥀rosparam load

rosparam load 用于从 YAML 文件中加载参数到当前的 ROS 命名空间中。这个命令对于在节点启动时加载配置非常有用,它可以替代在代码中硬编码参数的做法,使得参数配置更加灵活和可配置。
指令格式:

rosparam load [file]

  • file 是包含参数的 YAML 文件路径

🌸rosparam dump

rosparam dump 用于将当前命名空间下的所有参数以 YAML 格式导出到一个文件中。这个命令对于备份参数、保存配置或在不同环境之间迁移参数非常有用。
指令格式:

rosparam dump  [file]
  • file 是导出参数的 YAML 文件路径

结束语

感谢阅读吾之文章,今已至此次旅程之终站 🛬。

吾望斯文献能供尔以宝贵之信息与知识也 🎉。

学习者之途,若藏于天际之星辰🍥,吾等皆当努力熠熠生辉,持续前行。

然而,如若斯文献有益于尔,何不以三连为礼?点赞、留言、收藏 - 此等皆以证尔对作者之支持与鼓励也 💞。

  • 25
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用Python和ROS进行边缘检测,可以使用OpenCV库来实现。以下是一个简单的例子,使用ROS和Python来实现基于Canny算法的边缘检测。 首先,需要安装OpenCV库和ROS的cv_bridge库。可以使用以下命令进行安装: ``` sudo apt-get install python-opencv sudo apt-get install ros-<your-ros-version>-cv-bridge ``` 接下来,创建一个ROS节点,并在其中读取图像并进行边缘检测。以下是一个示例代码: ```python #!/usr/bin/env python import rospy from sensor_msgs.msg import Image from cv_bridge import CvBridge import cv2 class EdgeDetector: def __init__(self): rospy.init_node('edge_detector') self.bridge = CvBridge() self.image_sub = rospy.Subscriber('/camera/image', Image, self.callback) self.image_pub = rospy.Publisher('/camera/edge_image', Image, queue_size=1) def callback(self, data): cv_image = self.bridge.imgmsg_to_cv2(data, 'bgr8') gray_image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray_image, 100, 200) edge_image = self.bridge.cv2_to_imgmsg(edges, 'mono8') self.image_pub.publish(edge_image) if __name__ == '__main__': try: detector = EdgeDetector() rospy.spin() except rospy.ROSInterruptException: pass ``` 在上面的代码中,我们首先初始化ROS节点并创建一个订阅器,用于从摄像头读取图像。然后,我们使用cv_bridge库将ROS图像消息转换为OpenCV格式,并将其转换为灰度图像。最后,我们使用Canny算法检测边缘,并将结果转换回ROS图像消息,并通过一个ROS发布器发布出去。 你可以在catkin工作空间下创建一个包来组织这个节点。在src文件夹下创建一个名为edge_detector.py的文件,并将上述代码复制到该文件中。在catkin工作空间下编译该包,然后运行该节点即可进行边缘检测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super.Bear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值