Appearance
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/src3. 编译功能包
将 inexbot_service 功能包放入 ~/inexbot/src,然后编译:
bash
cd ~/inexbot/
colcon build4. 启动通讯节点
启动 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 中的点位。
