Skip to content

7000 通讯包使用教程

本文介绍 ROS 2 与 inexbot 控制器之间通过 socket 协议、7000 端口进行通讯的具体流程。

1. 修改控制器配置

ROS 2 功能包依赖 7000 端口与控制器通信。使用前需通过 SSH 登录控制器,修改 controller.json 配置文件。

SSH 登录控制器

bash
ssh inexbot@192.168.x.x  # 替换为实际控制器 IP

密码:123

修改文件权限

bash
cd robot/
cd config/
sudo chmod 777 controller.json

关闭 CRC 校验

打开 controller.json,在 hostComputerService 节点下找到 checkCRC,将 true 改为 false

2. 创建工作空间

bash
mkdir -p ~/inexbot/src

3. 编译功能包

inexbot_service 功能包放入 ~/inexbot/src,然后编译:

bash
cd ~/inexbot/
colcon build

4. 启动通讯节点

启动 nrc_rostopic_joint(连接控制器)

bash
source install/setup.bash
ros2 run inexbot_service nrc_rostopic_joint

若出现终端中以下输出,则代表与控制器连接成功。不同的控制器 IP 可能不同,需要根据实际情况在 nrc_rostopic_joint.cpp 中修改 IP。

启动 rostopic_joint(演示程序)

bash
source install/setup.bash
ros2 run inexbot_service rostopic_joint

演示程序功能说明

rostopic_joint.cpp 作为 demo,旨在向客户演示 ROS 2 与 inexbot 控制器的通讯。出现 input your number 字样后,可以输入 1-6,不同的数字分别代表不同的功能:

数字功能
1从控制器中读取 IO 信息
2向控制器中写入 IO 信息
3停止查询指令
4读取机器人的实际坐标
5控制机器人走到姿态 1
6控制机器人走到姿态 2

核心代码示例

cpp
switch(s_number) {
    case 1: { // 读IO
        Json::Value rootSend;
        Json::FastWriter fWriter;
        rootSend["channel"] = 1;
        rootSend["stop"] = 0;
        rootSend["robot"] = 1;
        rootSend["mode"] = 1;      // 0:只回复一次, 1:定时回复
        rootSend["interval"] = 1000; // 1000ms回复一次
        rootSend["queryType"][(unsigned int)0] = "IO";
        rootSend["typeCfg"]["IO"][(unsigned int)0] = "DO1";
        rootSend["typeCfg"]["IO"][1] = "DO2";
        rootSend["typeCfg"]["IO"][2] = "DO3";
        rootSend["typeCfg"]["IO"][3] = "DO4";
        rootSend["typeCfg"]["IO"][4] = "DO5";
        str = fWriter.write(rootSend);
        break;
    }
    case 2: { // 写IO
        Json::Value rootSend_1;
        Json::FastWriter fWriter_1;
        rootSend_1["IO"]["DO1"] = 1;
        rootSend_1["IO"]["DO2"] = 0;
        rootSend_1["IO"]["DO3"] = 1;
        rootSend_1["IO"]["DO4"] = 0;
        str = fWriter_1.write(rootSend_1);
        break;
    }
    case 3: { // 停止查询
        printf("tell me channel number is ???\n");
        int channel_num;
        scanf("%d", &channel_num);
        Json::Value rootSend;
        Json::FastWriter fWriter;
        rootSend["channel"] = channel_num; // 需停止的通道,最多支持9个
        rootSend["stop"] = 1;
        str = fWriter.write(rootSend);
        break;
    }
    case 4: { // 读实际坐标
        Json::Value rootSend;
        Json::FastWriter fWriter;
        rootSend["channel"] = 2;
        rootSend["stop"] = 0;
        rootSend["robot"] = 1;
        rootSend["mode"] = 1;
        rootSend["interval"] = 1000;
        rootSend["queryType"][(unsigned int)0] = "realPosMCS";
        str = fWriter.write(rootSend);
        break;
    }
    case 5: { // 控制运动到姿态1
        Json::Value rootSend;
        Json::FastWriter fWriter;
        rootSend["robot"] = 1;
        rootSend["clearBuffer"] = 1;
        rootSend["targetMode"] = 0;
        rootSend["cfg"]["coord"] = "MCS";
        rootSend["cfg"]["speed"] = 20;
        rootSend["cfg"]["acc"] = 20;
        rootSend["cfg"]["moveMode"] = "MOVJ";
        rootSend["targetPos"][0] = 530.433;
        rootSend["targetPos"][1] = 7.497;
        rootSend["targetPos"][2] = 118.728;
        rootSend["targetPos"][3] = 3.141593;
        rootSend["targetPos"][4] = 0;
        rootSend["targetPos"][5] = -0.1;
        str = fWriter.write(rootSend);
        break;
    }
    case 6: { // 控制运动到姿态2
        Json::Value rootSend;
        Json::FastWriter fWriter;
        rootSend["robot"] = 1;
        rootSend["clearBuffer"] = 1;
        rootSend["targetMode"] = 0;
        rootSend["cfg"]["coord"] = "MCS";
        rootSend["cfg"]["speed"] = 20;
        rootSend["cfg"]["acc"] = 20;
        rootSend["cfg"]["moveMode"] = "MOVJ";
        rootSend["targetPos"][0] = 574.964434;
        rootSend["targetPos"][1] = -37.208582;
        rootSend["targetPos"][2] = 150;
        rootSend["targetPos"][3] = 3.141593;
        rootSend["targetPos"][4] = 0;
        rootSend["targetPos"][5] = 0.2;
        str = fWriter.write(rootSend);
        break;
    }
    default:
        RCLCPP_INFO(this->get_logger(), "scanf is: %d", s_number);
        break;
}

控制器端配置

首先,打开示教器,新建一个工程,然后打开这个工程。

插入指令,选择:运动控制类 → 外部点

然后将示教器切为运行模式,运行该工程。

通过监控,可以看出此时机器人在直角坐标系下的点位。

在运行 rostopic_joint.cpp 的终端中输入 5,此时在运行 nrc_rostopic_joint.cpp 的终端中会出现以下效果。

机器人开始移动,最终在直角坐标系下的点位变换成我们发给控制器的点位。注意:若没有运行,可以按下 START 试试。

然后在运行 rostopic_joint.cpp 的终端中输入 6,点击 START,则机器人运行到 case 6 中的点位。