☰
ROS1学习笔记
2026/10/14 7:46:42 网站建设 项目流程

ROS的基本单元:node节点和package包

node节点:GMapping 管建图;Move-base管导航;wpb_core控制底盘;rplidar_ros驱动雷达

package包(节点的容器):将节点规整起来形成包

第一个node节点

创建package包

按ctrl+alt+t

创建在~/catkin_ws/src文件夹里

catkin_create_pkg<包名><依赖项列表>

回访依赖项

指令:roscd在终端中进入指定软件包的文件地址

创建Node节点

源码编译

add_executable(chao_node src/chao_node.cpp)

chao_node:可执行文件的名字;src/ssr_pkg_node.cpp:指定从哪个代码文件进行编译

快捷键

ctrl+s:保存 ;ctrl+shift+B:编译;ctrl+Alt+T:打开终端;ctrl+shift+O:打开新终端

运行Node节点

1.打开终端,启动ROS系统核心,在终端里执行指令:roscore

2.确认ROS核心处于运行状态,终端执行:rosrun<包名><节点文件名>

总结

总框架:1.使用catkin_create_pkg创建一个软件包

2.在软件包的src文件夹下创建一个节点的cpp源码文件

3.在节点的源码文件中include包含ROS的头文件

4.构建一个main函数,并在函数的开头执行ros::init()

5.构建while循环,循环条件为ros::ok()

6.在CMakeLists.txt中设置节点源码的编译规则

7.编译运行

ROS的只要通讯方式:Topic话题与Message消息

Topic话题

1.话题Topic是节点间进行持续通讯的一种形式

2.话题通讯的两个节点通过话题的名称建立起话题通讯连接

3.话题通讯的数据叫做消息Message

4.消息Message通常会按照一定的频率持续不断的发送,以保证消息数据的实时性

5.消息的发送方叫做话题的发布者Publisher

6.消息的接收方叫做话题的订阅者Subsciber

补充:1.一个ROS节点网络中可以同时存在多个话题

2.一个话题可以有多个发布者,也可以有多个订阅者

3.一个节点可以对多个话题进行订阅,也可以发布多个话题

4.不同的传感器消息通常会拥有各自独立话题名称,每个话题只有一个发布者

5.机器人速度指令话题通常会有多个发布者,但同一时间只能有一个发言人

Message消息

消息的格式有多种,用来满足不同的数据传输要求,在生成消息包是要指定消息的类型

在ROS中使用C++编写Publisher发布者节点

发布者的代码实现

nh.advertisse("话题名称”,缓存长度)://构建消息发送对象

运行新节点

先打开终端roscore 再分屏运行节点rosrun ssr_pkg chao_node 再分屏rostopic list(查看名称)rostopic echo /话题名称(查看消息内容)再分屏 echo -e 复制上面代码

控制循环频率的工具:

总结

1.确定话题名称和消息类型

2.在代码文件中include消息类型对应的头文件

3.在main函数中通过NodeHandler大管家发布一个话题并得到消息发送对象

4.生成要发送的信息包并进行发送数据的赋值

5.调用消息发送对象的publish()函数将消息包发送到话题当中

常用工具

rostopic list :列出当前系统中所有活跃着的话题

rostopic echo 主题名称 :显示指定话题中发送的信息包内容

rostopic hz 主题名称:统计指定话题中信息包发送频率

在ROS中使用C++编写Subscriber订阅者节点

创建订阅者节点

编译和运行

打开终端第一个窗口roscore; ctrl+shift+O:打开新终端rosrun ssr_pkg chao_node;再分屏rosrun atr_pkg ma_node

调整和优化

小结

1.确定话题名称和消息类型

2.在代码文件中include<ros.h>和消息类型对应的头文件

3.再main函数中通过NodeHandler大管家订阅一个话题并设置消息接收回调函数

4.定义一个回调函数,对接收到的信息包进行处理

5.main函数中需要执行ros::spinOnce(),让回调函数能够响应接收到的信息包

常用工具

rqt_graph:图形化显示当前系统活跃的节点以及节点间的话题通讯关系

在ROS中使用lunch文件依次启动多个节点

使用launch文件启动节点

XML语法

<标记名称 属性名1=“属性值1” ...>内容</标记名称>

编写运行lunch文件

小结

1.使用launch文件,可以通过roslaunch指令一次启动多个节点

2.在launch文件中,为节点添加output="screen"属性,可以让节点信息输出在终端中。(ROS_WARN不受该属性控制)

3.在launch文件中,为节点添加launch-prefix="gnome-terminal -e"属性,可以让节点单独运行在一个独立终端中。

如若找不到文件就执行这个

在ROS中用C++实现机器人运动控制

运动控制的C++实现

实现思路

1.构建一个新的软件包,报名叫做vel_pkg

2.在软件包中新创建一个节点,节点名叫做vel_node

3.在节点中,向ROS大管家NodeHandle申请发布话题/cmd_vel,并拿到发布对象vel_pub

4.构建一个geometry_msgs/Twist类型的信息包vel_msg,用来承载要发送的速度值

5.开启一个while循环,不停的使用vel_pub对象发送速度信息包vel_msg

在ROS中用python实现机器人运动控制

运动控制的python实现

同上

实现思路

1.构建一个新的软件包,报名叫做vel_pkg

2.在软件包中新创建一个节点,节点名叫做vel_node.py

3.在节点中,向ROS大管家rospy申请发布话题/cmd_vel,并拿到发布对象vel_pub

4.构建一个geometry_msgs/Twist类型的信息包vel_msg,用来承载要发送的速度值

5.开启一个while循环,不停的使用vel_pub对象发送速度信息包vel_msg

还要再终端执行

机器人仿真软件进不去就执行这个

在ROS中使用RViz观测传感器数据

使用RViz观测传感器数据

Gazebo是模拟真实机器人发出传感器数据的工具

RViz是接收传感器数据并进行显示的工具

roslaunch wpr_simulation wpb_rviz.launch用来实时调控

ROS系统中的激光雷达消息包格式

激光雷达消息包格式

rostopic echo /scan --noarr

在ROS中用python实现获取激光雷达数据

实现步骤

1.构建一个新的软件包,包名叫做lidar_pkg

2.在软件包中新建一个节点,节点名叫做lidar_node.py

3.在节点中,向ROS大管家rospy申请订阅话题/scan,并设置回调函数为LidarCallback()

4.构建回调函数LidarCallback(),用来接收和处理雷达数据

5.调用longinfo()显示雷达检测到的前方障碍物距离

再打开终端执行

在ROS中用python实现激光雷达避障

实现步骤

1.让大管家rospy发布速度控制话题/cmd_vel

2.构建速度控制消息包vel_cmd

3.根据激光雷达的测距数值,实时调整机器人运动速度,避开障碍物

在ROS中使用python实现IMU数据获取

imu/data_raw(sensor_msgs/lmu):加速度计输出的矢量加速度和陀螺仪输出的旋转角速度

imu/data(sesor_msgs/lmu):/imu/data_raw的数据再加上融合后的四元数姿态描述

imu/mag(sensor_msgs/MagneticField):磁强计输出磁强数据

实现步骤:

1.构建一个新的软件包,包名叫做imu_pkg

2.在文件包中新建一个节点,节点名叫做imu_node.py

3.在节点中,向ros大管家rospy申请订阅话题/imu/data,并设置回调函数为imu_callback()

4.构建回调函数imu_callback(),用来接收和处理IMU数据

5.使用TF工具将四元数转换成欧拉角

6.调用loginfo()显示转化后的欧拉角数值

再执行如下代码

在ros中用python实现IMU航向锁定

实现步骤:

1.让大管家rospy发布速度控制话题/cmd_vel

2.设定一个目标朝向角,当姿态信息中的朝向角和目标朝向角不一致时,控制机器人转向目标朝向角

ROS的标准消息包std_mags

ROS中的几何包geometry_msgs和传感器包sensor_msgs

ROS中生成自定义消息类型

生成自定义消息的步骤

1.构建新软件包,依赖项message_generation、message_runtime.

2.软件包添加msg目录,新建自定义消息文件,以.msg结尾

3.在CMakeLists.txt中,将新建的.msg文件加入add_message_files()

4.在CMakeLists.txt中,去掉generate_messages()注释符号,将依赖的其他消息包名称添加进去

5.在CMakeLists.txt中,将message_runtime加入catkin_package()的CATKIN_DEPENDS

6.在packkage.xml中,将message_generation、message_runtime加入<build_depend>和<exec_depend>

7.编译软件包,生成新的自定义消息类型

在ROS中使用自定义消息类型(C++节点)

新消息类型在C++节点的应用

1.在节点代码中,先include新消息类型的头文件

2.在发布或订阅话题的时候,将话题中的消息类型设置为新的消息类型

3.按照新的消息结构,对消息包进行赋值发送或读取解析

4.在CMakeList.txt文件的find_package()中,添加新消息包名称作为依赖项

5.在节点的编译规则中,添加一条add_dependencies(),将新消息软件包名称_generate_messages_cpp作为依赖项

6.在package.xml中,将新消息包添加到<build_depend>和<exec_depend>中去

7.运行catkin_make重新编译

在ros中使用C++发布自定义地图

实现步骤

1.构建一个软件包map_pkg,依赖项里加上nav_msgs

2.在map_pkg里创建一个节点map_pub_node

3.在节点中发布话题/map,消息类型为nav_msgs::OccupancyGrid

4.构建一个nav_msgs::OccupancyGrid地图消息包,并对其进行赋值

5.将地图消息包发送到话题/map

6.编译并运行节点

7.启动RViz,订阅话题/map,显示地图

Hector_Mapping初体验

在终端运行这几条代码就可运行

roslaunch wpr_simulation wpb_stage_slam.launch
rosrun hector_mapping hector_mapping
rosrun rviz rviz
rosrun rqt_robot_steering rqt_robot_steering

launch启动Hector_Mapping

Hector_Mapping的参数设置

初识ROS的TF系统

TF主要描述的是两个坐标系的空间关系(坐标系变换)

在终端执行rosrun rqt_tf_tree rqt_tf_tree

launch启动Gmapping建图

Gmapping的参数设置

地图的保存和加载

保存:

先打开终端执行roslaunch slam_pkg gmapping.launch然后再分屏在主目录下执行rosrun map_server map_saver -f map

加载:

在终端先运行roscore再分屏执行rosrun map_server map_server map.yaml

打开rviz就可以看到如下:

Navigation导航系统

结构图:

move_base节点

环境准备工作

先进入工作空间源码目录然后下载工程源代码(git clone https://github.com/6-robot/wpr_simulation.git)进入脚本文件夹(cd wpr_simulation/scripts)执行依赖项安装脚本(./install_for_noetic.sh)回退到工作空间登录(cd ~/catkin_ws)编译(catkin_make)进入工作空间源码目录(cd catkin_ws/src)下载工程源代码(git clone http://github.com/6-robot/wpb_home.git)进入脚本文件夹(cd wpb_home/wpb_home_bringup/scripts)回退到工作空间根目录(cd ~/catkin_ws/)编译(catkin_make)将之前的地图文件复制到下图的文件夹里

导航代码编写

打开终端进入工作空间源码目录创建新的软件包然后编写,编写完之后在终端进行编译(catkin_make)

运行导航程序

运行机器人然后分屏执行roslaunch nav_pkg nav.launch再打开rviz添加如下内容

代价地图Costmap

代价地图的参数设置

DWA规划器

在终端中运行roslaunch wpr_simulation wpb_stage_robocup.launch然后再打开一个窗口运行roslaunch nav_pkg nav.launch

快捷调参的方法在终端运行rosrun rqt_reconfigure rqt_reconfigure

TEB规划器

在终端安装sudo apt install ros-noetic-teb-local-planner

在终端中运行roslaunch wpr_simulation wpb_stage_robocup.launch然后再打开一个窗口运行roslaunch nav_pkg nav.launch

添加path项修改名称:local_plan;修改Line Style为Billboards

添加PoseArray修改名称:第一个

坐标导航的C++编程实现

1.编写节点代码

2.设置编译规则

3.编译节点文件

4.运行节点文件

坐标导航的python编程实现

1.编写节点文件

2.添加可执行权限

3.运行节点文件

航点导航插件介绍

开源ros导航插件

安装依赖项(无报错就是安装成功)

编译源码工程

回到catkin_ws目录然后catkin_make进行编译

运行

航点导航插件的集成和启动

编写代码

运行下面三条指令

航点导航功能的C++实现

编写代码

配置权限

运行下面三条指令

相机图像获取的C++实现

创建一个目录

创建节点

添加编译规则

在17行添加

在120行添加

在末尾添加

运行

在终端输入roslaunch wpr_simulation wpb_balls.launch打开仿真软件

然后再执行

然后开新终端执行rosrun wpr_simulation ball_random_move

颜色目标识别与定位的C++实现

1.颜色空间转换 RGB->HSV

2.二值化 分割提取目标物

3.计算目标物的质心坐标

节点代码

添加编译规则

进行编译

打开终端进入catkin_ws工作空间输入catkin_make进行编译

运行代码

在终端内输入roslaunch wpr_simulation wpb_balls.launch然后分终端框输入rosrun cv_pkg cv_hsv_node

ROS颜色目标跟随的C++实现

节点代码

添加编译规则

进行编译

打开终端进入catkin_ws工作空间输入catkin_make进行编译

运行代码

在终端内输入roslaunch wpr_simulation wpb_balls.launch然后分终端框输入rosrun cv_pkg cv_follow_node

ROS人脸检测的C++实现

节点代码

添加编译规则

进行编译

打开终端进入catkin_ws工作空间输入catkin_make进行编译

运行代码

在终端内输入roslaunch wpr_simulation wpb_balls.launch然后分终端框输入rosrun cv_pkg cv_face_detect

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询