ros2 humble gazebo+rviz+maprviz(1)

Use GPU to accelerate

先确认 NVIDIA 驱动已安装且正常

nvidia-smi

检查当前渲染显卡(关键):

sudo apt install -y mesa-utils
glxinfo -B | grep -i “opengl renderer”

强制 Gazebo 使用 NVIDIA GPU(双显卡笔记本必做)

echo ’

Force NVIDIA GPU for Gazebo/RViz

export __NV_PRIME_RENDER_OFFLOAD=1
export __GLX_VENDOR_LIBRARY_NAME=nvidia
export __VK_LAYER_NV_optimus=NVIDIA_only

Use OGRE2 for better GPU acceleration

echo "export GZ_RENDER_ENGINE=ogre2 export IGN_RENDER_ENGINE=ogre2’ >> ~/.bashrc
echo “export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/opt/ros/humble/share/turtlebot3_gazebo/models” >> ~/.bashrc
source ~/.bashrc

sudo apt install -y ros-humble-mapviz ros-humble-mapviz-plugins ros-humble-tile-map

ros2 launch nav2_bringup tb3_simulation_launch.py headless:=False
没有启动gazebo,

补充gazebo自身环境,

export TURTLEBOT3_MODEL=waffle
source /usr/share/gazebo/setup.sh
正确导航启动命令(加载官方预设地图)
ros2 launch nav2_bringup tb3_simulation_launch.py headless:=False slam:=False

nvidia-smi show that
|=========================================================================================|
| 0 N/A N/A 2314 G /usr/bin/gnome-shell 42MiB |
| 0 N/A N/A 15747 G gzserver 18MiB |
| 0 N/A N/A 15749 G gzclient 142MiB |
| 0 N/A N/A 15755 G /opt/ros/humble/lib/rviz2/rviz2 47MiB |
±----------------------------------------------------------------------------------------+

ros2 param set /gazebo use_sim_time true
==============gazebo
参考了https://zhuanlan.zhihu.com/p/50400789
从https://gitee.com/lyx52/gazebo_models下载模型,移动models和worlds目录到~/.gazebo/下
gazebo是一款功能强大的三维物理仿真平台,具备强大的物理引擎、高质量的图形渲染、方便的编程与图形接口,最重要的是其开源免费的特性。gazebo中的机器人模型与rviz使用的模型相同,但是需要在模型中加入机器人和周围环境的物理属性,例如质量、摩擦系数、弹性系数等。机器人的传感器信息也可以通过插件的形式加入仿真环境,以可视化的方式进行显示。
gazebo是一款优秀的开源物理仿真环境,它具备如下特点:
动力学仿真:支持多种高性能的物理引擎,例如ODE、Bullet、SimBody、DART等。
三维可视化环境:支持显示逼真的三维环境,包括光线、纹理、影子。
传感器仿真:支持传感器数据的仿真,同时可以仿真传感器噪声。
可扩展插件:用户可以定制化开发插件,扩展gazebo的功能,满足个性化的需求。
多种机器人模型:官方提供PR2、Pioneer2 DX、TurtleBot等机器人模型,当然也可以使用自己创建的机器人模型。
TCP/IP传输:gazebo可以实现远程仿真,后台仿真和前台显示通过网络通信。
云仿真:gazebo仿真可以在Amazon、Softlayer等云端运行,也可以在自己搭建的云服务器上运行。
终端工具:用户可以使用gazebo提供的命令行工具在终端实现仿真控制。
安装
sudo apt install ros-humble-gazebo-ros-pkgs
ros2 launch gazebo_ros gazebo.launch.py

nvidia-smi查询仿真使用gpu情况

相机拍照

============================使用apt安装的mapviz,天地图的瓦片地图怎么都加载不了
参考了https://www.cnblogs.com/cyun2001/p/18769043 《关于mapviz,这一篇就够了》,进行源码编译安装成功
申请天地图的token:http://lbs.tianditu.gov.cn/server/MapService.html

安装依赖:sudo apt-get install ros-humble-mapviz ros-humble-mapviz-plugins ros-humble-tile-map ros-humble-multires-image
git clone https://github.com/swri-robotics/mapviz.git, 使用默认的ros2-devel版本
cd mapviz
colcon build --symlink-install
source install/setup.bash
修改mapviz.lauch.py的初始经纬度和海拔,可以手机安装bigemap软件查询。

cat ./install/mapviz/share/mapviz/launch/mapviz.launch.py
import launch
import launch.actions
import launch.substitutions
import launch_ros.actions


def generate_launch_description():
    return launch.LaunchDescription([
        launch_ros.actions.Node(
            package="mapviz",
            executable="mapviz",
            name="mapviz",
        ),
        launch_ros.actions.Node(
            package="swri_transform_util",
            executable="initialize_origin.py",
            name="initialize_origin",
            parameters=[
                {"local_xy_frame": "map"},
                {"local_xy_origin": "swri"},
                {"local_xy_origins": """[
                    {"name": "swri",
                        "latitude": 3.511475,
                        "longitude": 10.086625,
                        "altitude": 49.93301392,
                        "heading": 0.0},
                    {"name": "back_40",
                        "latitude": 3.511475,
                        "longitude": 10.0886625,
                        "altitude": 49.934,
                        "heading": 0.0}
                ]"""},
            ]
        ),
        launch_ros.actions.Node(
            package="tf2_ros",
            executable="static_transform_publisher",
            name="swri_transform",
            arguments=["0", "0", "0", "0", "0", "0", "map", "origin"]
        )
    ])

ros2 launch mapviz mapviz.launch.py
报错:[mapviz-1] [ERROR] [1778506080.096983297] [mapviz]: Unhandled std::exception in Qt event loop: bad file: /home/chenjunhua/.mapviz_config
删除后重新touch一个空文件解决。

base URL:
http://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={level}&TILEROW={y}&TILECOL={x}&tk=申请的key
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
![应用类型为“服务器端”](https://i-blog.csdnimg.cn/direct/18a5b522b59046abb34659289431e52a.png

在这里插入图片描述
加载图片成功。

模拟gps

#!/usr/bin/env python3

import rclpy
from rclpy.node import Node
from sensor_msgs.msg import NavSatFix
import utm

# 经纬度
latitude = 30.511475
longitude = 104.086625
num_points = 2000
distance_interval = 1

# 坐标转换
def latlon_to_utm(lat, lon):
    return utm.from_latlon(lat, lon)

def utm_to_latlon(easting, northing, zone_number, zone_letter):
    return utm.to_latlon(easting, northing, zone_number, zone_letter)

# 生成轨迹
def generate_utm_trajectory(lat, lon, num_points, distance_interval):
    utm_start = latlon_to_utm(lat, lon)
    zone_number = utm_start[2]
    zone_letter = utm_start[3]
    utm_trajectory = []
    x = utm_start[0]
    y = utm_start[1]
    for _ in range(num_points):
        utm_trajectory.append((x, y, zone_number, zone_letter))
        x += distance_interval
    return utm_trajectory

def utm_trajectory_to_latlon(utm_trajectory):
    latlon_trajectory = []
    for point in utm_trajectory:
        lat, lon = utm_to_latlon(point[0], point[1], point[2], point[3])
        latlon_trajectory.append((lat, lon))
    return latlon_trajectory

# ROS2 节点
class GPSPublisher(Node):
    def __init__(self, latlon_trajectory):
        super().__init__('gps_trajectory_publisher')
        self.publisher_ = self.create_publisher(NavSatFix, '/trajectory', 10)
        self.trajectory = latlon_trajectory
        self.index = 0
        # 10Hz 发布
        self.timer = self.create_timer(0.1, self.timer_callback)
        self.get_logger().info("GPS 轨迹发布节点启动")

    def timer_callback(self):
        if self.index >= len(self.trajectory):
            self.get_logger().info("轨迹播放完成")
            return

        lat, lon = self.trajectory[self.index]
        msg = NavSatFix()
        msg.header.stamp = self.get_clock().now().to_msg()
        msg.header.frame_id = "gps"
        msg.latitude = lat
        msg.longitude = lon
        msg.altitude = 0.0

        self.publisher_.publish(msg)
        self.index += 1

def main(args=None):
    # 生成轨迹
    utm_traj = generate_utm_trajectory(latitude, longitude, num_points, distance_interval)
    latlon_traj = utm_trajectory_to_latlon(utm_traj)

    # ROS2 初始化
    rclpy.init(args=args)
    node = GPSPublisher(latlon_traj)

    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        node.get_logger().info("退出节点")
    finally:
        node.destroy_node()
        rclpy.shutdown()

if __name__ == '__main__':
    main()

下图绿线条为效果:
在这里插入图片描述

在这里插入图片描述

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/41b2c5d9fe4140e2b962f569ac103e76.png

=======================fast livo2仿真=

FAST-LIVO2 核心依赖

sudo apt install -y libeigen3-dev libopencv-dev libpcl-dev libyaml-cpp-dev
sudo apt install -y ros-humble-pcl-ros ros-humble-cv-bridge ros-humble-tf2-ros
sudo apt install -y ros-humble-gazebo-ros-pkgs
sudo apt install -y ros-humble-xacro
sudo apt install -y ros-humble-robot-state-publisher
sudo apt install -y ros-humble-joint-state-publisher
sudo apt install -y ros-humble-rviz2
sudo apt install -y libboost-all-dev

sudo apt-get install cmake libgmock-dev
sudo apt-get install libgoogle-glog-dev libgflags-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libeigen3-dev
sudo apt-get install libsuitesparse-dev

https://gitee.com/lwm000/Sophus.git
mkdir build
cd build
cmake …
make -j8
sudo make install

mkdir -p ~/livox_fastlivo2_ws/src
cd ~/livox_fastlivo2_ws/src
git clone https://gitee.com/s314893771/FAST-LIVO2_ROS2.git
git clone https://github.com/Livox-SDK/livox_laser_simulation.git
git clone https://gitee.com/SMBU-POLARBEAR/livox_ros_driver2_humble.git
git clone https://github.com/Livox-SDK/Livox-SDK2.git
git clone https://github.com/integralrobotics/rpg_vikit.git
cd ~/livox_fastlivo2_ws
colcon build --packages-select Livox-SDK2 livox_ros_driver2 livox_laser_simulation
colcon build --packages-select vikit_common vikit_ros

******************rviz和mapviz只显示camera图像
查看ros2 node info /rosbag2_player,没有

查询bag有/livox/lidar
ros2 bag info /home/cjh/nav/Retail_street/Retail_street.db3
Files: /home/cjh/nav/Retail_street/Retail_street.db3
Bag size: 1.9 GiB
Storage id: sqlite3
Duration: 135.470252209s
Start: Sep 27 2022 15:59:43.030094834 (1664265583.030094834)
End: Sep 27 2022 16:01:58.500347043 (1664265718.500347043)
Messages: 30157
Topic information: Topic: /livox/imu | Type: sensor_msgs/msg/Imu | Count: 27447 | Serialization Format: cdr
Topic: /livox/lidar | Type: livox_ros_driver/msg/CustomMsg | Count: 1355 | Serialization Format: cdr
Topic: /left_camera/image | Type: sensor_msgs/msg/Image | Count: 1355 | Serialization Format: cdr

livox_ros_driver/msg/CustomMsg 是 Livox 的自定义消息格式,RViz 和 MapViz 原生都不支持直接显示

rviz fixed frame: camera_init
Frame [camera_init] does not exist
这个错误说明 TF(坐标变换)没有发布,camera_init 坐标系不存在。FAST-LIVO2 没有正确初始化或没有发布 TF。
ros2 topic echo /tf --once 显示有TF
transforms:

  • header:
    stamp:
    sec: 1778422696
    nanosec: 277500712
    frame_id: map__identity
    child_frame_id: map
    transform:

ros2 node list | grep laserMapping查看节点正常

$ ros2 param get /laserMapping use_sim_time
Boolean value is: False
$ ros2 param set /laserMapping use_sim_time true
Set parameter successful
$ ros2 param get /laserMapping use_sim_time
Boolean value is: True

rosbags-convert --src ~/Downloads/Retail_Street.bag --dst dataset/Retail_Street_ros2.db3 --include-topic /livox/lidar

1) bag文件的metadata.yaml修改消息类型:

rosbag2_bagfile_information:
  compression_format: ''
  compression_mode: ''
  custom_data: {}
  duration:
    nanoseconds: 135470252209
  files:
  - duration:
      nanoseconds: 135470252209
    message_count: 30157
    path: Retail_Street.db3
    ..............
    topic_metadata:
      name: /livox/lidar
      offered_qos_profiles: ''
      serialization_format: cdr
-     type: livox_ros_driver/msg/CustomMsg
+     type: livox_ros_driver2/msg/CustomMsg2)
# 2)修改db 
# 备份
cp /home/cjh/nav/Retail_street/Retail_street.db3 \
   /home/cjh/nav/Retail_street/Retail_street.db3.backup
# 进入 sqlite3
sqlite3 /home/cjh/nav/Retail_street/Retail_street.db3
# 查看当前 topics 表
SELECT * FROM topics;
# 修改消息类型
UPDATE topics 
SET type = 'livox_ros_driver2/msg/CustomMsg' 
WHERE type = 'livox_ros_driver/msg/CustomMsg';
# 验证
SELECT * FROM topics;
# 退出
.quit

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/97d2d9fae083439cb24bda2aa0944011.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/9ba4de32a70441d6ac35d1b31e8537e9.png)

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8e6fab84b94c453c9069f7f9f9389f00.png)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值