ROS2 humble和ubuntu 22.04中在自己的小车上仿真搭载mid360(保姆级教程)

环境:ROS2 humble   

           Ubuntu 22.04

相关借鉴:PB_RM_Simulation(对着相关文件修改或者编写自己的文件,很重要!着重看仿真部分)  livox_laser_simulation_ros2(mid360的Xacro) Solidworks导出URDF(得到meshs,urdf文件)

写在前面:由于本篇文章很多部分都是借鉴pb_rm_simulation代码仓库,所以先把他git下来,学习借鉴修改自己的文件。本文没有提供自己的urdf文件,有需要的可以私信我。

1. git PB_RM_Simulation仓库以及SDK2安装

具体步骤可以查看代码仓库

1.1 先在home目录中新建一个文件夹我的就叫mid360。

1.2 克隆仓库

git clone --recursive https://gitee.com/SMBU-POLARBEAR/pb_rmsimulation --depth=1

1.3 SDK2的安装及其问题

sudo apt install cmake
git clone https://github.com/Livox-SDK/Livox-SDK2.git
cd ./mid360/Livox-SDK2/
mkdir build
cd build
cmake .. && make -j

到cmake .. && make -j这一步后可能会出现下图的warning,类似下面的提示。

解决方法 

找到文件 /home/mid360/Livox-SDK2/3rdparty/rapidjson/internal/dtoa.h ,将第36行:

RAPIDJSON_DIAG_OFF(array - bounds)  // some gcc versions generate wrong warnings

修改为:

RAPIDJSON_DIAG_OFF(array-bounds)  // some gcc versions generate wrong warnings

 其实就是删除空格,再次编译。

sudo make install

完成安装。

1.4 安装依赖

cd pb_rm_simulation

rosdep install -r --from-paths src --ignore-src --rosdistro $ROS_DISTRO -y

1.5 编译

colcon build --symlink-install

等待编译成功,到这里我们的雷达驱动就已经下载好了,一个是刚刚下载的SDK2一个是PB_RM_Simulation里面自带的driver 2。

2. 小车模型建立

2.1 创建你机器人建模型的功能包

到src下在此文件夹下新建一个Python的功能包

ros2 pkg create mybot_description --build-type ament_python

2.2 将SolidWorks生成的urdf文件导入进该功能包中

选中这几个文件,其中world文件可以替换成自己的。(需要在launch文件中确认好文件路径)

值得注意的是urdf文件,如果你的urdf模型加载不出来可能是找不到mesh里的stl模型,需要将urdf文件里的

<mesh filename="package://mybot_description/meshes/base_link.STL" />

替换成

<mesh filename="file://$(find mybot_description)/meshes/link1.STL" />

千万不要忘了在setup.py文件里面加入以下几行不然install目录下没有。

以下是我的setup.py文件

from setuptools import find_packages, setup
import os
from glob import glob
package_name = 'mybot_description'

setup(
    name=package_name,
    version='0.0.0',
    packages=find_packages(package_name),
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
        (os.path.join('share', package_name, 'launch'), glob(os.path.join('launch', '*.launch.py'))),
        (os.path.join('share', package_name, 'urdf'), glob(os.path.join('urdf', '*.*'))),
        (os.path.join('share', package_name, 'meshes'), glob(os.path.join('meshes', '*.*'))),
        (os.path.join('share', package_name, 'urdf/sensors'), glob(os.path.join('urdf/sensors', '*.*'))),
        (os.path.join('share', package_name, 'world'), glob(os.path.join('world', '*.*'))),   
      
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='muxiaochi',
    maintainer_email='Mxc@qq.com',
    description='TODO: Package description',
    license='TODO: License declaration',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
        ],
    },
)

2.3  编写launch文件(详细可以看SolidWorks导出URDF那篇文章)

gazebo.launch.py

import os

from ament_index_python.packages import get_package_share_directory


from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource

from launch_ros.actions import Node


def generate_launch_description():


    # Include the robot_state_publisher launch file, provided by our own package. Force sim time to be enabled
    # !!! MAKE SURE YOU SET THE PACKAGE NAME CORRECTLY !!!

    package_name='mybot_description' #<--- CHANGE ME
    world_file_path = 'world/custom_room.world'
    
    pkg_path = os.path.join(get_package_share_directory(package_name))
    world_path = os.path.join(pkg_path, world_file_path)  
    
    # Pose where we want to spawn the robot
    spawn_x_val = '0.0'
    spawn_y_val = '0.0'
    spawn_z_val = '0.0'
    spawn_yaw_val = '0.0'
  
    mbot = IncludeLaunchDescription(
                PythonLaunchDescriptionSource([os.path.join(
                    get_package_share_directory(package_name),'launch','mbot.launch.py'
                )]), launch_arguments={'use_sim_time': 'true', 'world':world_path}.items()
    )

    # Include the Gazebo launch file, provided by the gazebo_ros package
    gazebo = IncludeLaunchDescription(
                PythonLaunchDescriptionSource([os.path.join(
                    get_package_share_directory('gazebo_ros'), 'launch', 'gazebo.launch.py')]),
             )

    # Run the spawner node from the gazebo_ros package. The entity name doesn't really matter if you only have a single robot.
    spawn_entity = Node(package='gazebo_ros', executable='spawn_entity.py',
                        arguments=['-topic', 'robot_description',
                                   '-entity', 'mbot',
                                   '-x', spawn_x_val,
                                   '-y', spawn_y_val,
                                   '-z', spawn_z_val,
                                   '-Y', spawn_yaw_val],
                        output='screen')



    # Launch them all!
    return LaunchDescription([
        mbot,
        gazebo,
        spawn_entity,
    ])

mbot.launch.py

import os

from ament_index_python.packages import get_package_share_directory

from launch import LaunchDescription
from launch.substitutions import LaunchConfiguration
from launch.actions import DeclareLaunchArgument
from launch_ros.actions import Node

import xacro


def generate_launch_description():

    # Check if we're told to use sim time
    use_sim_time = LaunchConfiguration('use_sim_time')

    # Process the URDF file
    pkg_path = os.path.join(get_package_share_directory('mybot_description'))
    urdf_file = os.path.join(pkg_path, 'urdf', 'mbot_description.urdf')
    robot_description_config = xacro.process_file(urdf_file)
    
    # Create a robot_state_publisher node
    params = {'robot_description': robot_description_config.toxml(), 'use_sim_time': use_sim_time}
    node_robot_state_publisher = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        output='screen',
        parameters=[params]
    )


    # Launch!
    return LaunchDescription([
        DeclareLaunchArgument(
            'use_sim_time',
            default_value='false',
            description='Use sim time if true'),

        node_robot_state_publisher
    ])

gazebo.launch.py(该文件里有环境路径,可自己删掉,或者自己新建一个world文件,导入自己的环境)   

package_name='mybot_description' #<--- CHANGE ME

 world_file_path = 'world/custroom.world'

mbot.launch.py中有加载urdf文件的名称,需要修改为你自己的。

2.4  编译运行

cd mid360
colcon build --packages-select mybot_description
#这里只构建一个功能包 如果直接colcon build的话太慢了


source install/setup.bash
ros2 launch mybot_description gazebo.launch.py

可以看到得到的小车是倒着的,可能是因为solidworks转urdf时坐标系发生了变化,因此我们需要绕X轴旋转180°,将gazebo.launch.py修改一下加入这一行。

重新编译运行

3. 搭载mid360模型

3.1 mid360模型搭载

由于livox官方没有提供雷达仿真在ros2中实现,所幸的是,有大神已经作了相关的移植工作。相关的链接见livox_laser_simulation_RO2, 具体用法可以直接看他的readme。

按照他的说法可以直接将这一段加入你的urdf或者xacro文件中

但是实际我colcon build后出现了报错

解决办法:我将我的urdf文件写成了xacro的形式,具体的转化可以要chat gpt帮你弄,按照它的模版可以自己修改。具体流程是:URDF转Xacro,随后修改自己的urdf文件名我的是mbot_description.urdf---->mbot_description.xacro,然后修改自己的mbot.launch.py中的

urdf_file = os.path.join(pkg_path, 'urdf', 'mbot_description.urdf')

改为

urdf_file = os.path.join(pkg_path, 'urdf', 'mbot_description.xacro')

最后还需要去pb_rm_simulation这个功能包source一下setup.bash不然会出现找不到ros2_livox_simulation这个包也就是有mid360.xacro和模型文件的包。

执行命令

ros2 launch mybot_description gazebo.launch.py

3.2 搭载imu模型

可以看到我们这里加载出来了mid360是悬空的,是因为我预留了一个imu底座用来支撑Mid360。(这里是借鉴pb_rm_simulation里面的urdf的)

我们可以看到里面有imu joint和imu link

自己更改适合自己模型的大小和位置。

3.3 加插件与美化颜色

这里模型已经出来了,我们需要加入imu plugin插件从而获取imu的数据。

之前的图我们可以看到gazebo中加载的小车没有颜色,gazebo需要SDF格式,所以需要写一个gazebo标签为自己的小车上个色。

再重新编译运行

再查看话题imu和lidar信息都可以通过echo打印出来

4. 用Fast_lio进行建图

cd mid360
source install/setup.bash
ros2 launch fast_lio mapping.launch.py

打开rviz后将

改为base_link,建图效果如图所示。

5. 待做

由于本文只是进行了仿真建图的环节,其实还可以给小车加入双轮差速控制插件用键盘控制节点来控制小车,后续完成了会更新。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值