地图
地图相关的消息主要有两个:
nav_msgs/MapMetaData
- 地图元数据,包括地图的宽度、高度、分辨率等。
nav_msgs/OccupancyGrid
- 地图栅格数据,一般会在rviz中以图形化的方式显示。
nav_msgs/MapMetaData
调用rosmsg info nav_msgs/MapMetaData
显示消息内容如下:
time map_load_time
float32 resolution #地图分辨率
uint32 width #地图宽度
uint32 height #地图高度
geometry_msgs/Pose origin #地图位姿数据
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w
nav_msgs/OccupancyGrid
调用 rosmsg info nav_msgs/OccupancyGrid
显示消息内容如下:
std_msgs/Header header
uint32 seq
time stamp
string frame_id
#--- 地图元数据
nav_msgs/MapMetaData info
time map_load_time
float32 resolution
uint32 width
uint32 height
geometry_msgs/Pose origin
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w
#--- 地图内容数据,数组长度 = width * height
int8[] data
地图pgm文件中的每个像素的染色亮度值将被map_server读取并转换为nav_msgs::msg::OccupancyGrid类型中的栅格值,存储在data成员变量中;
地图图片中每个像素可能有多个颜色通道。比如:RGB。像素的明暗程度值是通过求取各个颜色通道的明暗程度值得到的。像素的明暗程度值的范围在0~1.0。
-
地图中的每一个像素通道取值在 [0,255] 之间,白色为 255,黑色为 0,透明度通道为0代表完全透明,1代表完全不透明
-
首先计算像素明暗程度shade,方法是对于每一个像素的所有通道取平均:
p r = c o l o r . r e d 255.0 p g = c o l o r . g r e e n 255.0 p b = c o l o r . b l u e 255.0 p a = 1 − c o l o r . a l p h a d a r k = p a + p b + p c + p a 4 l i g h t = 1 − d a r k p_r = \dfrac{color.red}{ 255.0 }\\ p_g = \dfrac{color.green}{ 255.0 }\\ p_b = \dfrac{color.blue}{ 255.0 }\\ p_a = 1-color.alpha\\ dark=\dfrac{p_a+p_b+p_c+p_a}{4}\\ light=1-dark\\ pr=255.0color.redpg=255.0color.greenpb=255.0color.bluepa=1−color.alphadark=4pa+pb+pc+palight=1−dark
-
地图内容数据的转换格式
-
trinary模式
p = { d a r k n e g a t e = 0 l i g h t n e g a t e = 1 d a t a = { 0 p < f r e e _ t h r e s h 100 p > o c c u p i e d _ t h r e s h − 1 O t h e r w i s e p=\begin{cases} dark & negate=0\\ light & negate=1 \end{cases}\\ data= \begin{cases} 0&p<free\_thresh\\ 100&p>occupied\_thresh\\ -1&Otherwise \end{cases} p={darklightnegate=0negate=1data=⎩ ⎨ ⎧0100−1p<free_threshp>occupied_threshOtherwise -
scale模式 如果透明度不是1则
p = { d a r k n e g a t e = 0 l i g h t n e g a t e = 1 d a t a = { − 1 c o l o r . a l p h a ! = 1 0 p < f r e e _ t h r e s h 100 p > o c c u p i e d _ t h r e s h 100 × p − f r e e _ t h r e s h o c c u p i e d _ t h r e s h − f r e e _ t h r e s h O t h e r w i s e p=\begin{cases} dark & negate=0\\ light & negate=1 \end{cases}\\ data= \begin{cases} -1 & color.alpha!=1\\ 0 & p<free\_thresh\\ 100 & p>occupied\_thresh\\ 100\times\dfrac{p-free\_thresh}{occupied\_thresh-free\_thresh} & Otherwise \end{cases} p={darklightnegate=0negate=1data=⎩ ⎨ ⎧−10100100×occupied_thresh−free_threshp−free_threshcolor.alpha!=1p<free_threshp>occupied_threshOtherwise
-
raw模式(negate参数不影响)
p = r o u n d ( l i g h t × 255 ) ( i n a b s o l u t e v a l u e ) d a t a = { p 0 ⩽ l i g h t ⩽ 100 − 1 l i g h t ⩾ 101 p={\rm round}(light \times 255)\ (in\ absolute\ value) \\ data= \begin{cases} p & 0 \leqslant light \leqslant 100\\ -1 & light \geqslant 101 \end{cases} p=round(light×255) (in absolute value)data={p−10⩽light⩽100light⩾101
-
where free_thresh
and occupied_thresh
thresholds are expressed in percentage of maximum lightness/darkness level (255
).
里程计
里程计相关消息是:nav_msgs/Odometry,调用rosmsg info nav_msgs/Odometry
显示消息内容如下:
std_msgs/Header header
uint32 seq
time stamp
string frame_id
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/Pose pose #里程计位姿
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w
float64[36] covariance
geometry_msgs/TwistWithCovariance twist
geometry_msgs/Twist twist #速度
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
# 协方差矩阵
float64[36] covariance
坐标变换
坐标变换相关消息是: tf/tfMessage
和tf2_msgs/TFMessage
,两者是一样的,调用rosmsg info tf/tfMessage
显示消息内容如下:
geometry_msgs/TransformStamped[] transforms #包含了多个坐标系相对关系数据的数组
std_msgs/Header header
uint32 seq
time stamp
string frame_id
string child_frame_id
geometry_msgs/Transform transform
geometry_msgs/Vector3 translation
float64 x
float64 y
float64 z
geometry_msgs/Quaternion rotation
float64 x
float64 y
float64 z
float64 w
定位
定位相关消息是:geometry_msgs/PoseArray,调用rosmsg info geometry_msgs/PoseArray
显示消息内容如下:
std_msgs/Header header
uint32 seq
time stamp
string frame_id
geometry_msgs/Pose[] poses #预估的点位姿组成的数组
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w
路径规划
目标点相关消息是:move_base_msgs/MoveBaseActionGoal,调用rosmsg info move_base_msgs/MoveBaseActionGoal
显示消息内容如下:
std_msgs/Header header
uint32 seq
time stamp
string frame_id
actionlib_msgs/GoalID goal_id
time stamp
string id
move_base_msgs/MoveBaseGoal goal
geometry_msgs/PoseStamped target_pose
std_msgs/Header header
uint32 seq
time stamp
string frame_id
geometry_msgs/Pose pose #目标点位姿
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w
路径规划相关消息是:nav_msgs/Path,调用rosmsg info nav_msgs/Path
显示消息内容如下:
std_msgs/Header header
uint32 seq
time stamp
string frame_id
geometry_msgs/PoseStamped[] poses #由一系列点组成的数组
std_msgs/Header header
uint32 seq
time stamp
string frame_id
geometry_msgs/Pose pose
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w
激光雷达
激光雷达相关消息是:sensor_msgs/LaserScan,调用rosmsg info sensor_msgs/LaserScan
显示消息内容如下:
std_msgs/Header header
uint32 seq
time stamp
string frame_id
float32 angle_min #起始扫描角度(rad)
float32 angle_max #终止扫描角度(rad)
float32 angle_increment #测量值之间的角距离(rad)
float32 time_increment #测量间隔时间(s)
float32 scan_time #扫描间隔时间(s)
float32 range_min #最小有效距离值(m)
float32 range_max #最大有效距离值(m)
float32[] ranges #一个周期的扫描数据
float32[] intensities #扫描强度数据,如果设备不支持强度数据,该数组为空