ros学习
根据B站up主:机器人工匠阿杰
VScode
消除错误提示
ctrl+shift+P---->error squiggles---->禁用错误波形曲线
依赖项
Topic话题和Message消息
1、话题Topic是节点间进行持续通讯的一种形式
2、话题通讯的两个节点通过话题的名称建立起话题通讯连接
3、话题通讯的数据叫Message
4、消息通常会通过一定的频率持续不断地发送
publisher
subscriber
5、一个ros节点网络中,可以同时存在多个话题
6、一个话题可以有多个发布者,也可以有多个订阅者
7、一个节点可以对多个话题进行订阅,也可以发布多个话题
8、不同的传感器消息通常会拥有各自独立的话题名称,每个话题只有一个发布者
9、机器人速度指令话题通常会有多个发布者,但是同一时间只能有一个发布者
10、launch文件
<launch>
<node pkg="ssr_pkg" type="yao_node" name="yao_node"/>
<node pkg="ssr_pkg" type="chao_node" name="chao_node" launch-prefix="gnome-terminal -e" /> //单独输出在一个终端窗口
<node pkg="atr_pkg" type="ma_node" name="ma_node" output="screen"/>
</launch>
运动控制(矢量运动和旋转运动的结合)
1、矢量运动(上下前后左右)
2、旋转运动(左右旋转,翻滚,前倾,后仰等)
3、右手坐标(食指(指向机器人正前方)x,中指y,拇指z),旋转坐标(握拳,拇指指向x正方向,其他四指是滚转正方向,其他类似)
4、geometry_msgs/twist.msg
5、机器人核心节点
借助仿真wpr_simulation
roslaunch wpr_simulation wpb_simple.launch
rosrun wpr_simulation demo_vel_ctrl
------------------------------------
速度控制节点-->速度控制话题/cmd_vel-->机器人核心节点
- 构建一个新软件包,包名vel_pkg
- 在软件包中新建一个节点,vel_node
- 在节点中,NodeHandle申请发布话题/cmd_vel,并拿到发布对象vel_pub
- 构建一个geometry_msgs/twist类型的消息包vel_msg,用来承载要发送的的速度值
- 构建循环,不停的使用vel_pub发布速度包vel_msg
#include "ros/ros.h"
#include "geometry_msgs/Twist.h"
int main(int argc, char *argv[])
{
ros::init(argc,argv,"vel_node");
ros::NodeHandle n;
ros::Publisher vel_pub = n.advertise<geometry_msgs::Twist>("/cmd_vel",10);
geometry_msgs::Twist vel_msg;
vel_msg.linear.x = 0.1;
vel_msg.linear.y = 0;
vel_msg.linear.z = 0;
vel_msg.angular.x = 0;
vel_msg.angular.y = 0;
vel_msg.angular.z= 0;
ros::Rate r(30);
while (ros::ok())
{
vel_pub.publish(vel_msg);
r.sleep();
}
return 0;
}
激光雷达
使用RViz观测传感器数据
ROS系统中的激光雷达消息包格式
激光雷达节点-(sensor_msgs::LaserScan)--雷达数据话题-(sensor_msgs::LaserScan)--数据获取节点
1、构建新的软件包lidar_pkg
2、创建节点lidar_node
3、申请订阅话题/scan,设置回调函数LidarCallback
4、ROS_INFO
#include "ros/ros.h"
#include "sensor_msgs/LaserScan.h"
void LidarCallback(const sensor_msgs::LaserScan lidar_msgs)
{
float fMidDist = lidar_msgs.ranges[180];
ROS_INFO("前方测距 range[180] = %f m", fMidDist);
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"lidar_node");
ros::NodeHandle n;
ros::Subscriber lidar_sub = n.subscribe("/scan",10, LidarCallback);
ros::spin();
return 0;
}
激光雷达避障
激光雷达节点---雷达数据话题---雷达避障节点---速度控制话题---机器人底盘节点
1、NodeHandle发布速度控制话题/cmd_vel
2、构建速度控制包vel_cmd
3、根据激光雷达的测距值,实时调整机器人运动速度,避开障碍物
ROS 中的 IMU 惯性测量单元消息包
sensor_msgs/Imu.msg
加速度
标准消息包
标准消息包std_msgs
- Bool
- Byte
- ...
-
常规消息包common_msgs
- 几何消息包geometry_msgs
-加速度,惯量,四元数,三维矢量。。。
- 导航消息包nav_msgs
- 传感器消息包sensor_msgs
- 激光雷达,立体相机,运动关节
- 自定义消息类型
自定义消息类型在c++节点
栅格地图格式
SLAM
Hector_Mapping
激光雷达节点-->雷达话题数据/scan-->SLAM节点-->/map地图数据话题-->Rviz
参数:
(https://wiki.ros.org/hector_mapping)
```yaml
<launch>
<include file = "$(find wpr_simulation)/launch/wpb_stage_slam.launch" />
<node pkg = "hector_mapping" type= "hector_mapping" name= "hector_mapping" >
<param name = value = />
...
</node>
<node pkg = "rviz" type= "rviz" name= "rviz" />
<node pkg = "rqt_rboot_steering" type= "rqt_rboot_steering" name= "rqt_rboot_steering" />
</launch>
未完。。。学习中