主题
备战TCEI 2026 (二) 机器臂赛道环境搭建
在上一期回顾了机器狗赛道的环境搭建。这一期我们来回顾一下机器臂赛道的环境搭建。机械狗赛道的搭建除了仿真源码外,基础环境几乎和机器狗赛道相同。
也可以查看本次备战系列的其他文章:
比赛规则与比赛文件
首先回顾一下机器臂赛道的比赛规则。
另外,我们需要准备赛道的比赛文件。在提供百度网盘中查找这些文件。
机器臂赛道比赛文件,比赛文件中的介绍markdown文件为本地环境搭建。我们继续利用算力自由平台,我们可以在云端获得干净环境,从而快速搭建环境。
也可以部分参考初赛培训视频: 机械狗赛道培训视频
和机械狗类似,比赛的环境包括了:
- 源代码
- ROS 1
- IsaacSim 4.5
- yolo V8
- 九格大模型
我们继续使用相同的EICON大赛专用-IsaacSim4.5+ROS1开发环境镜像,内置了ROS1和IsaacSim 4.5以及conda等基础工具。
由于镜像内的noVNC版本比较老,不支持直接复制粘贴,先参考这个文档升级VNC(https://www.gpufree.cn/docs/guide/know_issue/novnc_clipboard.html)。
使用平台镜像快速创建
点击上方的链接,直接进入平台镜像页面。在开始的环境搭建阶段,我们需要一卡就足够了。直接点击快速创建。

镜像页面中有快速启动和已知问题是必须参考的内容,页面中的详细说明后续还会用到。
初次使用算力自由平台,可以参看平台快速开始文档。
专用镜像体积较大,可能需要较长的拉取时间,需要几分钟或者十几分钟的等待。开机过程是不会收取算力费用的。
开机完成会自动弹出VNC远程桌面,或者可以自行在控制台打开VNC页面。

为了方便后续复制粘贴命令,可以使用实例远程桌面内的firefox浏览器打开本网页。
下载源码
将分享的百度盘的源码文件夹下的jaka和EAICON放在/root/gpufree-data文件夹下。可以在远程桌面中的浏览器,安装百度网盘linux deb版本,进行下载。 
或者
bash
# 安装4.17.7版本,是当前最新版本。未来可能会有更新。
cd /root/gpufree-data/
wget https://039ede-1874119700.antpcdn.com:19001/b/pkg-ant.baidu.com/issue/netdisk/LinuxGuanjia/4.17.7/baidunetdisk_4.17.7_amd64.deb
dpkg -i baidunetdisk_4.17.7_amd64.deb将源码拷贝到/root/gpufree-data/文件夹下,形成如下文件目录:
/root/gpufree-data/
├── jaka/
└── EAICON/编译安装jaka
bash
cd /root/gpufree-data/jaka
catkin_make
# 修改环境变量
echo "export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libffi.so.7" >> ~/.bashrc
echo "source /root/gpufree-data/jaka/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc修改文件
bash
# 修改文件第一行为#!/usr/bin/env python
# /root/gpufree-datajaka/devel/lib/large_scale_model_arm/isaac_yolov8.py
# /root/gpufree-datajaka/devel/lib/large_scale_model_arm/isaac_scale.py
sed -i '1c\#!/usr/bin/env python' /root/gpufree-data/jaka/devel/lib/large_scale_model_arm/isaac_yolov8.py
sed -i '1c\#!/usr/bin/env python' /root/gpufree-data/jaka/devel/lib/large_scale_model_arm/isaac_scale.py注册IsaacSim
bash
echo "export ISAACSIM_PATH=\"/root/isaacsim\"" >> ~/.bashrc
echo "export ISAACSIM_PYTHON_EXE=\"/root/isaacsim/python.sh\"" >> ~/.bashrc
source ~/.bashrcROS 1环境
ROS 1环境是已经预装的,在快速启动中包括了他的启动方式: 
直接开启三个终端: 
终端一
bash
roscore # 启动 ROScore终端二
bash
rosrun turtlesim turtlesim_node终端三
bash
rosrun turtlesim turtle_teleop_key结果输出
使用键盘上下左右操作,可以看到界面上的小乌龟在按照键盘指令移动。测试完成后可以关闭终端一二三。 
IsaacSim 4.5环境
注册IsaacSim
bash
echo "export ISAACSIM_PATH=\"/root/isaacsim\"" >> ~/.bashrc
echo "export ISAACSIM_PYTHON_EXE=\"/root/isaacsim/python.sh\"" >> ~/.bashrc
source ~/.bashrc新建独立的终端四
终端四
IsaacSim安装在/root/isaacsim
cd /root/isaacsim
# 启动
./isaac-sim.sh首次启动,需要访问Nvidia官方下载部分相关文件,可能会较慢。在使用之前,建议关闭IsaacSim默认的Eco Mode,并打开DLSS以提高性能。

测试完成后关闭终端四。
yolo V8环境安装
yolo V8的安装相对比较简单,需要我们自行安装。建议先设置GitHub加速,
终端五
bash
# 安装yolo V8
conda create -n yolov8 python=3.8安装过程需要输入几次回车或者'y'。
bash
conda activate yolov8
# 安装pytorch
# pytorch推荐在官网获取安装命令,根据自己的cuda版本选择合适的命令。
# 如果选择平台提供的镜像,相关cuda是确定的,可以使用以下命令
pip3 install torch torchvision
# 拉取yolo V8代码
cd /root/gpufree-data
git clone https://github.com/ultralytics/ultralytics.git
cd ultralytics
# 安装yolo V8
pip install -e .完成后可以关闭终端五。
九格大模型环境安装
在官方的百度网盘下载比赛专用源码: 九格大模型比赛文件
文件非常大,有大概8GB,仅下载比赛专用源码Embodied文件夹,百度网盘下载模型文件在没有会员的情况下非常缓慢。模型我们后续在九格官方下载。速度会快得多。 
终端6
下载九格大模型:
bash
cd /root/gpufree-data
mkdir inference
mkdir inference/FM9G4B-V
# 此处官方文档的下载内容有误,最后的文件名应该是FM9G4B-V,而不是主分支的9G4B
wget https://thunlp-model.oss-cn-wulanchabu.aliyuncs.com/FM9G4B-V.tar.gz
# 解压
tar -xvf FM9G4B-V.tar.gz
mv FM9G4B-V/* inference/FM9G4B-V/
# 由于官方提供的源代码指定的模型位置为/home/q/model/FM9G4B-V,且分散于各个文件,我们创建软连接
mkdir -p /home/q/model
mkdir -p /home/q/jaka
ln -s /root/gpufree-data/inference/FM9G4B-V /home/q/model/FM9G4B-V
ln -s /root/gpufree-data/jaka /home/q/jaka
sed -i '53s|/home/q/jaka/best.pt|/root/gpufree-data/jaka/best.pt|' /root/gpufree-data/jaka/src/large_scale_model_arm/scripts/yolov8.py将下载的Embodied文件夹放在之前创建的/root/gpufree-data/inference文件夹下。形成这样的文件目录:
/root/gpufree-data/inference/
├── FM9G4B-V/
└── Embodied/创建虚拟环境inference并安装依赖
bash
conda create -n inference python=3.10安装过程需要输入几次回车或者'y'。
bash
conda activate inference
cd /root/gpufree-data/inference/Embodied
# 安装依赖
pip install -r requirements.txt
# 缺少一个类库,手动安装
pip install protobuf
pip install rospkg catkin_pkg
pip install opencv-python-headless
# 请注意,一下会强制安装python3.10不支持的numpy==1.24.4。如果后续能跑报错可以忽略。
# 如果后续因为安装了别的东西,升级了numpy,需要降级回来。如果彻底无法运行,建议拆分为两个虚拟环境。
pip uninstall -y numpy
pip install "numpy==1.24.4" --no-cache-dir
# conda环境下,需要设置LD_LIBRARY_PATH,否则会缺少类库
echo "export LD_LIBRARY_PATH=/opt/conda/envs/inference/lib/python3.10/site-packages/nvidia/cudnn/lib:$LD_LIBRARY_PATH" >> ~/.bashrc
source ~/.bashrc测试模型
bash
cd /root/gpufree-data/inference/Embodied/inference
# 修改test.py的模型文件夹
# 将test.py中的/model/FM9G4B-V修改为/root/gpufree-data/inference/FM9G4B-V
sed -i 's|/model/FM9G4B-V|/root/gpufree-data/inference/FM9G4B-V|g' test.py
python test.py输出下图即为测试成功: 
至此,环境搭建完成。可以关闭所有的终端窗口。
启动仿真
需要多个终端窗口:
bash
# 终端一
roscore # 启动 ROScorebash
# 终端二
# 进入工作空间
cd /root/gpufree-data/EAICON
# 启动仿真环境
sh run_jaka_sim.shbash
# 终端三
# 进入工作空间
cd /root/gpufree-data/jaka
# 激活 yolov8 环境
conda activate yolov8
pip3 install rospkg catkin_pkg
# 运行 Python文件
rosrun large_scale_model_arm isaac_yolov8.pybash
# 终端四
# 进入工作空间
cd /root/gpufree-data/jaka
# 激活 inference 环境
conda activate inference
# 运行 Python文件
rosrun large_scale_model_arm isaac_scale.pybash
# 终端五
# 进入工作空间
cd /root/gpufree-data/jaka
# 退出当前环境,返回默认环境
conda deactivate
# 运行 launch文件
roslaunch large_scale_model_arm isaac_jaka.launch终端一、四、五会bolck在执行状态,终端二、三会打开isaacsim+yolo。形成以下界面。 
大模型接口
该版本通用大模型参数量为40亿,具有高效训练与推理和高效适配与部署的技术特点,具备文本问答、文本分类、机器翻译、文本摘要等自然语言处理能力。九格百亿级通用基础大模型的参数量为4B(40亿)。可在 https://thunlp-model.oss-cn-wulanchabu.aliyuncs.com/9G4B.tar 里下载。
本表聚焦“九格”接口设计中与大模型相关的部分,将其抽象为模型加载、推理调用两大核心单元,具体接口列表如下:
| 接口名称 | 描述 | 调用方式 | 输入参数 | 输出 | 异常处理 |
|---|---|---|---|---|---|
| 模型加载接口 | 从本地或远程路径加载大模型及其 Tokenizer | AutoModel.from_pretrained AutoTokenizer.from_pretrained | - model_file (字符串):权重与配置存放路径 - trust_remote_code (布尔):是否信任远程自定义代码 | - self.model (模型对象) - self.tokenizer (分词器对象) | 捕获并 rospy.logerr,加载失败时置空并退出订阅流程 |
| 推理调用接口 | 根据输入图像与文本 Prompt,调用模型生成推理结果 | model.chat(image=None, msgs, tokenizer=self.tokenizer) | - msgs (列表):每项为字典 |
1.模型加载接口
python
self.model = AutoModel.from_pretrained(
model_file: str,
trust_remote_code: bool = True,
attn_implementation: str = 'sdpa',
torch_dtype: torch.dtype = torch.bfloat16
)
self.tokenizer = AutoTokenizer.from_pretrained(
model_file: str,
trust_remote_code: bool = True
)参数说明
model_file:本地或远程路径,预训练模型权重与配置所在目录。
trust_remote_code:是否信任并执行仓库中的自定义代码。
attn_implementation 与 torch_dtype:可选优化参数。
输出说明
self.model:已加载并 eval() 的模型实例,已切换到 CUDA(若可用)。
self.tokenizer:对应的分词器,用于构造输入tokens。
异常处理
捕获任何加载错误,调用 rospy.logerr("模型加载失败: %s", e) 并将self.model/self.tokenizer 置为 None,后续流程根据空值判断跳过订阅与推理。
2.推理调用接口
model_res = self.model.chat(
image=None,
msgs: List[Dict[str, Any]],
tokenizer=self.tokenizer
)输入说明
msgs:长度可变的消息列表,每条消息格式为:
{
'role': 'user',
'content': [pil_image: PIL.Image.Image, prompt: str]
} pil_image:从最新 ROS 彩色帧转换而来。
prompt:用户或上层脚本动态输入的文本提示。
输出说明
model_res:大模型返回的推理结果,可为文本、结构化数据或二次封装,随后转换为字符串发布。
调用时机
在 self.new_bbox_request == True 且最新图像帧已获取时触发。
异常处理
推理过程中捕获任何异常并调用 rospy.logerr("调用大模型进行处理时出错: %s", e),当前帧推理终止,不影响后续请求。
机械臂接口
1.运动控制接口
本表列出了本次仿真中机械臂及夹爪的 ROS 话题接口。
| 话题名称 | 消息类型 | 发布/订阅 | 功能说明 |
|---|---|---|---|
/Jaka/get_end_effector_pose | geometry_msgs/PoseStamped | 发布 | 获取末端执行器(机械臂手腕)在基座坐标系下的位置和姿态 |
/Jaka/set_end_effector_pose | geometry_msgs/PoseStamped | 订阅 | 设置末端执行器目标位置和姿态 |
/Jaka/get_gripper_value | std_msgs/Float64 | 发布 | 获取当前夹爪开合关节的数值(单位:米,范围 0 – 0.04) |
/Jaka/set_gripper_value | std_msgs/Float64 | 订阅 | 发送夹爪目标开合数值(单位:米,范围 0 – 0.04) |
/Jaka/get_jointstate | sensor_msgs/JointState | 发布 | 获取机器人各关节的当前位置、速度和力矩 |
/Jaka/tf | tf | 发布 | 发布机器人各坐标系之间的变换 |
/Jaka/gripper_is_captured | std_msgs/Bool | 发布 | 夹爪是否已经抓取到物体,True 表示成功抓取,False 表示尚未抓取 |
1.1夹爪控制逻辑---增量闭合策略
从
/Jaka/get_gripper_value读取当前夹爪开合数值g。在循环中,以固定步长 Δ=0.001 m 递增发送:
new_g = g + 0.001 publish("/Jaka/set_gripper_value", new_g)每次发送后,订阅
/Jaka/gripper_is_captured话题:若返回
False,继续增量闭合;若返回
True,表示夹爪已成功夹住物品,停止发送增量命令。
2.相机接口
本表列出了仿真中相机相关的 ROS 话题接口,用于获取深度图、相机参数以及 RGB 图像。
| 话题名称 | 消息类型 | 发布/订阅 | 功能说明 |
|---|---|---|---|
/Jaka/camera_depth | sensor_msgs/Image | 发布 | 深度相机图像,像素值为深度(单位:米),用于场景深度感知。 |
/Jaka/camera_info | sensor_msgs/CameraInfo | 发布 | 相机内参(焦距、光心、畸变系数等),供图像去畸变与三维重建使用。 |
/Jaka/camera_rgb | sensor_msgs/Image | 发布 | RGB 彩色图像(编码:rgb8),用于视觉检测、语义分割或显示画面。 |
深度图像 (/Jaka/camera_depth)
- 常见编码:
32FC1或16UC1 - 可直接用于点云生成或距离测量。
相机信息 (/Jaka/camera_info)
- 包含
K(3×3 内参矩阵)、D(畸变系数)、R(旋转矩阵)、P(投影矩阵)等字段。 - 与图像话题配对使用,确保去畸变与精确投影。
彩色图像 (/Jaka/camera_rgb)
- 编码
rgb8,分辨率与帧率与深度图保持一致。 - 可用于目标检测、语义分割、大模型推理等上层算法输入。
3.规划控制接口
| 类 / 位置 | 函数 | 说明 | 调用时机 |
|---|---|---|---|
JakaRmpFlowController (jaka_env.py) | plan_and_execute_trajectory(target_pos, target_rot_wxyz, duration=5.0) | 末端 IK → TRRT* → 样条 → 保存轨迹 | 收到新目标时 |
update_trajectory_tracking(gripper_value) | 依据 self.trajectory 做线性插值并下发关节位置 | 每帧 | |
forward_and_track(gripper_value=None) | 包装:跟踪 + 夹爪状态机 | 每帧 | |
get_end_effector_pose() | 正向解算,返回 (pos, quat_wxyz) | 多处 | |
reset() | 初始化关节/夹爪 | world.reset | |
SimEnvironment (jaka_sim.py) | step() | 检测新目标 → 调规划 → 调跟踪 → 发布 ROS 数据 | 每帧 |
publish_ros_data() | 发 /pose /joint_states /gripper_efforts | 每帧 |