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