最近工作特别忙,导致博客一直没有时间更新。但是作业也不能一直鸽着,刚好最近在做abb机器人的ros开发。不妨就拿x3 model来做上位机,测试一下。本来要测试自己的机械臂的,可是还没来得及组装,等这段时间忙过了,我再出个详细评测自己机械臂的ros开发过程。

接着上次的工作。开发板已经装好官方系统。接下来就是装ros2的环境了。这里要感谢鱼香ROS大佬的一键安装系列工具,简直太好用了。为大佬点赞。顺便也提一下,我的ros入门就是跟着大佬的B站视频学的,再次感谢。

一键安装指令

wget http://fishros.com/install -O fishros && . fishros

按着步骤来,基本没有什么问题。

输入指令:

 

选择工具,我这里选择1,一键安装ros

 

 

 

换源,以免因为网络原因,安装失败

 

 

换源,清理第三方源

 

 

选择要安装的ROS2版本,我这里选择humble

 

选择桌面版

 

喝杯茶,静静等待一下,不要问我静静是谁?顺利安装完成

 

我们启动两个节点,一个节点负责发消息(说),一个节点负责收消息(听)。测试一下

打开经典的乌龟模拟器,测试一下

 

最后启动RQT可视化,看看节点之间的数据关系

 

至此,ROS2已经完美安装。

 

接下来,该捣鼓我的ABB 1200机械臂了。

因为ros2与abb机械臂的硬件通讯接口是egm,所以abb机械臂必须选装egm选项。好在我这里的机械臂是有这个选项的。

首先创建工作空间,并下载代码abb_ros2的代码。

mkdir -p abb_ros2/src

sudo apt update

sudo apt dist-upgrade

rosdep update

cd src

vcs import < abb_ros2/abb.repos

rosdep install -r --from-paths . --ignore-src --rosdistro $ROS_DISTRO -y

如果下载出错,很可能是网络问题。打开依赖文件,在地址前面加上代理,一般就没有问题啦。像下面这样:

 

然后编译工作空间

cd <COLCON_WORKSPACE>

colcon build

编译完成,我们就可以快速的验证一下abb的ros包有没有安装好,执行下面指令,查看一下机器人模型

 

ros2 launch abb_irb1200_support view_robot.launch.py

可以看到完美打开了机器人模型,同时还可以手动控制机器人,abb ros包安装完毕

 

在ros2里模拟机械臂运动,执行如下指令

ros2 launch abb_bringup abb_control.launch.py description_package:=abb_irb1200_support description_file:=irb1200_5_90.xacro launch_rviz:=false moveit_config_package:=abb_irb1200_5_90_moveit_config use_fake_hardware:=true

 

然后运行moveit,执行如下指令

ros2 launch abb_bringup abb_moveit.launch.py robot_xacro_file:=irb1200_5_90.xacro support_package:=abb_irb1200_support moveit_config_package:=abb_irb1200_5_90_moveit_config moveit_config_file:=abb_irb1200_5_90.srdf.xacro

 

就可以使用moveit规划机器人的运动路径了

因为ros2与ABB机器人进行实时控制是通过EGM选项来实现的。如果想要控制实际物理机械臂或者用ABB的robotstuido进行仿真控制测试,必须要加装EGM选项。需要进行如下步骤设置:(实际物理机械臂需要刷机实现)

以使用robotstudio为例,实际物理机器人是一样的设置方法。

1.打开RobotStudio,并通过选择“文件”-->“新建”-->“包含工作站和虚拟控制器的解决方案”来创建一个新的解决方案。确保选择了自定义选项。

 

 

2.在弹出的控制器自定义窗口中,将EGM添加到控制器中。可以通过在侧边栏上选择“工程工具”,然后选择以下选项来完成:

 

689-1 外部引导运动(EGM) 对于MultiMove支持,例如外部轴,还需选择以下选项:

 

623-1 多任务,也在“工程工具”下 604-1 独立MultiMove,在“运动协调”下 请注意,EGM位置流不支持MultiMove协调 - 这意味着不支持协调同步的机器人运动(即对涉及多个机器人在同一个移动工作对象上工作的任务)。

3.配置控制器的通信设置,以便与ROS 2计算机建立连接。确定ROS 2计算机的IP地址和用于EGM通信的端口。端口是通过机器人ros2_control描述文件中的robotstudio_port硬件参数设置的。要配置控制器,请导航到“控制器”选项卡 --> “配置” --> “通信”。在右侧,在“传输协议”下右键单击并选择“添加新的”。

 

 

将名称设置为ROB_1 将类型设置为UDPUC。如果您没有看到此选项,则表示未将EGM添加到控制器中。 将远程地址设置为ROS 2计算机的地址。在Pack and Go文件中,该地址设置为169.254.53.52,但可能需要进行更改。 将远程端口号设置为与ROS 2控制驱动程序所期望的端口号相匹配。在示例解决方案中,它设置为6511。 将本地端口号设置为0 在窗口底部按“确定”以确认更改。

 

4.将TRob1Main.mod中的代码添加到RAPID模块中。可以通过在侧边栏上选择模块,将代码复制粘贴到编辑器中,或者通过右键单击T_ROB1任务,选择“加载模块...”,然后在文件浏览器中导航到并选择TRob1Main.mod来完成。如果将使用速度控制,请加载velocity_control_example/TRob1Main.mod。

 

 

至此,robotstudio的设置就完成了。机器人的rapid程序:

MODULE TRob1Main

!======================================================================================================

! Copyright (c) 2018, ABB Schweiz AG

! All rights reserved.

!

! Redistribution and use in source and binary forms, with

! or without modification, are permitted provided that

! the following conditions are met:

!

!    * Redistributions of source code must retain the

!      above copyright notice, this list of conditions

!      and the following disclaimer.

!    * Redistributions in binary form must reproduce the

!      above copyright notice, this list of conditions

!      and the following disclaimer in the documentation

!      and/or other materials provided with the

!      distribution.

!    * Neither the name of ABB nor the names of its

!      contributors may be used to endorse or promote

!      products derived from this software without

!      specific prior wrSitten permission.

!

! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE

! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR

! SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER

! CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,

! OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF

! THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

!======================================================================================================

 

    !***********************************************************

    ! Program data

    !***********************************************************

    ! Home position.

    LOCAL CONST jointtarget home := [[0, 0, 0, 0, 30, 0], [9E9, 9E9, 9E9, 9E9, 9E9, 9E9]];

 

    ! Identifier for the EGM correction.

    LOCAL VAR egmident egm_id;

 

    ! Limits for convergance.

    LOCAL VAR egm_minmax egm_condition := [-0.1, 0.1];

 

    !***********************************************************

    !

    ! Procedure main

    !

    !   This RAPID code exemplify how to run EGM joint position

    !   motions.

    !

    !   Note: Update the UCDevice "ROB_1" with correct

    !         values for the remote address and port

    !         (i.e. to the EGM server).

    !

    !         Update via RobotStudio:

    !         Controller tab -> Configuration ->

    !         Communication -> Transmission Protocol

    !

    !***********************************************************

    PROC main()

        MoveAbsJ home, v200, fine, tool0;

 

 

        ! Register an EGM id.

        EGMGetId egm_id;

 

        ! Setup the EGM communication.

        EGMSetupUC ROB_1, egm_id, "default", "ROB_1", \Joint;

 

        ! Prepare for an EGM communication session.

        EGMActJoint egm_id

                    \J1:=egm_condition

                    \J2:=egm_condition

                    \J3:=egm_condition

                    \J4:=egm_condition

                    \J5:=egm_condition

                    \J6:=egm_condition

                    \MaxSpeedDeviation:=20.0;

        WHILE TRUE DO

            ! Start the EGM communication session.

            EGMRunJoint egm_id, EGM_STOP_HOLD, \J1 \J2 \J3 \J4 \J5 \J6 \CondTime:=5 \RampOutTime:=5;

        ENDWHILE

        ! Release the EGM id.

        EGMReset egm_id;

 

 

    ERROR

        IF ERRNO = ERR_UDPUC_COMM THEN

            TPWrite "Communication timedout";

            TRYNEXT;

        ENDIF

    ENDPROC

ENDMODULE

 

如果嫌配置麻烦的朋友,只是想体验一下在robotstudio里仿真的感觉,可以使用我提供的ABB的包,用robotstudio打开即可。请注意,用于在机器人和控制计算机之间进行连接的网络参数可能会有所不同,并且需要重新配置。可参考上文的配置方法。

 

一旦完成上面的设置,无论是通过Pack and Go还是设置新的机器人,模拟都准备好运行了。在RAPID选项卡下通过选择T_ROB1(对于外部轴示例还需选择T_EXTAXIS)作为所选任务,然后点击功能区中的启动图标来启动控制器。然后,robotstudio将每隔几秒钟尝试与ROS 2驱动程序建立连接。一旦连接建立,就可以从ROS 2计算机控制模拟的机器人了。

 

要使用RobotStudio启动,请设置use_fake_hardware:=false和rws_ip:=<ROBOTSTUDIO_IP>,将<ROBOTSTUDIO_IP>替换为RobotStudio计算机的IP。对于ROS来说,RobotStudio就像是一个真实的机器人:

ros2 launch abb_bringup abb_control.launch.py description_package:=abb_irb1200_support description_file:=irb1200_5_90.xacro launch_rviz:=false moveit_config_package:=abb_irb1200_5_90_moveit_config use_fake_hardware:=false rws_ip:=<ROBOTSTUDIO_IP>

在启动控制器之后,启动MoveIt:

ros2 launch abb_bringup abb_moveit.launch.py robot_xacro_file:=irb1200_5_90.xacro support_package:=abb_irb1200_support moveit_config_package:=abb_irb1200_5_90_moveit_config moveit_config_file:=abb_irb1200_5_90.srdf.xacro

现在,ros2就可以和robotstudio的控制器连接上了。可以使用moveit来控制robotstudio仿真的机械臂,当然控制实际机械臂也是一样的。

我目前的项目是使用软件将图片或者文字转换成路径矢量图,再将矢量图解析成ABB机器人的路径轨迹,然后通过ROS2来发送路径轨迹到机器人控制器里,来实现abb机器人的写字绘画功能。由于这部分涉及到公司代码,不方便展示。大家可以自行搜索相关方法。

Ros2接收ABB机器人轨迹通过egm发送给机器人控制器的节点框架也发个大家参考:

import rclpy

from rclpy.node import Node

from abb_egm_msgs.msg import EGMJointPath

 

class RobotPathSender(Node):

    def __init__(self):

        super().__init__('robot_path_sender')

        self.publisher_ = self.create_publisher(EGMJointPath, 'egm_joint_path_topic', 10)

        self.subscription_ = self.create_subscription(YourPathMessageType, 'path_topic', self.path_callback, 10)

        self.subscription_.  # 设置消息回调

 

    def path_callback(self, msg):

        # 将接收到的路径轨迹消息转换为EGMJointPath消息

        egm_path = EGMJointPath()

        egm_path.header = msg.header

        egm_path.num_joints = len(msg.joints)

        egm_path.joints = msg.joints

 

        # 发布EGMJointPath消息

        self.publisher_.publish(egm_path)

 

def main(args=None):

    rclpy.init(args=args)

    robot_path_sender = RobotPathSender()

    rclpy.spin(robot_path_sender)

    robot_path_sender.destroy_node()

    rclpy.shutdown()

 

if __name__ == '__main__':

    main()

大家自行在上面代码中修改。

项目测试的图片:

 

由于最近,我们的机械臂在教学使用,没办法连接到实机上进行过多验证。后面,等机械臂回来了,我会在实机上测试一套3d视觉自动生成机器人轨迹的算法。等测试成功,在向大家汇报。

  通过这次的测试,旭日X3 model依托其强大的算力,能完美运行abb机器人的ros2包,包括可视化的rviz都运行的非常流畅,这样我在后面的机器人项目上使用旭日X3 model更有信心了。

相信我会利用这块开发板做出更有意思的产品。后期也会继续分享我的使用详情,敬请关注。再次感谢古月居和地平线。瑞思拜!!!

附上ABB ros2的包,供大家学习使用:

链接:https://pan.baidu.com/s/12AyhFlwbGxuIZ7GsPrSwrw?pwd=f8pu

提取码:f8pu