控制机械臂

注意:pymycobot 驱动库的版本必须大于4.0.0, Moveit2仅支持 ROS2 Humble版本,请使用对应分支的代码运行

使用前准备

在使用案例功能之前,请先确认以下硬件和环境准备齐全:

  • 硬件设备

    • MyCobot Pro 450 机械臂
    • 网线(用于连接机械臂与电脑)
    • 电源适配器
    • 急停开关(确保安全操作)
  • 软件与环境

    • 已安装 Python 3.6 及以上版本
    • 已安装 pymycobot 库(通过 pip install pymycobot 终端命令安装)
    • 确保 MyCobot Pro 450 已正确接通电源,并处于待机状态
    • 注意:Pro 450 服务端会在设备上电后自动启动,无需手动操作
  • 网络配置

    • MyCobot Pro 450 默认 IP 地址:192.168.0.232
    • 默认端口号:4500
    • 注意:PC 端需要将本机网卡 IP 设置为 同一网段(例如 192.168.0.xxxxxx 为 2~254 之间的任意数,且不能与机械臂冲突)。
    • 示例:

      • 机械臂 IP:192.168.0.232
      • PC IP:192.168.0.100
      • 子网掩码:255.255.255.0
    • 验证:完成网络配置后,可在 PC 终端执行以下命令,若能成功返回数据包,则说明网络连接正常:

      ping 192.168.0.232
      

1 滑块控制

打开命令行并运行:

# Pro450 默认ip地址为"192.168.0.232",端口号为 4500。
ros2 launch mycobot_pro_450 slider_control.launch.py

# 如果末端配有myGripper F100 力控夹爪,则运行:
ros2 launch mycobot_pro_450 slider_control_force_gripper.launch.py

它会打开 rviz2 和一个滑块组件,你会看到类似下面的内容:

如果末端装有myGripper F100 力控夹爪,则会看到以下界面:

然后,您可以在 rviz2 中通过拖动滑块来控制模型的移动。真实的 mycobot 机器人也会随之移动。

请注意:由于在命令输入的同时机械臂会移动到模型目前的位置,在您使用命令之前请确保 rviz 中的模型没有出现穿模现象

不要在连接机械臂后做出快速拖动滑块的行为,防止机械臂损坏

2 模型跟随

除了上面的控制,我们也可以让模型跟随真实的机械臂运动

打开一个命令行运行:

# Pro450 默认ip地址为"192.168.0.232",端口号为 4500。
ros2 launch mycobot_pro_450 mycobot_follow.launch.py

运行成功后,机械臂所有关节处于释放状态。它将打开 rviz 以显示模型跟随效果 。此时拖动真实机械臂关节,仿真模型将会跟随真实机械臂运动。

运行成功后,需要同时按住机器末端按钮才能拖拽关节移动,终端输出信息如下:

[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [robot_state_publisher-1]: process started with pid [12048]
[INFO] [follow_display-2]: process started with pid [12050]
[INFO] [rviz2-3]: process started with pid [12052]
[robot_state_publisher-1] Parsing robot urdf xml string.
[robot_state_publisher-1] Link link1 had 1 children
[robot_state_publisher-1] Link link2 had 1 children
[robot_state_publisher-1] Link link3 had 1 children
[robot_state_publisher-1] Link link4 had 1 children
[robot_state_publisher-1] Link link5 had 1 children
[robot_state_publisher-1] Link link6 had 0 children
[robot_state_publisher-1] [INFO] [1757408024.256520696] [robot_state_publisher]: got segment base
[robot_state_publisher-1] [INFO] [1757408024.256679159] [robot_state_publisher]: got segment link1
[robot_state_publisher-1] [INFO] [1757408024.256692374] [robot_state_publisher]: got segment link2
[robot_state_publisher-1] [INFO] [1757408024.256697373] [robot_state_publisher]: got segment link3
[robot_state_publisher-1] [INFO] [1757408024.256701681] [robot_state_publisher]: got segment link4
[robot_state_publisher-1] [INFO] [1757408024.256705999] [robot_state_publisher]: got segment link5
[robot_state_publisher-1] [INFO] [1757408024.256710327] [robot_state_publisher]: got segment link6
[rviz2-3] [INFO] [1757408024.565241287] [rviz2]: Stereo is NOT SUPPORTED
[rviz2-3] [INFO] [1757408024.565493504] [rviz2]: OpenGl version: 3.1 (GLSL 1.4)
[rviz2-3] [INFO] [1757408024.647227371] [rviz2]: Stereo is NOT SUPPORTED
[follow_display-2] [INFO] [1757408024.783281010] [follow_display]: ip:192.168.0.232, port:4500
[rviz2-3] Parsing robot urdf xml string.
[follow_display-2] [INFO] [1757408024.905252117] [follow_display]: Please press the button at the end of the machine to drag the joint.
[follow_display-2] [INFO] [1757408024.905252117] [follow_display]: 请按下机器末端按钮进行关节拖拽运动.
[follow_display-2] [INFO] [1757408024.937815658] [follow_display]: Publishing ...

3 GUI 控制

在前者的基础上,本软件包还提供了一个简单的图形用户界面控制接口。这种方法意味着真正的机械臂是相互连接的,请连接到 mycobot。

打开命令行:

# Pro450 默认ip地址为"192.168.0.232",端口号为 4500。
ros2 launch mycobot_pro_450 simple_gui.launch.py

# 如果末端配有myGripper F100 力控夹爪,则运行:
ros2 launch mycobot_pro_450 simple_gui_force_gripper.launch.py

如果末端装有myGripper F100 力控夹爪,则会看到以下界面:

运行成功后,终端信息输出如下:

[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [robot_state_publisher-1]: process started with pid [17196]
[INFO] [rviz2-2]: process started with pid [17198]
[INFO] [listen_real_service-3]: process started with pid [17200]
[INFO] [simple_gui-4]: process started with pid [17202]
[robot_state_publisher-1] Parsing robot urdf xml string.
[robot_state_publisher-1] Link link1 had 1 children
[robot_state_publisher-1] Link link2 had 1 children
[robot_state_publisher-1] Link link3 had 1 children
[robot_state_publisher-1] Link link4 had 1 children
[robot_state_publisher-1] Link link5 had 1 children
[robot_state_publisher-1] Link link6 had 0 children
[robot_state_publisher-1] [INFO] [1757414162.529535554] [robot_state_publisher]: got segment base
[robot_state_publisher-1] [INFO] [1757414162.530006477] [robot_state_publisher]: got segment link1
[robot_state_publisher-1] [INFO] [1757414162.530445098] [robot_state_publisher]: got segment link2
[robot_state_publisher-1] [INFO] [1757414162.530788098] [robot_state_publisher]: got segment link3
[robot_state_publisher-1] [INFO] [1757414162.531159021] [robot_state_publisher]: got segment link4
[robot_state_publisher-1] [INFO] [1757414162.531476222] [robot_state_publisher]: got segment link5
[robot_state_publisher-1] [INFO] [1757414162.531788353] [robot_state_publisher]: got segment link6
[listen_real_service-3] [INFO] [1757414163.139592125] [listen_real_service]: ip:192.168.0.232, port:4500
[rviz2-2] [INFO] [1757414163.306409248] [rviz2]: Stereo is NOT SUPPORTED
[rviz2-2] [INFO] [1757414163.306709577] [rviz2]: OpenGl version: 3.1 (GLSL 1.4)
[rviz2-2] [INFO] [1757414163.372621603] [rviz2]: Stereo is NOT SUPPORTED
[rviz2-2] Parsing robot urdf xml string.

然后在GUI界面输入相关角度和坐标信息,点击对应按钮,即可实现真实机器与仿真模型的同步运动

注意: 使用夹爪开关按钮前,请确保自适应夹爪已连接至机器人手臂末端。

4 键盘控制

mycobot_pro_450 包中添加了键盘控制功能,并在 rviz2 中实时同步。 该功能依赖于 pythonApi,因此请确保与真正的机械臂连接。

打开命令行并运行:

# Pro450 默认ip地址为"192.168.0.232",端口号为 4500。
ros2 launch mycobot_pro_450 teleop_keyboard.launch.py

# 如果末端配有myGripper F100 力控夹爪,则运行:
ros2 launch mycobot_pro_450 teleop_keyboard_force_gripper.launch.py

运行效果如下:

如果末端装有myGripper F100 力控夹爪,则会看到以下界面:

命令行中将会输出 mycobot 信息,如下:

[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [robot_state_publisher-1]: process started with pid [13684]
[INFO] [rviz2-2]: process started with pid [13686]
[INFO] [listen_real_service-3]: process started with pid [13688]
[robot_state_publisher-1] Parsing robot urdf xml string.
[robot_state_publisher-1] Link link1 had 1 children
[robot_state_publisher-1] Link link2 had 1 children
[robot_state_publisher-1] Link link3 had 1 children
[robot_state_publisher-1] Link link4 had 1 children
[robot_state_publisher-1] Link link5 had 1 children
[robot_state_publisher-1] Link link6 had 0 children
[robot_state_publisher-1] [INFO] [1757409378.488848950] [robot_state_publisher]: got segment base
[robot_state_publisher-1] [INFO] [1757409378.489029099] [robot_state_publisher]: got segment link1
[robot_state_publisher-1] [INFO] [1757409378.489038676] [robot_state_publisher]: got segment link2
[robot_state_publisher-1] [INFO] [1757409378.489043355] [robot_state_publisher]: got segment link3
[robot_state_publisher-1] [INFO] [1757409378.489047552] [robot_state_publisher]: got segment link4
[robot_state_publisher-1] [INFO] [1757409378.489051760] [robot_state_publisher]: got segment link5
[robot_state_publisher-1] [INFO] [1757409378.489055988] [robot_state_publisher]: got segment link6
[rviz2-2] [INFO] [1757409378.801155196] [rviz2]: Stereo is NOT SUPPORTED
[rviz2-2] [INFO] [1757409378.801390966] [rviz2]: OpenGl version: 3.1 (GLSL 1.4)
[rviz2-2] [INFO] [1757409378.860460962] [rviz2]: Stereo is NOT SUPPORTED
[listen_real_service-3] [INFO] [1757409379.155013599] [listen_real_service]: ip:192.168.0.232, port:4500
[rviz2-2] Parsing robot urdf xml string.

接下来,打开另一个 命令行:

ros2 run mycobot_pro_450 teleop_keyboard

# 如果末端配有myGripper F100 力控夹爪,则运行:
ros2 run mycobot_pro_450 teleop_keyboard_force_gripper

您将在终端看到以下输出:

Mycobot Teleop Keyboard Controller
---------------------------
Movimg options(control coordinations [x,y,z,rx,ry,rz]):
              w(x+)

    a(y-)     s(x-)     d(y+)

    z(z-) x(z+)

u(rx+)   i(ry+)   o(rz+)
j(rx-)   k(ry-)   l(rz-)

+/- : Increase/decrease movement step size

Force Gripper control:
    g - open
    h - close

Other:
    1 - Go to init pose
    2 - Go to home pose
    3 - Resave home pose
    q - Quit

currently:    speed: 50    change percent: 5

在该终端中,您可以通过命令行中的按键控制机械臂的状态并移动机械臂。

注意:先输入2机械臂回到起始点之后,再进行其他坐标控制操作,终端会有如下提示:

[WARN] [1758001794.385321]: Coordinate control disabled. Please press '2' first.
[INFO] [1758001804.552778]: Home pose reached. Coordinate control enabled.
[INFO] [1758001817.069637]: Home pose reached. Coordinate control enabled.
[WARN] [1758001836.301070]: Returned to zero. Press '2' to enable coordinate control.
[WARN] [1758001848.830702]: Coordinate control disabled. Please press '2' first.
[INFO] [1758001863.383565]: Home pose reached. Coordinate control enabled.
[WARN] [1758001933.596504]: Returned to zero. Press '2' to enable coordinate control.
[WARN] [1758001942.051899]: Coordinate control disabled. Please press '2' first.

5 moveit2 使用

注意: Moveit2仅支持 ROS2 Humble版本,请使用对应分支的代码运行。

mycobot_ros2 整合了 MoveIt 部分。

打开命令行并运行:

ros2 launch pro450_moveit2 demo.launch.py

运行效果如下:

终端将输出如下信息,代表成功启动moveit:

[move_group-3] You can start planning now!
[move_group-3] 
[ros2_control_node-5] [INFO] [1757486383.454753341] [controller_manager]: Loading controller 'joint_state_broadcaster'
[rviz2-4] [INFO] [1757486383.456108372] [rviz2]: Stereo is NOT SUPPORTED
[spawner-7] [INFO] [1757486383.502228729] [spawner_joint_state_broadcaster]: Loaded joint_state_broadcaster
[spawner-6] [INFO] [1757486383.564310311] [spawner_arm_group_controller]: Configured and activated arm_group_controller
[rviz2-4] Warning: class_loader.impl: SEVERE WARNING!!! A namespace collision has occurred with plugin factory for class rviz_default_plugins::displays::InteractiveMarkerDisplay. New factory will OVERWRITE existing one. This situation occurs when libraries containing plugins are directly linked against an executable (the one running right now generating this message). Please separate plugins out into their own library or just don't link against the library and use either class_loader::ClassLoader/MultiLibraryClassLoader to open.
[rviz2-4]          at line 253 in /opt/ros/humble/include/class_loader/class_loader/class_loader_core.hpp
[ros2_control_node-5] [INFO] [1757486383.610227041] [controller_manager]: Configuring controller 'joint_state_broadcaster'
[ros2_control_node-5] [INFO] [1757486383.610628892] [joint_state_broadcaster]: 'joints' or 'interfaces' parameter is empty. All available state interfaces will be published
[spawner-7] [INFO] [1757486383.736878229] [spawner_joint_state_broadcaster]: Configured and activated joint_state_broadcaster
[INFO] [spawner-6]: process has finished cleanly [pid 100700]
[INFO] [spawner-7]: process has finished cleanly [pid 100703]
[rviz2-4] [ERROR] [1757486386.668318057] [moveit_ros_visualization.motion_planning_frame]: Action server: /recognize_objects not available
[rviz2-4] [INFO] [1757486386.684028956] [moveit_ros_visualization.motion_planning_frame]: MoveGroup namespace changed: / -> . Reloading params.
[rviz2-4] [INFO] [1757486386.975209646] [moveit_rdf_loader.rdf_loader]: Loaded robot model in 0.105952 seconds
[rviz2-4] [INFO] [1757486386.975348906] [moveit_robot_model.robot_model]: Loading robot model 'firefighter'...
[rviz2-4] [INFO] [1757486387.253639370] [moveit_ros.planning_scene_monitor.planning_scene_monitor]: Starting planning scene monitor
[rviz2-4] [INFO] [1757486387.255326862] [moveit_ros.planning_scene_monitor.planning_scene_monitor]: Listening to '/monitored_planning_scene'
[rviz2-4] [INFO] [1757486387.353487213] [interactive_marker_display_104041531794736]: Connected on namespace: /rviz_moveit_motion_planning_display/robot_interaction_interactive_marker_topic
[rviz2-4] [INFO] [1757486387.358813947] [moveit_ros_visualization.motion_planning_frame]: group arm_group
[rviz2-4] [INFO] [1757486387.358844123] [moveit_ros_visualization.motion_planning_frame]: Constructing new MoveGroup connection for group 'arm_group' in namespace ''
[rviz2-4] [INFO] [1757486387.372219842] [move_group_interface]: Ready to take commands for planning group arm_group.
[rviz2-4] [INFO] [1757486387.404744042] [interactive_marker_display_104041531794736]: Sending request for interactive markers
[rviz2-4] [INFO] [1757486387.463143847] [interactive_marker_display_104041531794736]: Service response received for initialization

基本路径规划操作如下:

如果想让真正的机械臂同步执行计划,则需要打开另一个命令行并运行:

# Pro450 默认ip地址为"192.168.0.232",端口号为 4500。
ros2 run pro450_moveit2_control sync_plan

修改运动速度

为了防止关节在实际机械臂运动过程中晃动,需要降低关节的运动速度。

  • sync_plan.py文件中,修改机械臂 Python API 的速度参数,此处改为 25。

  • 注意: 修改速度之后,需要重新编译才能生效:

    cd ~/colcon_ws
    source install/setup.bash
    
  ...

def listener_callback(self, msg):
    """Callback to process received joint states.

    Converts joint positions from radians to degrees, rearranges them
    according to the RViz order, and sends them to the robot.

    Args:
        msg (JointState): The message containing joint names and positions.
    """
    # Create a mapping of joint names to their position values
    joint_state_dict = {name: msg.position[i]
                        for i, name in enumerate(msg.name)}

    # Rearrange joint angles according to RViz order
    data_list = []
    for joint in self.rviz_order:
        if joint in joint_state_dict:
            radians_to_angles = round(
                math.degrees(joint_state_dict[joint]), 2)
            data_list.append(radians_to_angles)

    self.get_logger().info(f'joint_angles: {data_list}')
    self.mycobot_450.send_angles(data_list, 25)

  ...
  • 在 Moveit RViz 界面中,修改速度和加速度的缩放比例。在这里,将其改为 0.1,然后保存当前配置。


← 上一页 | 下一节 →

results matching ""

    No results matching ""