IFL-CAMP / easy_handeye

Automated, hardware-independent Hand-Eye Calibration
Other
839 stars 217 forks source link

Load rqt_easy_handeye plugin failed #137

Open julyfun opened 5 months ago

julyfun commented 5 months ago

Environment

os: ubuntu20.04 ros: noetic date: 24.4.17 device: Azure kinetic + UR10

Problem

When I roslaunch easy_handeye ur10_cali.launch(which is newly created), rviz is working correctly, but there is no rqt_easy_handeye window (although the rqt_easy_handeye node is shown in rosnode list). And I don't know how to calibrate without that GUI. Thank you for any suggestion.

This is my ur10_cali.launch (the robot is started by another computer):

<launch>
    <arg name="namespace_prefix" default="ur10_k4a_handeyecalibration"/>

    <!-- <arg name="ur_robot_driver"
         doc="If true, the new ur_robot_driver will be used; otherwise, the old ur_modern_driver"/>
    <arg name="robot_simulated"
         doc="If true, the demo.launch of ur5_moveit_config will be launched; otherwise, a connection to the real robot will be established"/>
    <arg name="robot_ip" doc="The IP address of the UR5 robot"/> -->

    <arg name="marker_size" doc="Size of the ArUco marker used, in meters"/>
    <arg name="marker_id" doc="The ID of the ArUco marker used"/>

    <!-- start the Kinect -->

    <arg name="rgb_rect" default="1" />
    <arg name="depth_rect" default="1" />
    <arg name="ir_rect" default="1" />
    <arg name="point_cloud" default="1" />
    <arg name="rgb_point_cloud" default="1" />

    <!-- Start the K4A sensor driver -->
    <!-- [j] these should be ok -->
    <group ns="k4a" >
        <include file="$(find azure_kinect_ros_driver)/launch/driver.launch" >
            <arg name="overwrite_robot_description" value="false" />
        </include>

        <!-- Spawn a nodelet manager -->
        <node pkg="nodelet" type="nodelet" name="manager" args="manager" output="screen">
            <param name="num_worker_threads" value="16" />
        </node>

        <!-- Spawn an image_proc/rectify nodelet to rectify the RGB image -->
        <node if="$(arg rgb_rect)"
              pkg="nodelet" type="nodelet" name="rectify_rgb"
              args="load image_proc/rectify manager --no-bond"
              respawn="true">
            <remap from="image_mono"  to="rgb/image_raw" />
            <remap from="image_rect"  to="rgb/image_rect_color" />
        </node>

        <!-- Spawn an image_proc/rectify nodelet to rectify the depth image -->
        <node if="$(arg depth_rect)"
              pkg="nodelet" type="nodelet" name="rectify_depth"
              args="load image_proc/rectify manager --no-bond"
              respawn="true">
            <remap from="image_mono"  to="depth/image_raw" />
            <remap from="image_rect"  to="depth/image_rect" />

            <param name="interpolation" value="0" />
        </node>

        <!-- Spawn an image_proc/rectify nodelet to rectify the IR image -->
        <node if="$(arg ir_rect)"
              pkg="nodelet" type="nodelet" name="rectify_ir"
              args="load image_proc/rectify manager --no-bond"
              respawn="true">
            <remap from="image_mono"  to="ir/image_raw" />
            <remap from="image_rect"  to="ir/image_rect" />
        </node>

        <group if="$(arg point_cloud)">
            <!-- Spawn a depth_image_proc/point_cloud_xyz nodelet to convert the
                depth image into a point cloud -->
            <node unless="$(arg rgb_point_cloud)"
                  pkg="nodelet" type="nodelet" name="point_cloud_xyz"
                  args="load depth_image_proc/point_cloud_xyz manager --no-bond"
                  respawn="true">
                <remap from="image_rect"  to="depth/image_rect" />
            </node>

            <group if="$(arg rgb_point_cloud)">
                <!-- Spawn a depth_image_proc/register nodelet to transform the
                    depth image into the color camera co-ordinate space -->
                <node pkg="nodelet" type="nodelet" name="depth_register"
                      args="load depth_image_proc/register manager --no-bond"
                      respawn="true">
                </node>

                <!-- Spawn a depth_image_proc/point_cloud_xyzrgb nodelet to convert the
                    depth_registered and color images image into a colorized point cloud -->
                <node pkg="nodelet" type="nodelet" name="point_cloud_xyzrgb"
                      args="load depth_image_proc/point_cloud_xyzrgb manager --no-bond"
                      respawn="true">
                </node>
            </group>
        </group>

    </group>

    <!-- start easy_aruco to track the example board -->
    <include file="$(find easy_aruco)/launch/track_charuco_board.launch">
        <arg name="camera_namespace" value="/k4a/rgb"/>
        <arg name="dictionary" value="DICT_6X6_250"/>
        <arg name="square_number_x" value="3"/>
        <arg name="square_number_y" value="3"/>
        <arg name="square_size" value="0.024"/>
        <arg name="marker_size" value="0.016"/>
        <arg name="reference_frame" value="camera_base"/>
        <arg name="camera_frame" value="rgb_camera_link"/> <!-- [j] yes we have that frame -->
    </include>

    <!-- start the robot -->
    <!-- <group unless="$(arg robot_simulated)">
        <include if="$(arg ur_robot_driver)" file="$(find ur_robot_driver)/launch/ur5_bringup.launch">
            <arg name="limited" value="true"/>
            <arg name="robot_ip" value="192.168.0.21"/>
        </include>
        <include unless="$(arg ur_robot_driver)" file="$(find ur_bringup)/launch/ur5_bringup.launch">
            <arg name="limited" value="true"/>
            <arg name="robot_ip" value="192.168.0.21"/>
        </include>
        <include file="$(find ur5_moveit_config)/launch/ur5_moveit_planning_execution.launch">
            <arg name="limited" value="true"/>
        </include>
    </group>
    <include if="$(arg robot_simulated)" file="$(find ur5_moveit_config)/launch/demo.launch">
        <arg name="limited" value="true" />
    </include> -->
    <!-- we don't start RViz, we have our own -->

    <!-- start easy_handeye -->
    <include file="$(find easy_handeye)/launch/calibrate.launch">
        <arg name="namespace_prefix" value="$(arg namespace_prefix)"/>
        <arg name="eye_on_hand" value="false"/>
        <!-- <arg name="start_sampling_gui" value="true"/> -->

        <arg name="tracking_base_frame" value="camera_base"/>
        <arg name="tracking_marker_frame" value="board"/>
        <arg name="robot_base_frame" value="ra_base_link"/>  <!-- before is base_link -->
        <arg name="robot_effector_frame" value="ra_wrist_3_link"/>

        <arg name="freehand_robot_movement" value="false"/>
        <arg name="robot_velocity_scaling" value="0.5"/>
        <arg name="robot_acceleration_scaling" value="0.2"/>
    </include>

</launch>

my rosnode list:

/arm_trajectory_controller_spawner
/calibrate_sr_edc
/conditional_delayed_rostool_action_multi
/conditional_delayed_rostool_diagnostic_aggregator
/conditional_delayed_rostool_movegroup_multi
/conditional_delayed_rostool_robot_state_publisher
/control_box/bag_rotate_nuc_control_7073_7770324356114935517
/control_box/core_dump_limit_nuc_control_7073_3367785699137591959
/control_box/journalctl_pub_nuc_control_7073_2390878166595180627
/control_box/record
/controller_stopper
/diagnostic_aggregator
/dummy_handeye
/easy_aruco_node
/error_reporter
/joint_0_pub
/joint_state_controller_spawner
/k4a/azure_kinect_ros_driver
/k4a/depth_register
/k4a/joint_state_publisher_azure
/k4a/manager
/k4a/point_cloud_xyzrgb
/k4a/rectify_depth
/k4a/rectify_ir
/k4a/rectify_rgb
/k4a/robot_state_publisher_azure
/mongo_wrapper_ros_nuc_control_7642_404583385217236712
/move_group
/moveit_python_wrappers_1713334404607131791
/moveit_python_wrappers_1713335908435908361
/moveit_warehouse_services
/robot_state_publisher
/rosout
/rqt_gui_cpp_node_20861
/rqt_gui_cpp_node_24272
/rviz_server_23634_6718413383284208217
/sr_hand_robot
/sr_rh_tactile_sensor_controller_spawner
/sr_ur_arm_unlock
/teach_mode_node
/ur10_k4a_handeyecalibration_eye_on_base/calibration_mover
/ur10_k4a_handeyecalibration_eye_on_base/easy_handeye_calibration_server
/ur10_k4a_handeyecalibration_eye_on_base/namespace_server_15282_2785989410345704368_rqt
/ur10_k4a_handeyecalibration_eye_on_base/namespace_server_23634_7169102761148973672_rqt_sampling_gui # the sampling gui node is renamed to this

More information: from this video on bilibili we can see that rqt_easy_handeye window is shown when the command is executed.

Plugin in cli rqt throws an error

This is an additional test. I've already included calibrate.launch and its rviz started correctly. My robot is started by nuc linked to my PC (this may be a problem), and I can execute motion planning in that rviz. When I try to load Hand-eye calibration plugin in rqt, with my launch file running, an error occurs: (The plugin Hand-eye calibration Movement is working well)

user@server:/opt/ros$ rqt
arguments:  Namespace(quiet=False)
unknowns:  []
[WARN] [1713340124.883375]: No namespace was passed at construction; remember to use set_namespace()
PluginManager._load_plugin() could not load plugin "rqt_easy_handeye/Hand-eye Calibration":
Traceback (most recent call last):
  File "/opt/ros/noetic/lib/python3/dist-packages/qt_gui/plugin_handler.py", line 102, in load
    self._load()
  File "/opt/ros/noetic/lib/python3/dist-packages/qt_gui/plugin_handler_direct.py", line 55, in _load
    self._plugin = self._plugin_provider.load(self._instance_id.plugin_id, self._context)
  File "/opt/ros/noetic/lib/python3/dist-packages/qt_gui/composite_plugin_provider.py", line 72, in load
    instance = plugin_provider.load(plugin_id, plugin_context)
  File "/opt/ros/noetic/lib/python3/dist-packages/qt_gui/composite_plugin_provider.py", line 72, in load
    instance = plugin_provider.load(plugin_id, plugin_context)
  File "/opt/ros/noetic/lib/python3/dist-packages/rqt_gui_py/ros_py_plugin_provider.py", line 61, in load
    return super(RosPyPluginProvider, self).load(plugin_id, plugin_context)
  File "/opt/ros/noetic/lib/python3/dist-packages/qt_gui/composite_plugin_provider.py", line 72, in load
    instance = plugin_provider.load(plugin_id, plugin_context)
  File "/opt/ros/noetic/lib/python3/dist-packages/rqt_gui/ros_plugin_provider.py", line 106, in load
    return class_ref(plugin_context)
  File "/home/user/catkin_ws/src/easy_handeye/rqt_easy_handeye/src/rqt_easy_handeye/rqt_easy_handeye.py", line 74, in __init__
    resp = self.client.list_algorithms()
  File "/home/user/catkin_ws/src/easy_handeye/easy_handeye/src/easy_handeye/handeye_client.py", line 84, in list_algorithms
    return self.list_algorithms_proxy()
TypeError: 'NoneType' object is not callable

Full output of roslaunch easy_handeye ur10_cali.launch

https://paste.ubuntu.com/p/QdT7gXpkxk/

Fanqyu commented 5 months ago

Hi, cannot see the plugin, too. image Have you solved this problem?

julyfun commented 5 months ago

Hi, cannot see the plugin, too. image Have you solved this problem?

not yet

Fanqyu commented 5 months ago

If it's convenient, we can add the WeChat account of each other, and discuss the problem together.

julyfun commented 5 months ago

If it's convenient, we can add the WeChat account of each other, and discuss the problem together.

ok you may email me your wechat account 😊

ChuckAlex commented 2 months ago

hi, Have you solved this problem?

julyfun commented 2 months ago

hi, Have you solved this problem?

You can check easy_handeye/launch/calibrate.launch and check if the move_group parameter is set correctly to your robot's move group. The default value here is manipulator, but it could be wrong.

https://github.com/IFL-CAMP/easy_handeye/blob/ffcc43d1e63cd16b3052f499c681cd8fbc7b71f5/easy_handeye/launch/calibrate.launch#L13

Gritsua commented 2 weeks ago

hi, Have you solved this problem,and can i email my wechat to you,discussing the problem?