当前位置: 首页 > news >正文

宇树ROS1开源模型在ROS2中Gazebo中仿真

以GO1为例

1. CMakelists.txt更新语法

cmake_minimum_required(VERSION 3.8)
project(go1_description)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
find_package(sensor_msgs REQUIRED)
find_package(gazebo_ros REQUIRED)
find_package(xacro REQUIRED)

# 安装URDF和Xacro文件
install(DIRECTORY
  urdf/
  DESTINATION share/${PROJECT_NAME}/urdf
)

# 安装启动文件
install(DIRECTORY
  launch/
  DESTINATION share/${PROJECT_NAME}/launch
)

ament_package()

2. packge.xml更新语法

<?xml version="1.0"?>
<package format="3">
    <name>go1_description</name>
    <version>0.0.0</version>
    <description>The go1_description package</description>

    <maintainer email="laikago@unitree.cc">unitree</maintainer>
    <license>TODO</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <depend>rclcpp</depend>
  <depend>std_msgs</depend>
  <depend>sensor_msgs</depend>
  <depend>gazebo_ros</depend>
  <depend>xacro</depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

3. 新建launch文件

import os
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import Command, LaunchConfiguration, PathJoinSubstitution
from launch_ros.actions import Node
from ament_index_python.packages import get_package_share_directory

def generate_launch_description():
    pkg_path = get_package_share_directory('go1_description')
    
    # 使用xacro命令生成URDF
    xacro_file = os.path.join(pkg_path, 'xacro', 'robot.xacro')
    robot_description = Command(['xacro ', xacro_file])

    # 启动Gazebo
    gazebo = IncludeLaunchDescription(
        PythonLaunchDescriptionSource([os.path.join(
            get_package_share_directory('gazebo_ros'), 'launch', 'gazebo.launch.py'
        )])
    )

    # 发布机器人状态
    robot_state_publisher_node = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        output='both',
        parameters=[{'robot_description': robot_description}]
    )

    # 在Gazebo中生成实体
    spawn_entity = Node(
        package='gazebo_ros',
        executable='spawn_entity.py',
        arguments=['-topic', 'robot_description', '-entity', 'my_robot'],
        output='screen'
    )

    return LaunchDescription([
        DeclareLaunchArgument(
            'world',
            default_value='worlds/empty.world'
        ),
        gazebo,
        robot_state_publisher_node,
        spawn_entity,
    ])

4. colcon编译包

cd ~/suo/unitree_ros/robots/go1_description
colcon build --packages-select go1_description
source install/setup.bash

在这里插入图片描述

5. 启动仿真

ros2 launch go1_description spawn_robot.launch.py

在这里插入图片描述

6. 最终效果

在这里插入图片描述

http://www.dtcms.com/a/67111.html

相关文章:

  • HCIE考试经验分享:我的华为云服务HCIE认证奋斗史
  • Java 大视界 -- Java 大数据在智慧文旅虚拟导游与个性化推荐中的应用(130)
  • 【PyMySQL】Python操作MySQL
  • Html5记忆翻牌游戏开发经验分享
  • 通过deepseek学习lua写网页
  • SQLark 实战 | 如何从Excel、csv、txt等外部文件进行数据导入
  • doris:SQL 方言兼容
  • 蓝桥杯2024年第十五届省赛真题-团建
  • Modbus RTU协议详解:基于 STM32 与脉冲电源的通信项目实例
  • vscode关闭仓库后如何打开
  • Adobe Genuine Service Alert 一直弹窗,老是一直弹窗【解决方法】
  • 微信小程序:实现多功能表格效果,例如滚动效果、宽度自定义、多选、行内编辑等功能
  • PostgreSQL16 的双向逻辑复制
  • Android实现简易计算器
  • Go执行当前package下的所有方法
  • 侯捷C++课程学习笔记:详解智能指针(三)
  • Feign中@RequestBody 与 @RequestParam 的区别
  • Vue3:组件通信方式
  • 暴力破解Excel受保护的单元格密码
  • 大数据学习(59)-DataX执行机制
  • 云原生性能测试全解析:如何构建高效稳定的现代应用?
  • 【数据结构】-哈夫曼树以及其应用
  • 基于ESP32的桌面小屏幕实战[8]:任务创建
  • package.json 依赖包约束及快速删除node_modules
  • 【GOOGLE插件】chrome.runtime.sendNativeMessage与本地应用交互
  • 爬虫案例十三js逆向模拟登录中大网校
  • 使用OpenCV和MediaPipe库——抽烟检测(姿态监控)
  • 【大模型技术】怎么用agent和prompt工程实现用户的要求?
  • c++ 中的float和double 的区别 开发过程中使用哪个更好
  • Centos离线安装perl