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文件里的
替换成
千万不要忘了在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. 待做
由于本文只是进行了仿真建图的环节,其实还可以给小车加入双轮差速控制插件用键盘控制节点来控制小车,后续完成了会更新。