반응형

터틀봇에 있는 LDS-01 360 Laser Distance Sensor를 RpLidar A1 로 바꾸고 싶었다.

 

일단 RpLidar A1 으로 바꿔 끼운다. 

기본적으로 LDS-01 이랑 RpLidar 가  연결되면  /dev/ttyUSB0 에 붙게 된다. 그래서 런쳐코드에도 파라메터로 써있는것을 볼 수 있다.

 

일단 바꿔 끼우고 나면 라이다 드라이버가 필요하다.

기존엔 ROS1 으로 대부분 작업되어 있는데 ROS2 로 만든 소스를 다운받는다.

github.com/youngday/rplidar_ros2

 

youngday/rplidar_ros2

rplidar_ros2 rplidar ros2. Contribute to youngday/rplidar_ros2 development by creating an account on GitHub.

github.com

여기에서 소스를 받아서 라즈베리(타겟보드) 에 넣고

$ colcon build --symlink-install 해준다.   (--symlink-install 는 실제 복사하지 않고 링크 걸어 쓴다는 뜻)

그러면 만들어지는 install 디렉토리에 쓸수 있는것들이 구성되는데. 이것을 적용하려면 

 

source ./install/setup.bash 를 해주어야 한다.

기본적으로 이것은 overlay 되기 때문에 구동에 필요한 것들

 

$ source /opt/ros/foxy/setup.bash

$ source ~/turtlebot3_ws/install/setup.bash

$ source ~/rplidar/rplidar_ros2/install/setup.bash

 

이렇게 세개를 해주면 된다.

그리고 나서 turtlebot3 의 런치 파일에서 기존 lds 드라이버 구동 대신 rplidar 로 구동 할 수 있도록 변경해준다.

 

터틀봇을 구동할 때는 이 런치파일을 쓰는데 여기에서 라이다 구동 드라이버를 실행하는 부분이 있다.

$ ros2 launch turtlebot3_bringup robot.launch.py

 

/home/ubuntu/turtlebot3_ws/src/turtlebot3/turtlebot3_bringup/launch/robot.launch.py 를 수정한다.

 

윗쪽에 있는 이 세줄을 바꾼다.
    #lidar_pkg_dir = LaunchConfiguration(
    #    'lidar_pkg_dir',
    #    default=os.path.join(get_package_share_directory('hls_lfcd_lds_driver'), 'launch'))
    lidar_pkg_dir = LaunchConfiguration(
        'lidar_pkg_dir',
        default=os.path.join(get_package_share_directory('rplidar_ros'), 'launch'))

그 아랫줄에 네줄도 바꾼다.
        #IncludeLaunchDescription(
        #    PythonLaunchDescriptionSource([lidar_pkg_dir, '/hlds_laser.launch.py']),
        #    launch_arguments={'port': '/dev/ttyUSB0', 'frame_id': 'base_scan'}.items(),
        #),
        IncludeLaunchDescription(
            PythonLaunchDescriptionSource([lidar_pkg_dir, '/rplidar.launch.py']),
            launch_arguments={'serial_port': '/dev/ttyUSB0', 'frame_id': 'base_scan'}.items(),
        ),

 

위에 세줄은 lidar 구동 드라이버 기본 디렉토리를 찾는 것이고

아랫것은 라이다 구동 런쳐를 돌리는 것이다.

 

그리고 나서 카토 그래퍼를 돌리면

$ ros2 launch turtlebot3_cartographer cartographer.launch.py

원래 맵이 생겨야 되는데 안생기고 이상한 메세지가 나올것이다.

 

[cartographer_node-1]          at line 133 in /tmp/binarydeb/ros-foxy-tf2-0.13.9/src/buffer_core.cpp
[cartographer_node-1] Warning: Invalid frame ID "laser" passed to canTransform argument source_frame - frame does not exist
[cartographer_node-1]          at line 133 in /tmp/binarydeb/ros-foxy-tf2-0.13.9/src/buffer_core.cpp
[cartographer_node-1] Warning: Invalid frame ID "laser" passed to canTransform argument source_frame - frame does not exist
[cartographer_node-1]          at line 133 in /tmp/binarydeb/ros-foxy-tf2-0.13.9/src/buffer_core.cpp

 

난 처음에 이게 나오는 이유가 laser 라는 frame id 를 갖는 데이터를 카토그래퍼 에서 요구 하는데 없거나.

아니면 lds 에는 laser 라는 데이터가 있는데 rplidar 드라이버로 바꾸면서 뭔가 laser 라는 데이터를 publish 하지 못한다고 생각을 해서 laser가 빠진데를 찾았다. 

 

그러다가 이렇게 하면 된다고 해서 해보니까

$ ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0  base_link laser 

맵은 만들어지는데 도대체 왜 이런건지 이해가 안되서 코드를 뒤지다가 쉬고 있는데 생각이 떠올랐다.

 

laser를 못보내주거나 요구하는게 아니라. laser 라는 쓸데없는 데이터가 들어오기 때문에 나오는 메세지인가???

카토그래퍼에서 이거 laser 들어오는데 어쩌라고?? 하는 메세지인가 하는 생각이 들었다.

 

그래서 알아보니 저 tf2는

index.ros.org/doc/ros2/Tutorials/tf2/

 

Using tf2 with ROS 2

Using tf2 with ROS 2 There is preliminary support for tf2 in ROS 2. We rely heavily on tf2 in ROS 1 to manage data about coordinate transforms, and we expect to continue to use extensively in ROS 2. Here’s how to try it out. In each shell, be sure to sta

index.ros.org

ros2 run tf2_ros static_transform_publisher 1 2 3 0.5 0.1 -1.0 foo bar

만약에 이렇게 쓴다고 하면 

x, y, z, yaw, pitch, roll  매트릭스 1 2 3 0.5 0.1 -1.0 를 적용하여 parent frame foo 와 child frame bar 를 연결하라는 뜻인데.

 

지금 rplidar 에서 laser 라는 frame_id 로 data가 들어가고 있고 이것과 base_link 와 연결을 해주기 때문에 

$ ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0  base_link laser  이렇게 해주면 맵이 그려지는 것이었다.

 

사실 이것도 잘못된게

 

turtlebot3_burger.urdf  파일을 보면

이렇게 되어있으니까 아마 base_link에서 부터 laser 로 연결하려면 

ros2 run tf2_ros static_transform_publisher -0.032 0 0.172 0 0 0  base_link laser 

이렇게 하거나 

아니면

ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0 base_scan laser

이렇게 하거나 하는게 맞는것 같다.

 

그리고 이 transform 매트릭스를 써줄 필요가 없게 하려고 robot.launch.py 에서 'frame id' : 'base_scan' 을 해준건데 이 파라메터가 rplidar.launch.py 에서 받아들이질 않아서 동작이 안된것이었다.

 

따라서 라즈베리의

rplidar_ros2/launch/rplidar.launch.py 파일을 열어서

 

                #'frame_id': 'laser',

                'frame_id': 'base_scan',

laser 를 base_scan 으로 고쳐주면 tf2 를 쓰지 않아도 잘 동작하는것을 볼 수 있다.

 

결론은 그냥  urdf  파일이랑 이름이 안맞아서 그랬던것.

 

그리고. 

~/turtlebot3_ws/src/turtlebot3/turtlebot3_navigation2/param/burger.yaml:17:    laser_max_range: 100.0

이 값을 120.0 으로 바꾼다.

wiki.ros.org/amcl

 

amcl - ROS Wiki

kinetic melodic noetic   Show EOL distros:  EOL distros:   electric fuerte groovy hydro indigo jade lunar diamondback: Only showing information from the released package extracted on Unknown. No API documentation available. Please see this page for in

wiki.ros.org

 

~laser_min_range (double, default: -1.0)

  • Minimum scan range to be considered; -1.0 will cause the laser's reported minimum range to be used.

~laser_max_range (double, default: -1.0)

  • Maximum scan range to be considered; -1.0 will cause the laser's reported maximum range to be used.

 

반응형

'Embeded > ROS' 카테고리의 다른 글

MS kinect ubuntu 에서 해보기. (freenect)  (0) 2021.03.31
RPLidar A1 을 터틀봇3 turtlebot3 에 붙이는 방법.  (0) 2021.01.26
터틀봇3 알아보기.  (0) 2021.01.15
ROS2 action 만들기  (0) 2021.01.13
Posted by Real_G

댓글을 달아 주세요