ROS安装命令
参考:Ubuntu20.04.4安装ROS Noetic详细教程 - 知乎
安装C++和Python3
sudo apt-get install g++
sudo apt-get install python3
ROS运行小海龟仿真器
roscore | 确定ROS是否运行成功 |
rosrun turtlesim turtlesim_node | 运行小海龟仿真器 |
rosrun turtlesim turtle_teleop_key | 启动小海龟控制 |
工作空间
创建工作空间WorkSpace
mkdir -p ../catkin_ws/src
cd ../catkin_ws/src
catkin_init_workspace
编译工作空间
cd ../catkin_ws
catkin_make
catkin_make install
设置环境变量
source devel/setup.bash
检查环境变量 echo $ROS_PACKAGE_PATH
创建功能包
功能包放到src文件夹中
cd ../catkin_ws/src
catkin_create_pkg 功能包名称test_pkg 依赖std_msgs roscpp rospy
编译功能包
cd ../catkin_ws
catkin_make
source ../catkin_ws/devel/setup.bash
直接配置source
gedit ~/.bashrc
最下方添加 source ~/catkin_ws/devel/setup.bash
广播模型执行命令
执行命令
roscore
rosrun turtlesim turtlesim_node
rosrun 功能包 turtle_tf_broadcaster节点名 __name:=turtle1_tf_broadcaster /turtle1
rosrun 功能包 turtle_tf_broadcaster节点名 __name:=turtle2_tf_broadcaster /turtle2
rosrun 功能包 turtle_tf_listener
rosrun turtlesim turtle_teleop_key
学习资源
机器人命令调试方法整理
机器人use_cam功能包话题
Move_base自主导航原理
Limo机器人命令
差速运动控制
- $ roslaunch limo_base limo_base.launch 启动底盘
- $ roslaunch limo_bringup limo_teleop_keyboard.launch 启动键盘操控
- roslaunch 一次启动多个节点命令
- rosnode list 查看节点
- rosnode info /节点名 查看指定节点信息
- rostopic list 查看话题列表
- rostopic pub -r 10 /cmd_vel geometry_msgs/Twist ''linear: x y z angular:x y z
- rostopic echo /odom 订阅odom话题
机器人发布话题,走圆形
- Publisher(draw_circle)--Message(geometry_msg/Twist)--Topic(cmd_vel)--Message(geometry_msg/Twist)--Subscribe(limo_base_node)
- 移动机器人有节点(subscriber)limo_base_node订阅了Topic(cmd_cel),话题类型Message为geometry_msg/Twist
- 检测机器人的运行速度
- Publisher(limo_base_node)--Message(nav_msgs/Odometry)--Topic(odom)--Message(nav_msgs/Odometry)--Subscriber(limo_subscriber)
移动机器人分布式通信
- 编辑终端配置文件
- $ gedit ~/.bashrc
- 将机器人配置为主机
- ROS_MASTER_URI(机器人IP+默认端口11311)、ROS_HOSTNAME(当前系统主机名)、ROS_IP(当前系统的IP地址)均设置为机器人IP即可
- 将笔记本配置为从机
- ROS_MASTER_URI(设置为机器人IP)、ROS_HOSTNAME和ROS_IP设置为电脑IP
分布式控制
机器人端——$ roslaunch limo_base limo_base.launch
笔记本端——$ roslaunch limo_bringup limo_teletop_keyboard.launch
控制机器人圆周运动
机器人端——$ roslaunch limo_bringup limo_start.launch 订阅者在机器人
笔记本端——$ rosrun limo_demo draw_circle.py 发布者cmd_vel
查看机器人实时位置
机器人端——$ roslaunch limo_bringup limo_start.launch 机器人发布位姿话题
笔记本端——$ roslaunch limo_bringup limo_teletop_keyboard.launch 键盘控制
笔记本端——$ rosrun limo_demo limo_subscriber.py 笔记本订阅机器人的位姿话题
机器视觉原理
图像采集—————————图像分析—————————控制输出
光源强化检测特征 提取图像特征 I/O控制
相机镜头捕捉特征 图像特征分析 运动控制
光学图像转为数字图像 图像数据标定 可视化显示
光源-镜头、图像传感器(CCD/CMOS)、光束控制单元
光学信号转为数字信号
照明 相机(2D/3D)
安装ROS USB相机的驱动包
- sudo apt-get install ros-noetic-usb-cam
- roslaunch usb_cam usb_cam-test.launch
- rqt_image_view
三维结构光相机——RealScene
https://github.com/intel-ros/realsense/releases
安装SDK
$ mkdir build
cd build
cmake ..
make
sudo make install
安装ROS驱动
https://github.com/IntelRealSense/librealsense/releases
$ catkin_make-DCATKIN_ENABLE_TESTING=False -DCMAKE_BUILD_TYPE=Release
catkin_make install
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrcsource ~/.bashrc
点云可视化
roslaunch realsense2_camera rs_rgbd.launch
rosrun rviz rviz
通过rviz可以查看三维点云信息
安装OpenCV
$ sudo apt-get install ros-noetic-vision-opencv libopencv-dev python3-opencv
OpenCV ROS
OpenCV IpIImage <——>CvBridge<->ROS Image Message
获取HSV值
- 启动机器人的摄像头
- roslaunch astra_camera dabai_u3.launch
- 使用rqt查看图像并保存
- rqt_image_view
- 预制了hsv检测工具,检测hsv值
- roscd limo_visions/scripts/ && python hsv_test.py
物体识别与追踪
$ roslaunch limo_visions follow.launch
<launch>
<include file=$(find limo_base)/launch/limo_base.launch/> 启动机器人的底盘
<include file=$(find astra_camera)/launch/dabai_u3.launch/> 启动机器人摄像头
<node name="object_detect" pkg="limo_visions" type="object_detect.py" output="screen"/> 启动机器人跟随控制节点
<node name="follow_object" pkg="limo_visions" type="follow.py" output="screen"/>
</launch>
二维码识别与跟踪
ALVAR——虚拟现实和增强现实的跨平台开源计算机视觉库,由C++编写,提供C++接口
安装ar-track-alvar
$ sudo apt-get install ros-melodic-ar-track-alvar
创建二维码
$ rosrun ar_track_alvar createMarker -s 5 0 (5是二维码的尺寸为5cm,0为保存的内容)
启动摄像头
roslaunch artra_camera dabai_u3.launch
启动二维码识别
roslaunch limo_vision ar_code.launch
查看识别到的二维码的位姿
rostopic echo /ar_pose_marker
二维SLAM地图构建
Gmapping功能包 粒子滤波算法,将定位与建图过程分离,先定位后建图,适合小场景环境下地图信息
基于激光雷达,Rao-Blackwellized粒子滤波算法,二维栅格地图,需要机器人提供里程计信息,OpenSlam开源算法
输出地图话题
nav_msgs/OccupancyGrid
即时定位与地图建模(gmapping) 深度信息、IMU信息、里程计信息->栅格地图
Gmapping中的话题和服务
Topic订阅
名称 类型 描述
tf tf/tfMessage 用于激光雷达坐标系,基坐标系,里程计坐标系之间的变换
scan sensor_msgs/LaserScan 激光雷达扫描数据
Topic发布
map_metadata nav_msgs/MapMetaData 发布地图Meta数据
map nav_msgs/OccupancyGrid 发布地图栅格数据
~entropy std_msgs/Float64 发布机器人姿态分布熵的估计
Service
dynamic_map nav_msgs/GetMap 获取地图数据
Gmapping中的TF变换
必须的TF变换 <scan frame> -> base_link 激光雷达坐标系与基坐标系之间的变换,一般由robot_state_publisher或static_transform_publisher发布
base_link -> odom 基坐标系与里程计坐标系之间的变换,一般由里程计节点发布
发布的TF变换 map -> odom 地图坐标系与机器人历程坐标系之间的变换,估计机器人在地图中的位姿
base_link 固定在机器人的中心;odom 里程计坐标系;map 地图坐标系 表示全局定位过程中的参考系
配置gampping节点
limo_bringup/launch/limo_gampping.launch
<launch>
<node pkg="robot_pose_ekf" name="robot_pose_ekf" type="robot_pose_ekf"> 卡尔曼滤波,对里程计信息做滤波,提高里程计数据稳定性
<param name="output_frame" value="odom">
<param name="base_footprint_frame" value="base_link"/>
</node>
<node pkg="gmapping" type="slam_gmapping name="slam_gmapping" output="screen">
<param> ......
</node>
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find limo_bringup)/rviz/gmapping.rviz">
</node>
</launch>
gmapping 地图构建
roslaunch limo_bringup limo_start.launch pub_odom_tf:=false 启动机器人底盘
roslaunch limo_bringup limo_gmapping.launch 启动建图的gmapping文件
roslaunch limo_bringup limo_teletop_keyboard.launch 启动键盘控制节点
保存地图
cd /agilex_ws/limo_bringup/maps/
rosrun map_server map_saver -f map1 map_saver:地图保存节点 map1:地图文件名
Cartographer功能包 大场景
2016年10月5日,谷歌开源,基于图网络的优化SLAM方法
二维或三维条件下的定位及建图功能
设计目的是在计算资源有限的情况下,实时获取相对较高精度的地图
主要基于激光雷达
后续会支持更多传感器和机器人平台,同时不断增加新的功能
Local SLAM 建立子图(栅格地图),通过匹配算法将位置插入到子图,但会产生累计误差——生成一个一个拼图块
Global SLAM 闭环检测,消除累计误差——完成整个拼图
配置cartographer节点
limo_bringup/launch/limo_cartographer.launch
<launch>
<param name="/use_sim_time" value="false"> 设置当前使用系统的真实时间
订阅雷达数据和完成子图的创建,使用Lua脚本配置算法参数
<node name="cartographer_node" pkg="cartographer_ros" type="cartographer_node" args="-configuration_directory $(find limo_bringup) /param-configuration_basename build_map_2d.lua">
<remap from="horizontal_laser_2d" to="scan" />
</node>
子图合并为占用栅格地图,生成SLAM建图的结果
<node name="cartographer_occupancy_grid_node" pkg="cartographer_ros" type="cartographer_occupancy_grid_node" args="-resolution 0.05" />
rviz上位机,方便实时看到SLAM的过程
<node name="rviz" pkg="rviz" type="rviz" required="true" args="-d $(find limo_bringup)/rviz/cartographer.rviz" />
</launch>
cartographer
roslaunch limo_bringup limo_start.launch pub_odom_tf:=false 启动机器人底盘
roslaunch limo_bringup limo_cartographer.launch 运行cartographer地图构建算法和Rviz上位机
roslaunch limo_bringup limo_teletop_keyboard.launch 运行键盘控制节点
保存地图
rosservice call /finish_trajectory 0 调用服务,告诉cartographer结束建图
rosservice call /write_state "{filename:'${HOME}/agilex_ws/src/limo_ros/limo_bringup/maps/mymap.pbstream'}"
rosrun cartographer_ros cartographer_pbstream_to_ros_map -map_filestem=${HOME}/agilex_ws/src/limo_ros/limo_bringup/maps/mymap
-pbstream_filename=${HOME}/agilex_ws/src/limo_ros/limo_bringup/maps/mymap.pbstream -resolution=0.05
生成地图文件名称;上一步创建好的原始地图数据;生成栅格地图的分辨率,0.05表示5cm
三维SLAM地图构建
RTAB-Map功能包
具有实时约束的全局闭环检测器的RGB-D SLAM方法
基于全局贝叶斯闭环检测器
定位点创建->权值更新->贝叶斯过滤器更新->闭环假设选择->取回->转移
可单独使用RGB-D摄像头建图或和二维/三维激光雷达共同建图
地图构建 rtabmap
roslaunch limo_bringup limo_start.launch pub_odom_tf:=true
roslaunch astra_camera dabai_u3.launch
roslaunch limo_bringup limo_rtabmap_orbbec.launch 启动RTAB算法节点
roslaunch limo_bringup rtabmap_rviz.launch
roslaunch limo_bringup limo_teletop_keyboard.launch
查看建图结果
rtabmap-databaseViewer ~/.ros/rtabmap.db
移动机器人自主导航
目标点、全局最优路径、动态避障、定位粒子云、本地代价地图
原理
Goal -> AMCL -> Path Planner -> move_base -> /cmd_vel+/odom -> Base Controller -> Motor Speeds
导航目标点 AMCL全局定位算法 全局路径规划 本地规划器 运动速度 指令发给底盘,控制机器人电机按照某一速度运动
move_base功能包
Action订阅 move_base/goal move_base_msgs/MoveBaseActionGoal move_base的运动规划目标
move_base/cancel actionlib_msgs/GoalID 取消特定目标的请求
Action发布 move_base/feedback move_base_msgs/MoveBaseActionFeedback 反馈信息,含有机器人底盘的坐标
move_base/status actionlib_msgs/GoalStatusArray 发送到move_base的目标状态信息
move_base/result move_base_msgs/MoveBaseActionResult 此处move_base操作的结果为空
Topic订阅 move_base_simple/goal geometry_msgs/PoseStamped 为不需要追踪目标执行状态的用户,提供一个非action接口
Topic发布 cmd_vel geometry_msgs/Twist 输出到机器人底盘的速度命令
Service ~make_plan nav_msgs/GetPlan 允许用户从move_base获取给定目标的路径规划,但不会执行该路径规划
~clear_unknown_space std_srvs/Empty 允许用户直接清除机器人周围的未知空间。适合于costmap停止很长时间后,在一个全新环境中重新启动时使用
~clear_costmaps std_srvs/Empty 允许用户命令move_base节点清除costmap中的障碍。这可能会导致机器人撞上障碍物,请谨慎使用
蒙特卡罗定位方法
二维环境定位
针对已有地图使用粒子滤波器跟踪一个机器人的姿态
环境信息(Map)传感器数据(Scan)航程信息(Odom)初始位姿(Initial Pose)->运动模型 传感器模型 蒙特卡洛航位推算 采用(重采样)算法 -> 偏航校准(TF)粒子分布(Particle Cloud)位姿优化(Filtered Pose)
移动机器人差速导航
roslaunch limo_bringup limo_start.launch pub_odom_tf:=false
roslaunch limo_bringup limo_navigation_diff.launch
全向导航
roslaunch limo_bringup limo_start.launch pub_odom_tf:=false
roslaunch limo_bringup limo_navigation_mcnamu.launch
阿克曼导航
roslaunch limo_bringup limo_start.launch pub_odom_tf:=false
roslaunch limo_bringup limo_navigation_ackerman.launch
launch文件中包含:里程计滤波节点、amcl定位节点、map_server地图服务器节点、move_base导航节点、rivz可视化节点