> 技术文档 > 如何在 Isaac Sim 中导入和控制 SO100Arm Kit

如何在 Isaac Sim 中导入和控制 SO100Arm Kit

记一次IsaccSIm与ROS2的使用

这是第一次使用IsaccSIm和ROS2

也是第一次使用CSDN在网上记录点东西

这边选用的机械臂是Seeed Studio的SO100Arm Kit

平台是window11+wsl,加速平台是4060Laptop

第一步自然是下载与安装Isaac Sim

Isaac Sim - Robotics Simulation and Synthetic Data Generation | NVIDIA Developer

目前出了5.0,但是稳定板本是4.5,这边选用4.5

Download

找到IsaccSIm,无前后缀的

Window6.5GB

下载完成并解压,大概12G

进入内部,在资源管理器的地址栏输入cmd,可以快捷在当前目录打开命令提示符

执行

isaac-sim.selector.bat

命令行窗口不用关,可以看到debug信息

这个时候可以启动IsaccSIm了,但是我们的目的是接入Ros2控制

下一步就是下载Ros2,

所以关掉IsaccSIm,这个时候命令行还有作用,先留着不要关闭

ROS2是要安装在wsl里面的

wsl的具体配置这里不展开了

wsl安装好ubuntu24以后,进入系统

 Ubuntu Universe repository安装好

sudo apt install software-properties-commonsudo add-apt-repository universe

添加ROS2库

sudo apt update && sudo apt install curl -yexport ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F \"tag_name\" | awk -F\\\" \'{print $4}\')curl -L -o /tmp/ros2-apt-source.deb \"https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo $VERSION_CODENAME)_all.deb\" # If using Ubuntu derivates use $UBUNTU_CODENAMEsudo dpkg -i /tmp/ros2-apt-source.deb

更新数据库

sudo apt update

更新软件包

sudo apt upgrade

做完准备工作以后

就可以正式安装ros2了(不需要桌面环境,只安装base)

sudo apt install ros-humble-ros-basesudo apt install ros-dev-tools

设置ros环境

source /opt/ros/humble/setup.bash

至此ros2安装完成

接下来库连接IsaccSIm与ros2了

回到IsaccSIm的命令行界面

输入,绑定ID以通讯wsl的ros2

set ROS_DOMAIN_ID=0 set ROS_LOCALHOST_ONLY=0

再运行

isaac-sim.selector.bat

RosBridge和Libraries都选择如图的样式

出现loaded时,IsaccSIm加载成功

这个时候可以开始添加机械臂了

这里的机械臂使用的是https://github.com/ZhuYaoHui1998/SO-ARM100.git的

打开IsaccSIm->File->import

找到\\SO-ARM100-main\\URDF\\SO_5DOF_ARM100_8j_URDF_SLDASM\\urdf下的SO_5DOF_ARM100_8j_URDF.SLDASM.urdf,双击导入

导入成果图

(tips:IsaccSIm有很多bug,如果出现卡死,可以看控制台信息,追溯问题)

然后删除原有的root里的ArticulationRoot,我们需要自己创建一个

右键->Add->Physics->ArticulationRoot

然后创建地板与物理场景

创建完成以后

添加ActionGraph

添加On Playback Tick,ROS2 Publish Joint State, Articulation Controller, ROS2 Subscribe Joint State.

如图连线

选中Articulation Controller,绑定机械臂

至此,机械臂已经绑定到完成,点击play

场景会进行计算,刚开始机械臂会因为臂悬空而出现晃动,此时,可以使用ros开始控制机械臂了

返回wsl,设置ROS域,与Isaac Sim的类似

export ROS_DOMAIN_ID=0export ROS_LOCALHOST_ONLY=0export RMW_IMPLEMENTATION=rmw_fastrtps_cpp

启用ros环境(非必要?)

source /opt/ros/humble/setup.bash

写入控制程序

这里可以从官方拿代码直接跑

lerobot/lerobot/scripts at main · ZhuYaoHui1998/lerobot · GitHub

这边选用了lerobot_publisher.py

import rclpyfrom rclpy.node import Nodefrom sensor_msgs.msg import JointStateimport numpy as npimport timeclass TestROS2Bridge(Node): def __init__(self): super().__init__(\"test_ros2bridge\") # 创建发布者。此发布者将发布 JointState 消息到 /joint_command 主题。 self.publisher_ = self.create_publisher(JointState, \"joint_command\", 10) # 创建 JointState 消息 self.joint_state = JointState() self.joint_state.name = [ \"Rotation\", \"Pitch\", \"Elbow\", \"Wrist_Pitch\", \"Wrist_Roll\", \"Jaw\" ] num_joints = len(self.joint_state.name) # 确保 Kit 的编辑器处于播放状态以接收消息 self.joint_state.position = np.array([0.0] * num_joints, dtype=np.float64).tolist() self.default_joints = [0, 0, 0, 0, 0, 0] # 将运动限制在较小范围内(这不是机器人的范围,仅是运动范围) self.max_joints = np.array(self.default_joints) + 0.3 self.min_joints = np.array(self.default_joints) - 0.3 # 使用位置控制让机器人围绕每个关节摆动 self.time_start = time.time() timer_period = 0.05 # 秒 self.timer = self.create_timer(timer_period, self.timer_callback) def timer_callback(self): self.joint_state.header.stamp = self.get_clock().now().to_msg() joint_position = ( np.sin(time.time() - self.time_start) * (self.max_joints - self.min_joints) * 0.5 + self.default_joints ) self.joint_state.position = joint_position.tolist() # 将消息发布到主题 self.publisher_.publish(self.joint_state)def main(args=None): rclpy.init(args=args) ros2_publisher = TestROS2Bridge() rclpy.spin(ros2_publisher) # 显式销毁节点 ros2_publisher.destroy_node() rclpy.shutdown()if __name__ == \"__main__\": main()

直接运行,可以看到机械臂运动

耗时三个小时,成功跑起来了

再这篇文章里,没有涉及ros的节点配置,但是已经成功使用rosrun跑过一次了

后发现不用rosrun,python直接执行也可以

ros的高层抽象对于机器人还是非常友好的,下次找个时间写一下ROS的节点创建,配置,运行

此岸长梦,夜难眠