基于Ubuntu20.04虚拟机搭建宇树机器狗go2 gazebo仿真环境

时间:2026-02-06 10:14:24 | 阅读:8 | AI安全
基于Ubuntu20.04虚拟机搭建宇树机器狗go2 gazebo仿真环境

1:实验准备

1:ros安装

确保已经安装好了ros,如果没有安装好,可以使用以下指令进行安装: wget http://fishros.com/install -O fishros && . fishros 20260206_102923_4f9fee38.png 1.选1 20260206_103109_2e78c9c4.png 2.选1(第一次选1,二次往后可1可2) 20260206_103116_25467764.png 3.选择ros1 melodic/ros1 noetic (有哪个选哪个,20.04选noetic) 20260206_103121_f5fc55fd.png 4.选桌面版,选1 20260206_103921_557f760e.png 5.ros安装完毕(要验证可以输入roscore验证) 20260206_103923_01709695.png ROS moetic版本效果如下 20260206_104201_fe80bacd.png ROS noetic版本如下(如果是20.04效果如下) 20260206_104202_2013ff6c.png

2:依赖安装

1:依赖1

sudo apt-get install liblcm-dev 20260206_104433_c5103291.png 未安装可能出现的问题:后面编译部分报错但依然可进入拟环境,但模块控制不可用

2:依赖2

sudo apt-get install ros-noetic-controller-interface ros-noetic-gazebo-ros-control ros-noetic-joint-state-controller ros-noetic-effort-controllers ros-noetic-joint-trajectory-controller 20260206_104637_65d4b513.png 可能出现的问题:Ubuntu版本>20.04则可能无法安装(因为g++等依赖版本太低)

3:创建工作空间

mkdir -p test_ws/src 20260206_104940_746f3671.png

4.进入工作空间的src

cd test_ws/src 20260206_105042_8bf1356a.png

5.unitree_legged_sdk

1.获取功能包

git clone https://github.com/unitreerobotics/unitree_legged_sdk.git 20260206_105222_25696aa8.png

2.进入功能包并创建build文件

cd unitree_legged_sdk && mkdir build 20260206_105302_8e3b2ded.png

3.进入build文件夹

cd build 20260206_105457_e257f472.png

4.编译功能包

cmake .. 20260206_105614_aa05d511.png make 20260206_105651_c1ec5a31.png

5.构建 python安装包

cmake -DPYTHON_BUILD=TRUE .. 20260206_105735_3adfe7fa.png

6.unitree_ros_to_real

1.获取功能包

注意:是在工作空间的src文件下执行 git clone https://github.com/unitreerobotics/unitree_ros_to_real.git 20260206_105848_64abcb45.png

7.unitree_ros

1.获取功能包

注意:是在工作空间的src文件下执行 git clone https://github.com/unitreerobotics/unitree_ros.git 20260206_110013_10bd50c2.png

8.unitree_guide

1.获取功能包

注意:是在工作空间的src文件下执行 git clone https://github.com/unitreerobotics/unitree_guide.git 20260206_110254_0c686878.png

9.编译工作空间

catkin_make

1.如果一切顺利,效果将如下:

20260206_120420_1bcd7f96.png

2.问题及解决:

我在test_ws工作空间下进行编译时就出现了以下问题 20260206_120520_7a567555.png 如何解决: rm -rf build devel/ 20260206_120601_d4cf6b5d.png 随后编译 : catkin_make 20260206_120641_56939482.png

3.source

source devel/setup.bash 20260206_120722_c86119d9.png 至此,准备工作就已经全部完成 。

2.仿真启动

1.启动

roslaunch unitree_guide gazeboSim.launch rname:=go2 20260206_120849_a6cb4c8e.png

2.问题与解决:

1.问题
在执行的时候如果在anconda的虚拟环境当中,就有可能会运行失败: 20260206_121013_2d94d3f3.png
2.解决方法
conda deactivate roslaunch unitree_guide gazeboSim.launch rname:=go2 20260206_121104_b5b624a5.png

3.文件修改

尽管使用最开始的命令也能使用,但我更推荐对gazeboSim.launch文件进行修改: cd src/unitree_guide/unitree_guide/launch/ 20260206_121239_7b30c9f9.png 打开文件: 1.手动寻找文件 20260206_121319_adcadfaf.png 2.gedit法 gedit gazeboSim.launch 20260206_121405_7d689453.png 3.vim法(对不熟悉的人较麻烦的方法) 未安装vim是无法使用的 安装如下: sudo apt install vim 20260206_121557_285ca8de.png vim gazeboSim.launch 20260206_121631_68cb2a7e.png 20260206_121632_7dbae99f.png 4.将go1修改为go2 20260206_121733_5b0bed22.png

3.启动控制

./devel/lib/unitree_guide/junior_ctrl 按键2是站立,按键4是行走模式,按下4键后就可以使用方向wasd键进行运动控制了,jl进行转向控制。 20260206_121733_5b0bed22.png 问题: 在我使用虚拟机进行腿部控制的时候会出现如下问题,但使用实体机并未出现,暂时还未知是何种原因导致。 初步判断为虚拟机性能导致,因此在这里推荐使用实体机进行实验。 20260206_121924_cc65e88b.png

4.排错

20260206_122117_341ae4b0.png 以上错误由于test_ws/src/unitree_ros-master/robots/go2_description/xacro/robot.xacro中的mech标签使用了一个不存在的三维模型路径,将其中的 mesh filename="package://go2_description/meshes/trunk.dae" scale="1 1 1"/> 改为 mesh filename="package://go2_description/meshes/base.dae" scale="1 1 1"/> 即可

4.进阶控制

先前所讲的导航模式,实际上是宇树官方开放给ros navigation导航栈的接口,当自主导航时由局部规划器输出 geometry_msgs/Twist 类型的速度命令话题 /cmd_vel,底层运动驱动会实时订阅该话题,进而控制机器人行走运动。 宇树官方驱动中,导航模式默认是关闭编译的,需要开启后重新编译 unitree guide。具体在~test_ws/unitree_sim/src/unitree_guide/unitree_guide/CMakeLists.txt中: 将第1行中 version4.14和第11行中的set(MOVE_BASE OFF) 改为 version3.14和第11行中的set(MOVE_BASE ON),然后重新编译该包: cd ~/test_ws # 单独编译 unitree guide 包 catkin_make -DCATKIN_WHITELIST_PACKAGES="unitree_guide" 以下为控制脚本go2.py #!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys import select import termios import tty import rospy from geometry_msgs.msg import Twist HELP_TEXT = """ ========================================================= 键盘控制说明 Keyboard Control Help ========================================================= 移动控制(平移): q w e 左前 前进 右前 a s d 左移 停止 右移 z x c 左后 后退 右后 对角线移动(45°平移): f g h b 左前45° 右前45° 左后45° 右后45° 旋转控制(原地旋转): r t 左转 右转 速度调节: u / i : 增加 / 减少 线速度 j / k : 增加 / 减少 角速度 m / , : 同时调整 线速度和角速度 其他: 其他按键 : 停止运动 CTRL + C : 退出程序 ========================================================= """ class KeyboardTeleop: def __init__(self): rospy.init_node("keyboard_control", anonymous=True) self.pub = rospy.Publisher("/cmd_vel", Twist, queue_size=1) # 参数 self.max_lin = rospy.get_param("~speed", 0.8) self.max_ang = rospy.get_param("~turn", 0.8) # 速度状态 self.target = [0.0, 0.0, 0.0, 0.0] self.current = [0.0, 0.0, 0.0, 0.0] self.acc_step = 0.1 self.dec_step = 0.1 # 键位绑定 self.motion_map = { 'w': (1, 0, 0, 0), 'e': (1, 0, 0, -1), 'a': (0, 1, 0, 0), 'd': (0, -1, 0, 0), 'q': (1, 0, 0, 1), 'x': (-1, 0, 0, 0), 'c': (-1, 0, 0, 1), 'z': (-1, 0, 0, -1), 'r': (0, 0, 0, 1), 't': (0, 0, 0, -1), 'f': (1, 1, 0, 0), 'h': (-1, 1, 0, 0), 'g': (1, -1, 0, 0), 'b': (-1, -1, 0, 0), } self.speed_map = { 'u': (1.1, 1.0), 'i': (0.9, 1.0), 'j': (1.0, 1.1), 'k': (1.0, 0.9), 'm': (1.1, 1.1), ',': (0.9, 0.9), } self.settings = termios.tcgetattr(sys.stdin) self.last_key = None print("\033[2J\033[H") print(HELP_TEXT) # ---------------- 键盘读取 ---------------- def read_key(self): tty.setraw(sys.stdin.fileno()) readable, _, _ = select.select([sys.stdin], [], [], 0.1) key = sys.stdin.read(1) if readable else "" termios.tcsetattr(sys.stdin, termios.TCSADRAIN, self.settings) return key # ---------------- 插值平滑 ---------------- @staticmethod def smooth(curr, tgt, acc, dec): step = acc if curr < tgt else dec if abs(curr - tgt) <= step: return tgt return curr + step if curr < tgt else curr - step # ---------------- 状态显示 ---------------- def display(self, key): print("\033[25;0H", end="") print("\033[K[Speed ] linear: %5.2f angular: %5.2f" % (self.max_lin, self.max_ang)) print("\033[K[ Key ] %s" % (key if key else "None")) print("\033[K--------------------------------------------------") print("\033[K[Target ] X:%6.2f Y:%6.2f Z:%6.2f Th:%6.2f" % tuple(self.target)) print("\033[K[Current] X:%6.2f Y:%6.2f Z:%6.2f Th:%6.2f" % tuple(self.current)) print("\033[K--------------------------------------------------", end="") # ---------------- Twist 发布 ---------------- def publish_twist(self): msg = Twist() msg.linear.x = self.current[0] * self.max_lin msg.linear.y = self.current[1] * self.max_lin msg.linear.z = self.current[2] * self.max_lin msg.angular.z = self.current[3] * self.max_ang self.pub.publish(msg) # ---------------- 主循环 ---------------- def spin(self): rate = rospy.Rate(20) while not rospy.is_shutdown(): key = self.read_key() if key in self.motion_map: self.target = list(self.motion_map[key]) self.dec_step = 0.1 elif key in self.speed_map: self.max_lin *= self.speed_map[key][0] self.max_ang *= self.speed_map[key][1] else: self.target = [0.0] * 4 self.dec_step = 0.15 if key == "\x03": break for i in range(4): self.current[i] = self.smooth( self.current[i], self.target[i], self.acc_step, self.dec_step ) self.display(key) self.publish_twist() rate.sleep() self.shutdown() # ---------------- 退出清理 ---------------- def shutdown(self): stop = Twist() self.pub.publish(stop) termios.tcsetattr(sys.stdin, termios.TCSADRAIN, self.settings) rospy.loginfo("[keyboard_control] Exit.") if __name__ == "__main__": try: KeyboardTeleop().spin() except Exception as e: rospy.logerr(e) 以下给出整个运动控制流程: chmod +x go.py # 开启gazebo仿真器 roslaunch unitree_guide gazeboSim.launch rname:=go2 # 开启底层运动控制节点 # 在该终端按下按键2站立,然后按下按键5进入导航模式 rosrun unitree_guide junior_ctrl # 启动控制命令脚本 python3 go.py

标签: 机器人安全
相关文章