在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中仿真实现。
Unitree源码
参考教程文档