机器狗的仿真

仿真文件架构

在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运行

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源码
参考教程文档

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐