genesis平台
一个比robosuite更简洁的物理平台,专为通用机器人/人工智能/物理AI应用而设计。
install
- 需求:
- Python: 3.9+
所以我
conda create -n genesis python==3.10
- OS: Linux (recommended) / MacOS / Windows 但windows不太方便。
- Python: 3.9+
所以我
- ~~
pip install genesis-world
~~ 因为这个项目还在即时更新,建议用github clone方式安装- ~/work文件夹里面
git clone https://github.com/Genesis-Embodied-AI/Genesis.git
export PYTHONPATH=~/work/Genesis
这个是修改python路径的,不是永久的。- 如果需要经常使用的话
sudo vim ~/.bashrc
- 加入
export PYTHONPATH=~/work/Genesis:$PYTHONPATH
保存
- 在work里创建一个文件夹写代码。可以调用Genesis下面的genesis
- 安装pytorch
- 以上就是最基础的安装,还有一些额外的根据需求安装即可
- 更新:因为genesis还在更新中,偶尔需要更新
python -m pip install --upgrade pip
pip install --upgrade 包名称
- 在Genesis里
git pull
基础使用
开始
1 | import genesis as gs |
分析
- 导入genesis并初始化
- 创建场景Scene:一个场景包含一个simulator对象,处理所有底层物理求解器,以及一个visualizer对象,管理与可视化相关的概念。创建场景时,可以配置各种物理求解器参数。
- 将对象加载到场景中,所有对象和机器人都表示为Entity,Genesis设计为完全面向对象:用scene.add_entity
- 构建场景并开始模拟:scene.build() 和 step
可视化
设置相机参数
1 | import genesis as gs |
控制robot
1 | import numpy as np |
- 从第0步到第500步,我们使用位置控制来控制所有自由度,并依次将机器人移动到3个目标位置。注意,对于control_*API,一旦设置了目标值,它将被内部存储,你不需要在接下来的步骤中重复发送命令,只要你的目标保持不变。
- 在第750步,我们展示了可以对不同的自由度进行混合控制:对于第一个自由度(自由度0),我们发送一个速度命令,而其余的仍然遵循位置控制命令。
- 在第1000步,我们切换到扭矩(力)控制,并向所有自由度发送一个零力命令,机器人将再次因重力而掉落到地面。
逆运动学与运动规划
如何在Genesis中使用逆运动学(IK)和运动规划,并执行一个简单的抓取任务。
1 | python |
调试
pip install ipython
有bug,终止交易.等作者改
entity
物体模型
内部模型
xml(MJCF)
根据代码 1
2
3
4
5
6
7
8
9franka = scene.add_entity(
gs.morphs.MJCF(
file = 'xml/franka_emika_panda/panda.xml',
pos = (0, 0, 0),
euler = (0, 0, 45), # we follow scipy's extrinsic x-y-z rotation convention, in degrees,
# # quat = (1.0, 0.0, 0.0, 0.0), # we use w-x-y-z convention for quaternions,
scale = 1,
),
)
利用file
参数从xml/
导入,xml从当时安装genesis的env中找。以linux为例,这个项目的xml文件在work/Genesis/genesis/assets/xml
里面
除了franka_emika_panda,还有另外几个,而且panda也有好几个选项。从外部导入文件没有fixed,就设置重力为0,在Scene初始化的时候
1 | sim_options=gs.options.SimOptions( |
- franka_emika_panda 是MJCF格式的
- hand.xml 就一个夹持头
- panda_no_tendon.xml 没有腱,这是什么?
- scene.xml 和之前的panda有区别吗
- franka_sim
- ball.xml 啥都没
- bi-franka_panda.xml
- frank_panda.xml
- franka_panda_teleop.xml
- franka_panda_test_convex.xml
- universal_robots_ur5e
- ur5e.xml 没有hand。。
- 其它
- ant.xml 也是什么都没有
- ant_grasp_ball.xml 有一个球
- ant_grasp_ground.xml 也没东西
- one_tet.xml 无
- thin_box.xml 无
- three_joint_link.xml 有个东西
- two_box.xml 还是没东西
- two_skeleton.xml 我去,什么东西跳过去了
urdf
assets文件夹里面还有其它形式的。都尝试尝试
尝试了下示例代码,有点困难
外部导入
- 文件格式 xml
- 可以从形状原语shape primitives, meshes, URDF, MJCF, Terrain, or soft robot description files、网格、URDF、MJCF、地形或软体机器人描述文件中实例化Genesis实体。
- 待续,我尝试从mujoco提供的模型示例导入,失败
- 加入
contype="0" conaffinity="0"
在xml 的<geom>中 可能有用吧
操作
操作流程不复杂,给pos和quat让它自计算ik就行。但问题是pos和quat可能会越界,不知道这个怎么解决。我本来想用gs view给的上下限倒推pos的,但是很奇怪它给的get_pos的返回的都不是我想要的值。
控制的基本流程
- 场景搭建
- 地面
- 机械臂
- 目标物体
- 定义机械臂的关节索引和控制器参数(限制)
- ik求解关节角度、规划运动路径、执行,最好在这里同时打开hand,就是设置qpos[:-2]最后两位的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20qpos = franka.inverse_kinematics(
link = end_effector,
pos = np.array([0.65, 0.0, 0.25]),
quat = np.array([0, 1, 0, 0]),
)
# 规划运动路径
path = franka.plan_path(
qpos_goal = qpos,
num_waypoints = 200, # 2秒时长
)
# 执行规划路径
for waypoint in path:
franka.control_dofs_position(waypoint)
scene.step()
# 等待到达最后一个路径点
for i in range(100):
scene.step() - ik求解向下移动到位置
- 抓取
怎么链接到对应关节
总结一下:要翻xml文件。
franka_emika_panda的panda
joint(关节)和dof(自由度)是两个相关概念。
以Franka机械臂为例,它的手臂有7个旋转关节,夹爪有2个平移关节,每个关节有1个自由度,总共9个自由度。更一般地,像自由关节(6自由度)或球形关节(3自由度)这样的关节有多个自由度。
franka_sim/bi-franka_panda
- 不知道它几个关节几个自由度:genesis内部的可以用
gs view 'xml/franka_sim/bi-franka_panda.xml'
查看 - 现在知道它有7*2个panda joint dof 和2*2个finger joint dof,一共18个,然后panda joint部分是第1、3、5、7、9、11、13对应单臂,另外一半对应双臂。15、16对应单臂的夹爪。
- 好了现在开始改ikmp部分的代码。
- 可视化,加载双臂机器人、物体、平面
- 移动机械臂关节到物体上方
- 向下移动机械臂
- 抓取
让robot保持静止
- 获取各joint的初始状态
- set joint状态
1 | staticqpos=franka.get_qpos() |