锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

实验二 读取和理解激光雷达数据

时间:2023-02-19 22:30:00 cd22激光传感器

1. 体验内容

(1)为rplidar添加USB权限

注:实验室rplidar A2买得早,硬件版本可能和github程序不匹配,操作错误,解决方案是 Windows 环境登录思兰科技官网下载rplidar A2固件升级程序,连接激光雷达进行固件升级。

将激光雷达连接到计算机并检查识别USB设备

ls -l /dev|grep ttyUSB 

如下图所示rplidar字样,说明需要添加USB默认识别权限,遵循下一个教程。

sudo gedit /etc/udev/rules.d/rapliar.rules 

输入密码打开文件编辑,添加以下内容

KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0666", GROUP:="dialout",  SYMLINK ="rplidar" 

增加当前用户对串口的默认访问权限:

sudo usermod -a -G dialout <你的用户名> 

使UDEV配置生效(使串口默认访问权生效,需要重启机器)

sudo service udev reload sudo service udev restart 

重新插入激光雷达,重新输入指令

ls -l /dev|grep ttyUSB 

此时显示rplidar字样,以rplidar→ttyUSB例如,输入以下指令赋予权限。

sudo chmod 666 /dev/ttyUSB1 

参考博客: https://blog.csdn.net/KEVINZHAO124517/article/details/102137333

(2)下载rplidar_ros进行编译

创造工作空间,进入它src文件夹

git clone https://github.com/Slamtec/rplidar_ros.git cd .. catkin_make 

(3)设置自动映射rplidar端口

更改程序代码中的映射端口号,打开rplidar.launchnode.cpp搜索/dev/ttyUSB0,将数字改为您以前知道的连接端口号。

(4)执行程序

直接运行view_rplidar.launch文件,其中已经包含对激光雷达的启动。

roslaunch rplidar_ros view_rplidar.launch 

可调用rplidar提供的服务/start_motor/stop_motor启动和停止激光雷达,然后通过rviz观看激光雷达数据,注意Fixed Frame改为laser

(5)激光雷达数据结构

rosmsg info sensor_msgs/LaserScan 

返回激光雷达数据结构

std_msgs/Header header   uint32 seq   time stamp   string frame_id float32 angle_min float32 angle_max float32 angle_increment float32 time_increment float32 scan_time float32 range_min float32 range_max float32[] ranges float32[] intensities 

2. 作业内容

(1)ros编程

雷达数据前只提取18个°生成新的数据,生成新的数据topic:scan_half。
实现这件事需要同时使用到话题的订阅和发布,在rplidar_ros/src中创建scan_half.cpp文件

#include  #include  #include  #include   sing namespace std;

class Laser
{ 
        
public:
	Laser(ros::NodeHandle& n);
	
private:
	ros::NodeHandle n_;
	ros::Subscriber laser_sub_;
	ros::Publisher laser_pub_;
	
	void get_laser_callback(const sensor_msgs::LaserScan &laser);
};

Laser::Laser(ros::NodeHandle& n)
{ 
        
	n_ = n;
	laser_pub_ = n_.advertise<std_msgs::Float32>("scan_half",1000);
	laser_sub_ = n_.subscribe("/scan", 10, &Laser::get_laser_callback, this);
}


void Laser::get_laser_callback(const sensor_msgs::LaserScan &laser)
{ 
        
	int index = int(laser.ranges.size()/2)-1;
	std_msgs::Float32 msg;
	msg.data = laser.ranges[index];
	laser_pub_.publish(msg);
	cout << "ROS激光雷达180°数据(正前方)" << laser.ranges[index] << endl;
    cout <<"------------------------------------------------------" << endl;
}

int main(int argc, char **argv)
{ 
        
	ros::init(argc,argv,"laser_half_scan");
	ros::NodeHandle n;
	Laser laser1(n);
	ros::spin();
	return 0;
}

CMakeList.txt里添加

add_executable(scan_half src/scan_half.cpp ${RPLIDAR_SDK_SRC})
target_link_libraries(scan_half ${catkin_LIBRARIES})

在工作空间使用catkin_make进行编译。
现在可以运行

rosrun rplidar_ros scan_half

查看正在发布的/scan_half话题

rostopic echo /scan_half

如果不显示,检查一下你的激光雷达是否正在工作。

(2)熟悉TF

利用ROS的TF坐标变换系统,给定激光雷达和机器人底盘的坐标关系,求激光雷达数据转换到底盘坐标系后的读数。

ROS的tf系统分为静态和动态,题目所要求的坐标转换使用静态即可,采用右手坐标系,指定向右为y轴正向,垂直纸面向外为x轴正向,在rplidar.launch中添加如下代码实现坐标关系的定义

<node pkg="tf" type="static_transform_publisher" name="base_to_laser" args="0.0 0.1 0.2 0.0 0.0 1.0 0.0 base_link laser 100"/>

可以使用如下指令查看tf消息的相关信息

# 查看TF树
rosrun rqt_tf_tree rqt_tf_tree
# 监控坐标系数据的发布及来源节点
rosrun tf tf_monitor
# 生成坐标树的pdf
rosrun tf view_frames
# 监控指定坐标系间变换关系,类似与rostopic echo
rosrun tf tf_echo base_link pole_top_1_link

使用rostopic info查看话题/tf/tf_static的消息类型是tf2_msgs/TFMessage,接着使用rosmsg info tf2_msgs/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/TransformStamped形成的数组,而后者主要由三个部分组成:headerchild_frame_idtransform

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章