はじめに
今回は北陽さんの測域センサである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
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を使って壁を認識していく。
# 参考文献