当前位置:网站首页>pybullet机器人仿真环境搭建 5.机器人位姿可视化
pybullet机器人仿真环境搭建 5.机器人位姿可视化
2022-06-26 16:05:00 【RuiH.AI】
前言
本篇记录一下如何在pybullet中可视化机器人的位姿。
在仿真环境中画线
pybullet提供了在仿真环境中添加点线文本的api,比如addUserDebugLine, addUserDebugPoints等,并返回这些点线的id,可用于后续的删除修改。
这里我写了一个画物体坐标系的函数,来可视化位姿,代码应该很容易懂:
def draw_pose_in_pybullet(*pose):
""" *Draw pose frame in pybullet* :param pose: np.ndarray, shape=[4, 4] or tuple of (position, orientation) """
if len(pose) == 1:
position = pose[0][:3, 3]
rotation = pose[0][:3, :3]
else:
position, orientation = pose
print(orientation)
rotation = np.array(p.getMatrixFromQuaternion(orientation)).reshape([3, 3])
print(rotation)
start_point = position
end_point_x = position + rotation[:, 0] * 2
end_point_y = position + rotation[:, 1] * 2
end_point_z = position + rotation[:, 2] * 2
p.addUserDebugLine(start_point, end_point_x, [1, 0, 0])
p.addUserDebugLine(start_point, end_point_y, [0, 1, 0])
p.addUserDebugLine(start_point, end_point_z, [0, 0, 1])
代码例程
把上面的函数与上一篇pybullet环境的博客结合,给出机器人当前的位姿:
import time
import numpy as np
import pybullet
import pybullet_data
def draw_pose_in_pybullet(*pose):
""" *Draw pose frame in pybullet* :param pose: np.ndarray, shape=[4, 4] or tuple of (position, orientation) """
if len(pose) == 1:
position = pose[0][:3, 3]
rotation = pose[0][:3, :3]
else:
position, orientation = pose
print(orientation)
rotation = np.array(pybullet.getMatrixFromQuaternion(orientation)).reshape([3, 3])
print(rotation)
start_point = position
end_point_x = position + rotation[:, 0] * 2
end_point_y = position + rotation[:, 1] * 2
end_point_z = position + rotation[:, 2] * 2
pybullet.addUserDebugLine(start_point, end_point_x, [1, 0, 0])
pybullet.addUserDebugLine(start_point, end_point_y, [0, 1, 0])
pybullet.addUserDebugLine(start_point, end_point_z, [0, 0, 1])
if __name__ == '__main__':
client = pybullet.connect(pybullet.GUI)
pybullet.setAdditionalSearchPath(pybullet_data.getDataPath())
pybullet.setPhysicsEngineParameter(numSolverIterations=10)
pybullet.configureDebugVisualizer(pybullet.COV_ENABLE_RENDERING, 0)
pybullet.configureDebugVisualizer(pybullet.COV_ENABLE_GUI, 0)
pybullet.configureDebugVisualizer(pybullet.COV_ENABLE_TINY_RENDERER, 0)
pybullet.setGravity(0, 0, -9.8)
# pybullet.setRealTimeSimulation(1)
shift = [0, 0, 0]
scale = [1, 1, 1]
visual_shape_id = pybullet.createVisualShape(
shapeType=pybullet.GEOM_MESH,
fileName="sphere_smooth.obj",
rgbaColor=[1, 1, 1, 1],
specularColor=[0.4, 0.4, 0],
visualFramePosition=[0, 0, 0],
meshScale=scale)
collision_shape_id = pybullet.createCollisionShape(
shapeType=pybullet.GEOM_MESH,
fileName="sphere_smooth.obj",
collisionFramePosition=[0, 0, 0],
meshScale=scale)
pybullet.createMultiBody(
baseMass=1,
baseCollisionShapeIndex=collision_shape_id,
baseVisualShapeIndex=visual_shape_id,
basePosition=[-2, -1, 1],
useMaximalCoordinates=True)
plane_id = pybullet.loadURDF("plane100.urdf", useMaximalCoordinates=True)
cube_ind = pybullet.loadURDF('cube.urdf', (3, 1, 1), pybullet.getQuaternionFromEuler([0, 0, 0]))
r_ind = pybullet.loadURDF('r2d2.urdf', (1, 1, 1), pybullet.getQuaternionFromEuler([0, 0, 1.57]))
# 创建结束,重新开启渲染
pybullet.configureDebugVisualizer(pybullet.COV_ENABLE_RENDERING, 1)
num_joints = pybullet.getNumJoints(r_ind)
# 获得各关节的信息
joint_infos = []
for i in range(num_joints):
joint_info = pybullet.getJointInfo(r_ind, i)
if joint_info[2] != pybullet.JOINT_FIXED:
if 'wheel' in str(joint_info[1]):
print(joint_info)
joint_infos.append(joint_info)
maxforce = 10
velocity = 31.4
while True:
pybullet.removeAllUserDebugItems() # 把之前的线删除,否则会一直在仿真环境中出现
for i in range(len(joint_infos)):
pybullet.setJointMotorControl2(bodyUniqueId=r_ind,
jointIndex=joint_infos[i][0],
controlMode=pybullet.VELOCITY_CONTROL,
targetVelocity=velocity,
force=maxforce)
position, orientation = pybullet.getBasePositionAndOrientation(r_ind)
draw_pose_in_pybullet(position, orientation)
pybullet.stepSimulation()
time.sleep(1./240)
可视化效果如下:
需要注意,画线操作和删除线操作都会严重影响pybullet引擎的运行速度,实际感觉一卡一卡的。
边栏推荐
- Solana capacity expansion mechanism analysis (1): an extreme attempt to sacrifice availability for efficiency | catchervc research
- redis的二进制数组命令
- 01 backpack DP
- 数据分析----numpy快速入门
- NFT Platform Security Guide (1)
- Arduino UNO + DS1302简单获取时间并串口打印
- R语言plotly可视化:plotly可视化归一化的直方图(historgram)并在直方图中添加密度曲线kde、并在直方图的底部边缘使用geom_rug函数添加边缘轴须图
- 9 Tensorboard的使用
- Ideal path problem
- 大话领域驱动设计——表示层及其他
猜你喜欢

Angel 3.2.0 new version released! Figure the computing power is strengthened again

理想路径问题

【蓝桥杯集训100题】scratch辨别质数合数 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第15题

Anaconda3安装tensorflow 2.0版本cpu和gpu安装,Win10系统

李飞飞团队将ViT用在机器人身上,规划推理最高提速512倍,还cue了何恺明的MAE...

基于 MATLAB的自然过渡配音处理方案探究

Unlock the value of data fusion! Tencent angel powerfl won the "leading scientific and Technological Achievement Award" at the 2021 digital Expo

C# 读写文件从用户态切到内核态,到底是个什么流程?

OpenSea上如何创建自己的NFT(Polygon)

Stepn débutant et avancé
随机推荐
5 model saving and loading
I want to know how to open an account through online stock? Is online account opening safe?
JS教程之 使用 Electron.JS 构建原生桌面应用程序乒乓游戏
JS教程之Electron.js设计强大的多平台桌面应用程序的好工具
What is the process of switching C # read / write files from user mode to kernel mode?
Comprehensive analysis of discord security issues
7 user defined loss function
LeetCode 单周赛298,前三题
JS creative icon navigation menu switch background color
H5 close the current page, including wechat browser (with source code)
精致妆容成露营“软实力”,唯品会户外美妆护肤产品销量激增
Stepn débutant et avancé
01 backpack DP
R language generalized linear model function GLM, GLM function to build logistic regression model, analyze whether the model is over discrete, and use the ratio of residual deviation and residual degr
TCP拥塞控制详解 | 1. 概述
李飞飞团队将ViT用在机器人身上,规划推理最高提速512倍,还cue了何恺明的MAE...
NFT transaction principle analysis (2)
R语言使用cor函数计算相关性矩阵进行相关性分析,使用corrgram包可视化相关性矩阵、行和列使用主成分分析重新排序、下三角形中使用平滑的拟合线和置信椭圆,上三角形中使用散点图、对角线最小值和最大值
网页课程设计大作业——华山旅游网
Failed to get convolution algorithm. This is probably because cuDNN failed to initialize