moveit_setup_assistant를 사용하면 대상이 되는 package에서 urdf를 추출한 다음, 필요한 설정 파일을 만든 후 package+moveit_config 디렉토리에 생성한 파일을 저장한다. lanch 디렉토리에 demo.launch.py 파일이 있는데, 코드에는 별 내용은 없고, 같은 디렉토리 launch 파일들을 실행한다. 최소한 어느 부분을 실행해야 rviz에서 로봇이 제대로 보일지 궁금했다
demo.launch.py 파일이 다음을 실행한다.
- static_virtual_joint_tfs
- robot_state_publisher
- move_group
- rviz
- ros2_contol_node + controller spawners
robot_state_publisher만 실행하면 로봇이 정확하게 보일 줄 알았다. robot_state_publisher가 입력으로 robot_description을 받아들이고, TF는 robot_description에 있는 링크, 조인트 관계만 읽어들여 알아낼 줄 알았다. move_group은 path를 찾을 때 사용하므로 당장 필요해 보이지 않았다.
from launch import LaunchDescription from moveit_configs_utils import MoveItConfigsBuilder from launch_ros.actions import Node from moveit_configs_utils.launches import generate_rsp_launch, generate_moveit_rviz_launch from launch.actions import ( DeclareLaunchArgument, IncludeLaunchDescription, ) from launch.substitutions import LaunchConfiguration import os from ament_index_python.packages import get_package_share_directory from launch.launch_description_sources import PythonLaunchDescriptionSource def generate_launch_description(): moveit_config = MoveItConfigsBuilder("abb_irb2400", package_name="hello_moveit_config").to_moveit_configs() #dict2 = moveit_config.to_dict() #for key, val in (dict2.items()): # print(key, ":", val) ld = LaunchDescription() ld.add_action(DeclareLaunchArgument("publish_frequency", default_value="15.0")) rsp_node = Node( name = "rsp_node", executable = "robot_state_publisher", #prefix = "xterm -e gdb run --args", package = "robot_state_publisher", output = "both", respawn = True, #namespace = 'my_robot', parameters=[ moveit_config.robot_description, { "publish_frequency": LaunchConfiguration("publish_frequency"), }, #moveit_config.robot_description_semantic, #moveit_config.robot_description_kinematics, ], ) ld.add_action(rsp_node) return ld
launch를 실행하면 tf가 제대로 표시되지 않는다. tf_static은 정확하게 표시된다.
root@rygen3600:/home/ros2_test/ws_root/ws_user# ros2 topic list /attached_collision_object /clicked_point /display_planned_path /goal_pose /initialpose /joint_states /parameter_events /planning_scene /planning_scene_world /recognized_object_array /robot_description /rosout /rviz_moveit_motion_planning_display/robot_interaction_interactive_marker_topic/feedback /rviz_moveit_motion_planning_display/robot_interaction_interactive_marker_topic/update /tf /tf_static /trajectory_execution_event /visualization_marker_array root@rygen3600:/home/ros2_test/ws_root/ws_user# ros2 topic echo /tf ^Croot@rygen3600:/home/ros2_test/ws_root/ws_user# ros2 topic echo /tf_static transforms: - header: stamp: sec: 1691830604 nanosec: 3856748 frame_id: base_link child_frame_id: base transform: translation: x: 0.0 y: 0.0 z: 0.0 rotation: x: 0.0 y: 0.0 z: 0.0 w: 1.0 - header: stamp: sec: 1691830604 nanosec: 3856748 frame_id: link_6 child_frame_id: tool0 transform: translation: x: 0.0 y: 0.0 z: 0.0 rotation: x: 0.0 y: 0.0 z: 0.0 w: 1.0 ---
왜 이런지 한참 고민하다, 결국 control node와 controller spawner가 실행되어야 TF가 제대로 표시됨을 알았다.
root@rygen3600:/home/ros2_test/ws_root/ws_user# ros2 topic echo /tf ... - header: stamp: sec: 1691830991 nanosec: 709634293 frame_id: base_link child_frame_id: link_1 transform: translation: x: 0.0 y: 0.0 z: 0.0 rotation: x: 0.0 y: 0.0 z: 0.0 w: 1.0 - header: stamp: sec: 1691830991 nanosec: 709634293 frame_id: link_1 child_frame_id: link_2 transform: translation: x: 0.1 y: 0.0 z: 0.615 rotation: x: 0.0 y: 0.0 z: 0.0 w: 1.0 - header: stamp: sec: 1691830991 nanosec: 709634293 frame_id: link_2 child_frame_id: link_3 transform: translation: x: 0.0 y: 0.0 z: 0.705 rotation: x: 0.0 y: 0.0 z: 0.0 w: 1.0
최소 2개 node가 필요하다. robot_state_publisher와 controller node.이거 알아낸다고 별 짓을 다했다. 다수 로봇을 처리하려면 namespace로 할당하여 불러야 할텐데, 잘 안된다.