LoginSignup
2
1

初めてのLRF(ROS2)

Posted at

はじめに

今回は北陽さんの測域センサであるUTM-30LXを使って距離が取れるところまでを解説する。
次回にはransacを実装して壁を認識してみようと思う。

動作環境

  • ubuntu20.04
  • ROS2 foxy

urg_nodeのインストール

urg_nodeとは、簡単にいうとlidarの測定した値を/Scan型でpubしてくれるnodeです。詳しくはここを参考にしてください。

sudo apt update
sudo apt install ros-foxy-urg-node

/Scanの中身について

std_msgs/Header header
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

今回使うのは、距離がわかればいいのでfloat32[] rangesの中身を読みます。
他の変数についててはここを参照してください。

実際に動かす!

  • 電源を入れて、usbをpcにつなぐ。
  • 権限を付与
sudo chmod 777 /dev/ttyACM0

* urg_nodeを起動(赤色のエラーが出たときは権限を与え直す。)

ros2 run urg_node urg_node_driver --ros-args -p serial_port:=/dev/ttyACM0
  • rviz2で可視化するとこんな感じ(frameをLaserにする)
    IMG_8418.jpg

lidarで距離を測ってみよう。

今回使用しているlidarは270°の視野を1081で分割しているため、lidarの真ん中が測定している値は541番目のインデックスに入ることになるからコードは以下のようになる。

import rclpy
from rclpy.node import Node
from sensor_msgs.msg import LaserScan

class LidarNode(Node):
    def __init__(self):
        super().__init__('lidar_sample_node')
        self.ranges =[]
        
        self.lidar_sub = self.create_subscription(
            LaserScan,'/scan',self.lidar_cb,10
        )
        
    def lidar_cb(self,msg):
        self.ranges =msg.ranges
        print(f'0[deg]:{self.ranges[541]}')
        

def main():
    rclpy.init()
    node = LidarNode()
    print('lidar_sample_node is started')
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        pass
    rclpy.shutdown()

if __name__=='__main__':
    main()

最後に

これでlidarを使って距離を測ることができた。このコードをいじって/Scanの他の変数には何が入ってるかをprintしてみてもいいと思う。次回はransacを使って壁を認識していく。

# 参考文献

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1