赞
踩
在robot文件夹下,存放着机器人的建模源码包,这里列举a1机器狗的文件结构
这其中主要由config(配置文件)(存储rviz文件配置信息),launch(启动文件),meshes(机器人模型渲染文件),urdf, xacro.
URDF是 Unified Robot Description Format 的首字母缩写,直译为统一(标准化)机器人描述格式,可以以一种 XML 的方式描述机器人的部分结构,比如底盘、摄像头、激光雷达、机械臂以及不同关节的自由度…,该文件可以被 C++ 内置的解释器转换成可视化的机器人模型,是 ROS 中实现机器人仿真的重要组件。
Xacro:
Xacro 是 XML Macros 的缩写,Xacro 是一种 XML 宏语言,是可编程的 XML。
是ROS 中,已经给出了类似编程的优化方案
Xacro 可以声明变量,可以通过数学运算求解,使用流程控制控制执行顺序,还可以通过类似函数的实现,封装固定的逻辑,将逻辑中需要的可变的数据以参数的方式暴露出去,从而提高代码复用率以及程序的安全性。
较之于纯粹的 URDF 实现,可以编写更安全、精简、易读性更强的机器人模型文件,且可以提高编写效率。
gazebo常见的两个问题
问题1:[Err] [REST.cc:205] Error in REST request
解决:sudo gedit ~/.ignition/fuel/config.yaml
然后将url : https://api.ignitionfuel.org使用 # 注释
再添加url: https://api.ignitionrobotics.org
问题2:启动时抛出异常:[gazebo-2] process has died [pid xxx, exit code 255, cmd…
解决:killall gzserver和killall gzclient
在launch文件中有默认启动机器狗及地图模型,也可以在启动时设置。
启动后,设置的a1机器狗 stairs楼梯 模型加载完毕。
利用rqt_graph查看节点关系
运行unitree_servo节点
机器狗站立,
rqt_graph查看
机器狗旋转与平移
终端运行如上节点,机器狗会以坐标系圆点为圆心,以一定的高度做圆周运动。
这里查看源码
在move_publisher.cpp源文件中。
这里定义了2个枚举变量。
机器狗的圆周运动对应def_frame = WORLD.
可以看到,代码前面设置了圆心坐标,在原点上方0.3m处。
orientation即为设置的方向参数。
而后有设置了周期period 半径radius。
def_frame = ROBOT时。
运行结果如下
可以看到狗以既定的方向移动。
阅读源码部分
model_state_pub.pose.position.x/y/z设定了各个坐标系方向的移动速度
model_state_pub.pose.orientation则依旧对应狗的方向
还有一个外部推力的节点unitree_external_force
运行后通过键盘的 up/down/left/right控制力的方向,
前后左右,来改变狗的x坐标,y坐标
推之前
推一下,倒了,终端会打印坐标的变化值,空格键使变化清零。
这部分源码
switch(c){ case KEYCODE_UP: if(mode > 0) { Fx = 60; } else { Fx += 16; if(Fx > 220) Fx = 220; if(Fx < -220) Fx = -220; } ROS_INFO("Fx:%3d Fy:%3d Fz:%3d", (int)Fx, (int)Fy, (int)Fz); dirty = true; break; case KEYCODE_DOWN: if(mode > 0) { Fx = -60; } else { Fx -= 16; if(Fx > 220) Fx = 220; if(Fx < -220) Fx = -220; } ROS_INFO("Fx:%3d Fy:%3d Fz:%3d", (int)Fx, (int)Fy, (int)Fz); dirty = true; break; case KEYCODE_LEFT: if(mode > 0) { Fy = 30; } else { Fy += 8; if(Fy > 220) Fy = 220; if(Fy < -220) Fy = -220; } ROS_INFO("Fx:%3d Fy:%3d Fz:%3d", (int)Fx, (int)Fy, (int)Fz); dirty = true; break; case KEYCODE_RIGHT: if(mode > 0) { Fy = -30; } else { Fy -= 8; if(Fy > 220) Fy = 220; if(Fy < -220) Fy = -220; } ROS_INFO("Fx:%3d Fy:%3d Fz:%3d", (int)Fx, (int)Fy, (int)Fz); dirty = true; break; case KEYCODE_SPACE: mode = mode*(-1); if(mode > 0){ ROS_INFO("Change to Pulsed mode."); } else { ROS_INFO("Change to Continuous mode."); } Fx = 0; Fy = 0; Fz = 0; ROS_INFO("Fx:%3d Fy:%3d Fz:%3d", (int)Fx, (int)Fy, (int)Fz); dirty = true; break; } if(dirty == true){ pubForce(Fx, Fy, Fz); if(mode > 0){ usleep(100000); // 100 ms Fx = 0; Fy = 0; Fz = 0; pubForce(Fx, Fy, Fz); } dirty=false; } } return; }
可以看到是对应键盘输入后,针对机器狗的坐标进行加减变化,并打印日志。
然后就是站立的节点unitree_servo
这部分源码属于有点读不懂。
具体关于狗的参数设定还比较模糊,以及对Ros(c++)源码的阅读能力还比较差,基本上不了手,后续希望跟进能够尝试实现狗的行走,在gazebo中仿真实现。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。