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

xacro机器人模型文件转urdf文件怎么编写launch文件启动gazebo仿真和在rviz2内显示模型

urdf文件很直白,每个零件的</link>  </joint>都要编写一遍,每个零件数据都要自己算出来结果,很麻烦,但是用起来很简单。xacro写的模型文件可以把好多常量提前定义出来,不同大小的机器人只要只要改一下常量,机器人模型就可以重新生成,代码可以复用,编写起来简单多了,但是编写launch启动文件麻烦一些。

urdf编写的小车模型文件:

<!-- base.urdf -->
<?xml version="1.0" ?>
<robot name="jtbot"><!-- 机器人底盘 --><link name="base_link"><visual><geometry><box size="0.46 0.46 0.11"/></geometry><material name="Cyan"><color rgba="0 1.0 1.0 1.0"/></material></visual><!-- 碰撞区域 --><collision><geometry><box size="0.46 0.46 0.11"/></geometry></collision><inertial><origin rpy="1.5707963267948966 0 1.5707963267948966" xyz="0 0 0"/><mass value="15"/><inertia ixx="0.279625" ixy="0.0" ixz="0.0" iyy="0.529" iyz="0.0" izz="0.279625"/></inertial></link><!-- 机器人 Footprint --><link name="base_footprint"/><!-- 底盘关节 --><joint name="base_joint" type="fixed"><parent link="base_link"/><child link="base_footprint"/><origin rpy="0 0 0" xyz="0.0 0.0 -0.1325"/></joint><link name="left_wheel_link"><visual><origin rpy="1.5707963267948966 0 0" xyz="0 0 0"/><geometry><cylinder length="0.06" radius="0.0775"/></geometry><material name="Gray"><color rgba="0.5 0.5 0.5 1.0"/></material></visual><!-- 碰撞区域 --><collision><origin rpy="1.5707963267948966 0 0" xyz="0 0 0"/><geometry><cylinder length="0.06" radius="0.0775"/></geometry></collision><inertial><origin rpy="1.5707963267948966 0 0" xyz="0 0 0"/><mass value="0.8"/><inertia ixx="0.0014412499999999998" ixy="0" ixz="0" iyy="0.0014412499999999998" iyz="0" izz="0.0024025"/></inertial></link><!-- 轮子关节 --><joint name="left_wheel_joint" type="continuous"><parent link="base_link"/><child link="left_wheel_link"/><origin rpy="0 0 0" xyz="0.15 0.27 -0.055"/><axis xyz="0 1 0"/></joint><link name="right_wheel_link"><visual><origin rpy="1.5707963267948966 0 0" xyz="0 0 0"/><geometry><cylinder length="0.06" radius="0.0775"/></geometry><material name="Gray"><color rgba="0.5 0.5 0.5 1.0"/></material></visual><!-- 碰撞区域 --><collision><origin rpy="1.5707963267948966 0 0" xyz="0 0 0"/><geometry><cylinder length="0.06" radius="0.0775"/></geometry></collision><inertial><origin rpy="1.5707963267948966 0 0" xyz="0 0 0"/><mass value="0.8"/><inertia ixx="0.0014412499999999998" ixy="0" ixz="0" iyy="0.0014412499999999998" iyz="0" izz="0.0024025"/></inertial></link><!-- 轮子关节 --><joint name="right_wheel_joint" type="continuous"><parent link="base_link"/><child link="right_wheel_link"/><origin rpy="0 0 0" xyz="0.15 -0.27 -0.055"/><axis xyz="0 1 0"/></joint><!-- 支撑轮 --><link name="caster_link"><visual><geometry><sphere radius="0.03875"/></geometry><material name="Cyan"><color rgba="0 1.0 1.0 1.0"/></material></visual><!-- 碰撞区域 --><collision><origin rpy="0 0 0" xyz="0 0 0"/><geometry><sphere radius="0.03875"/></geometry></collision><inertial><mass value="0.5"/><inertia ixx="0.0003003125" ixy="0.0" ixz="0.0" iyy="0.0003003125" iyz="0.0" izz="0.0003003125"/></inertial></link><!-- 支撑轮gazebo颜色 --><gazebo reference="caster_link"><material>Gazebo/Black</material></gazebo><!-- 支撑轮gazebo摩擦力 --><gazebo reference="caster_link"><mu1 value="0.0"/><mu2 value="0.0"/><kp value="1000000.0"/><kd value="10.0"/></gazebo><!-- 支撑轮关节 --><joint name="caster_joint" type="fixed"><parent link="base_link"/><child link="caster_link"/><origin rpy="0 0 0" xyz="-0.205 0.0 -0.09375"/></joint><!-- imu --><link name="imu_link"><visual><geometry><box size="0.06 0.03 0.03"/></geometry></visual><!-- 碰撞区域 --><collision><geometry><box size="0.06 0.03 0.03"/></geometry></collision><inertial><origin rpy="1.5707963267948966 0 1.5707963267948966" xyz="0 0 0"/><mass value="0.1"/><inertia ixx="0.0001666666666666667" ixy="0.0" ixz="0.0" iyy="0.0001666666666666667" iyz="0.0" izz="0.0001666666666666667"/></inertial></link><!-- imu关节 --><joint name="imu_joint" type="fixed"><parent link="base_link"/><child link="imu_link"/><origin xyz="-0.05 0 -0.055"/></joint><!-- imu仿真插件 --><gazebo reference="imu_link"><sensor name="imu_sensor" type="imu"><plugin filename="libgazebo_ros_imu_sensor.so" name="imu_plugin"><ros><!-- 命名空间 --><!-- <namespace>/demo</namespace> --><remapping>~/out:=imu</remapping></ros><!-- 初始方位_参考 --><initial_orientation_as_reference>false</initial_orientation_as_reference></plugin><always_on>true</always_on><!-- 更新频率 --><update_rate>100</update_rate><visualize>true</visualize><imu><!-- 角速度 --><angular_velocity><x><noise type="gaussian"><mean>0.0</mean><stddev>2e-4</stddev><bias_mean>0.0000075</bias_mean><bias_stddev>0.0000008</bias_stddev></noise></x><y><noise type="gaussian"><mean>0.0</mean><stddev>2e-4</stddev><bias_mean>0.0000075</bias_mean><bias_stddev>0.0000008</bias_stddev></noise></y><z><noise type="gaussian"><mean>0.0</mean><stddev>2e-4</stddev><bias_mean>0.0000075</bias_mean><bias_stddev>0.0000008</bias_stddev></noise></z></angular_velocity><!-- 线性加速度 --><linear_acceleration><x><noise type="gaussian"><mean>0.0</mean><stddev>1.7e-2</stddev><bias_mean>0.1</bias_mean><bias_stddev>0.001</bias_stddev></noise></x><y><noise type="gaussian"><mean>0.0</mean><stddev>1.7e-2</stddev><bias_mean>0.1</bias_mean><bias_stddev>0.001</bias_stddev></noise></y><z><noise type="gaussian"><mean>0.0</mean><stddev>1.7e-2</stddev><bias_mean>0.1</bias_mean><bias_stddev>0.001</bias_stddev></noise></z></linear_acceleration></imu></sensor></gazebo><!-- 差速驱动仿真插件 --><gazebo><plugin filename="libgazebo_ros_diff_drive.so" name="diff_drive"><ros><!-- 命名空间 --><!-- <namespace>/demo</namespace> --></ros><!-- 左右轮子 --><left_joint>left_wheel_joint</left_joint><right_joint>right_wheel_joint</right_joint><!-- 轮距 轮子直径 --><wheel_separation>0.52</wheel_separation><!-- <wheel_separation>0.52</wheel_separation> --><wheel_diameter>0.155</wheel_diameter><!-- <wheel_diameter>0.155</wheel_diameter> --><!-- 最大扭矩 最大加速度 --><max_wheel_torque>20</max_wheel_torque><max_wheel_acceleration>1.0</max_wheel_acceleration><!-- 输出 --><!-- 是否发布里程计 --><publish_odom>true</publish_odom><!-- 是否发布里程计的tf开关 --><publish_odom_tf>true</publish_odom_tf><!-- 是否发布轮子的tf数据开关 --><publish_wheel_tf>true</publish_wheel_tf><!-- 里程计的framed ID,最终体现在话题和TF上 --><odometry_frame>odom</odometry_frame><!-- 机器人的基础frame的ID --><robot_base_frame>base_link</robot_base_frame></plugin></gazebo><!-- 雷达 --><link name="laser"><visual><origin rpy="0 0 0" xyz="0 0 0"/><geometry><cylinder length="0.04" radius="0.04"/></geometry></visual><!-- 惯性属性 --><inertial><origin rpy="0 0 0" xyz="0 0 0"/><mass value="0.125"/><inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/></inertial><!-- 碰撞区域 --><collision><origin rpy="0 0 0" xyz="0 0 0"/><geometry><cylinder length="0.04" radius="0.04"/></geometry></collision></link><!-- 雷达关节 --><joint name="laser_joint" type="fixed"><parent link="base_link"/><child link="laser"/><origin rpy="0 0 0" xyz="0.16 0 0.078"/></joint><gazebo reference="laser"><sensor name="laser" type="ray"><always_on>true</always_on><visualize>false</visualize><update_rate>5</update_rate><ray><scan><horizontal><samples>360</samples><resolution>1.000000</resolution><min_angle>0.000000</min_angle><max_angle>6.280000</max_angle></horizontal></scan><range><min>0.120000</min><max>3.5</max><resolution>0.015000</resolution></range><noise><type>gaussian</type><mean>0.0</mean><stddev>0.01</stddev></noise></ray><plugin filename="libgazebo_ros_ray_sensor.so" name="scan"><ros><remapping>~/out:=scan</remapping></ros><output_type>sensor_msgs/LaserScan</output_type><frame_name>laser</frame_name></plugin></sensor></gazebo><!-- 相机 --><link name="camera_link"><visual><origin rpy="0 0 0" xyz="0 0 0"/><geometry><box size="0.015 0.130 0.022"/></geometry></visual><!-- 碰撞区域 --><collision><origin rpy="0 0 0" xyz="0 0 0"/><geometry><box size="0.015 0.130 0.022"/></geometry></collision><!-- 惯性属性 --><inertial><origin rpy="0 0 0" xyz="0 0 0"/><mass value="0.035"/><inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/></inertial></link><!-- 相机关节 --><joint name="camera_joint" type="fixed"><parent link="base_link"/><child link="camera_link"/><origin rpy="0 0 0" xyz="0.16 0 0.11"/></joint><!-- 深度相机 --><link name="camera_depth_frame"/><joint name="camera_depth_joint" type="fixed"><origin rpy="0 0 0" xyz="0 0 0"/><parent link="camera_link"/><child link="camera_depth_frame"/></joint><!-- 相机仿真 --><gazebo reference="camera_depth_link"><sensor name="depth_camera" type="depth"><visualize>true</visualize><update_rate>30.0</update_rate><camera name="camera"><horizontal_fov>1.047198</horizontal_fov><image><width>640</width><height>480</height><format>R8G8B8</format></image><clip><near>0.05</near><far>3</far></clip></camera><plugin filename="libgazebo_ros_camera.so" name="depth_camera_controller"><baseline>0.2</baseline><alwaysOn>true</alwaysOn><updateRate>0.0</updateRate><frame_name>camera_depth_frame</frame_name><pointCloudCutoff>0.5</pointCloudCutoff><pointCloudCutoffMax>3.0</pointCloudCutoffMax><distortionK1>0</distortionK1><distortionK2>0</distortionK2><distortionK3>0</distortionK3><distortionT1>0</distortionT1><distortionT2>0</distortionT2><CxPrime>0</CxPrime><Cx>0</Cx><Cy>0</Cy><focalLength>0</focalLength><hackBaseline>0</hackBaseline></plugin></sensor></gazebo>
</robot>

xacro编写的小车模型文件:

<!-- base.urdf.xacro -->
<?xml version="1.0"?>
<robot name="jtbot"xmlns:xacro="http://ros.org/wiki/xacro"><!-- 定义机器人常量 --><!-- 底盘 长 宽 高 --><xacro:property name="base_width" value="0.46"/><xacro:property name="base_length" value="0.46"/><xacro:property name="base_height" value="0.11"/><!-- 轮子半径 --><xacro:property name="wheel_radius" value="0.0775"/><!-- 轮子宽度 --><xacro:property name="wheel_width" value="0.06"/><!-- 轮子和底盘的间距 --><xacro:property name="wheel_ygap" value="0.01"/><!-- 轮子z轴偏移量 --><xacro:property name="wheel_zoff" value="0.055"/><!-- 轮子x轴偏移量 --><xacro:property name="wheel_xoff" value="0.15"/><!-- 支撑轮x轴偏移量 --><xacro:property name="caster_xoff" value="0.205"/><!-- 定义长方形惯性属性宏  --><xacro:macro name="box_inertia" params="m w h d"><inertial><origin xyz="0 0 0" rpy="${pi/2} 0 ${pi/2}"/><mass value="${m}"/><inertia ixx="${(m/12) * (h*h + d*d)}" ixy="0.0" ixz="0.0" iyy="${(m/12) * (w*w + d*d)}" iyz="0.0" izz="${(m/12) * (w*w + h*h)}"/></inertial></xacro:macro><!-- 定义圆柱惯性属性宏  --><xacro:macro name="cylinder_inertia" params="m r h"><inertial><origin xyz="0 0 0" rpy="${pi/2} 0 0" /><mass value="${m}"/><inertia ixx="${(m/12) * (3*r*r + h*h)}" ixy = "0" ixz = "0" iyy="${(m/12) * (3*r*r + h*h)}" iyz = "0" izz="${(m/2) * (r*r)}"/></inertial></xacro:macro><!-- 定义球体惯性属性宏  --><xacro:macro name="sphere_inertia" params="m r"><inertial><mass value="${m}"/><inertia ixx="${(2/5) * m * (r*r)}" ixy="0.0" ixz="0.0" iyy="${(2/5) * m * (r*r)}" iyz="0.0" izz="${(2/5) * m * (r*r)}"/></inertial></xacro:macro><!-- 机器人底盘 --><link name="base_link"><visual><geometry><box size="${base_length} ${base_width} ${base_height}"/></geometry><material name="Cyan"><color rgba="0 1.0 1.0 1.0"/></material></visual><!-- 碰撞区域 --><collision><geometry><box size="${base_length} ${base_width} ${base_height}"/></geometry></collision><!-- 惯性特性 --><xacro:box_inertia m="15" w="${base_width}" d="${base_length}" h="${base_height}"/></link><!-- 机器人 Footprint --><link name="base_footprint"/><!-- 底盘关节 --><joint name="base_joint" type="fixed"><parent link="base_link"/><child link="base_footprint"/><origin xyz="0.0 0.0 ${-(wheel_radius+wheel_zoff)}" rpy="0 0 0"/></joint><!-- 创建轮子宏函数 --><xacro:macro name="wheel" params="prefix x_reflect y_reflect"><link name="${prefix}_link"><visual><origin xyz="0 0 0" rpy="${pi/2} 0 0"/><geometry><cylinder radius="${wheel_radius}" length="${wheel_width}"/></geometry><material name="Gray"><color rgba="0.5 0.5 0.5 1.0"/></material></visual><!-- 碰撞区域 --><collision><origin xyz="0 0 0" rpy="${pi/2} 0 0"/><geometry><cylinder radius="${wheel_radius}" length="${wheel_width}"/></geometry></collision><!-- 惯性属性 --><xacro:cylinder_inertia m="0.8" r="${wheel_radius}" h="${wheel_width}"/></link><!-- 轮子关节 --><joint name="${prefix}_joint" type="continuous"><parent link="base_link"/><child link="${prefix}_link"/><origin xyz="${x_reflect*wheel_xoff} ${y_reflect*(base_width/2+wheel_width/2+wheel_ygap)} ${-wheel_zoff}" rpy="0 0 0"/><axis xyz="0 1 0"/></joint></xacro:macro><!-- 根据上面的宏函数实例化左右轮 --><xacro:wheel prefix="left_wheel" x_reflect="1" y_reflect="1" /><xacro:wheel prefix="right_wheel" x_reflect="1" y_reflect="-1" /><!-- 支撑轮 --><link name="caster_link"><visual><geometry><sphere radius="${(wheel_radius/2)}"/></geometry><material name="Cyan"><color rgba="0 1.0 1.0 1.0"/></material></visual><!-- 碰撞区域 --><collision><origin xyz="0 0 0" rpy="0 0 0"/><geometry><sphere radius="${(wheel_radius/2)}"/></geometry></collision><!-- 惯性属性 --><xacro:sphere_inertia m="0.5" r="${(wheel_radius/2)}"/></link><!-- 支撑轮gazebo颜色 --><gazebo reference="caster_link"><material>Gazebo/Black</material></gazebo><!-- 支撑轮gazebo摩擦力 --><gazebo reference="caster_link"><mu1 value="0.0"/><mu2 value="0.0"/><kp value="1000000.0" /><kd value="10.0" /></gazebo><!-- 支撑轮关节 --><joint name="caster_joint" type="fixed"><parent link="base_link"/><child link="caster_link"/><origin xyz="${-caster_xoff} 0.0 ${-(base_height+wheel_radius)/2}" rpy="0 0 0"/></joint><!-- imu --><link name="imu_link"><visual><geometry><box size="0.06 0.03 0.03"/></geometry></visual><!-- 碰撞区域 --><collision><geometry><box size="0.06 0.03 0.03"/></geometry></collision><!-- 惯性属性 --><xacro:box_inertia m="0.1" w="0.1" d="0.1" h="0.1"/></link><!-- imu关节 --><joint name="imu_joint" type="fixed"><parent link="base_link"/><child link="imu_link"/><origin xyz="-0.05 0 -0.055"/></joint><!-- imu仿真插件 --><gazebo reference="imu_link"><sensor name="imu_sensor" type="imu"><plugin filename="libgazebo_ros_imu_sensor.so" name="imu_plugin"><ros><!-- 命名空间 --><!-- <namespace>/demo</namespace> --><remapping>~/out:=imu</remapping></ros><!-- 初始方位_参考 --><initial_orientation_as_reference>true</initial_orientation_as_reference></plugin><always_on>true</always_on><!-- 更新频率 --><update_rate>100</update_rate><visualize>true</visualize><imu><!-- 角速度 --><angular_velocity><x><noise type="gaussian"><mean>0.0</mean><stddev>2e-4</stddev><bias_mean>0.0000075</bias_mean><bias_stddev>0.0000008</bias_stddev></noise></x><y><noise type="gaussian"><mean>0.0</mean><stddev>2e-4</stddev><bias_mean>0.0000075</bias_mean><bias_stddev>0.0000008</bias_stddev></noise></y><z><noise type="gaussian"><mean>0.0</mean><stddev>2e-4</stddev><bias_mean>0.0000075</bias_mean><bias_stddev>0.0000008</bias_stddev></noise></z></angular_velocity><!-- 线性加速度 --><linear_acceleration><x><noise type="gaussian"><mean>0.0</mean><stddev>1.7e-2</stddev><bias_mean>0.1</bias_mean><bias_stddev>0.001</bias_stddev></noise></x><y><noise type="gaussian"><mean>0.0</mean><stddev>1.7e-2</stddev><bias_mean>0.1</bias_mean><bias_stddev>0.001</bias_stddev></noise></y><z><noise type="gaussian"><mean>0.0</mean><stddev>1.7e-2</stddev><bias_mean>0.1</bias_mean><bias_stddev>0.001</bias_stddev></noise></z></linear_acceleration></imu></sensor></gazebo><!-- 差速驱动仿真插件 --><gazebo><plugin name='diff_drive' filename='libgazebo_ros_diff_drive.so'><ros><!-- 命名空间 --><!-- <namespace>/demo</namespace> --></ros><!-- 左右轮子 --><left_joint>left_wheel_joint</left_joint><right_joint>right_wheel_joint</right_joint><!-- 轮距 轮子直径 --><wheel_separation>${base_width+wheel_width}</wheel_separation><!-- <wheel_separation>0.52</wheel_separation> --><wheel_diameter>${wheel_radius*2}</wheel_diameter><!-- <wheel_diameter>0.155</wheel_diameter> --><!-- 最大扭矩 最大加速度 --><max_wheel_torque>20</max_wheel_torque><max_wheel_acceleration>1.0</max_wheel_acceleration><!-- 输出 --><!-- 是否发布里程计 --><publish_odom>true</publish_odom><!-- 是否发布里程计的tf开关 --><publish_odom_tf>true</publish_odom_tf><!-- 是否发布轮子的tf数据开关 --><publish_wheel_tf>true</publish_wheel_tf><!-- 里程计的framed ID,最终体现在话题和TF上 --><odometry_frame>odom</odometry_frame><!-- 机器人的基础frame的ID --><robot_base_frame>base_link</robot_base_frame></plugin></gazebo><!-- 雷达 --><link name="laser"><visual><origin xyz="0 0 0" rpy="0 0 0"/><geometry><cylinder radius="0.04" length="0.04"/></geometry></visual><!-- 惯性属性 --><inertial><origin xyz="0 0 0" rpy="0 0 0"/><mass value="0.125"/><inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001" /></inertial><!-- 碰撞区域 --><collision><origin xyz="0 0 0" rpy="0 0 0"/><geometry><cylinder radius="0.04" length="0.04"/></geometry></collision></link><!-- 雷达关节 --><joint name="laser_joint" type="fixed"><parent link="base_link"/><child link="laser"/><origin xyz="0.16 0 0.078" rpy="0 0 0"/></joint><gazebo reference="laser"><sensor name="laser" type="ray"><always_on>true</always_on><visualize>false</visualize><update_rate>5</update_rate><ray><scan><horizontal><samples>360</samples><resolution>1.000000</resolution><min_angle>0.000000</min_angle><max_angle>6.280000</max_angle></horizontal></scan><range><min>0.120000</min><max>3.5</max><resolution>0.015000</resolution></range><noise><type>gaussian</type><mean>0.0</mean><stddev>0.01</stddev></noise></ray><plugin name="scan" filename="libgazebo_ros_ray_sensor.so"><ros><remapping>~/out:=scan</remapping></ros><output_type>sensor_msgs/LaserScan</output_type><frame_name>laser</frame_name></plugin></sensor></gazebo><!-- 相机 --><link name="camera_link"><visual><origin xyz="0 0 0" rpy="0 0 0"/><geometry><box size="0.015 0.130 0.022"/></geometry></visual><!-- 碰撞区域 --><collision><origin xyz="0 0 0" rpy="0 0 0"/><geometry><box size="0.015 0.130 0.022"/></geometry></collision><!-- 惯性属性 --><inertial><origin xyz="0 0 0" rpy="0 0 0"/><mass value="0.035"/><inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001" /></inertial></link><!-- 相机关节 --><joint name="camera_joint" type="fixed"><parent link="base_link"/><child link="camera_link"/><origin xyz="0.16 0 0.11" rpy="0 0 0"/></joint><!-- 深度相机 --><link name="camera_depth_frame"/><joint name="camera_depth_joint" type="fixed"><origin xyz="0 0 0" rpy="0 0 0"/><parent link="camera_link"/><child link="camera_depth_frame"/></joint><!-- 相机仿真 --><gazebo reference="camera_depth_link"><sensor name="depth_camera" type="depth"><visualize>true</visualize><update_rate>30.0</update_rate><camera name="camera"><horizontal_fov>1.047198</horizontal_fov><image><width>640</width><height>480</height><format>R8G8B8</format></image><clip><near>0.05</near><far>3</far></clip></camera><plugin name="depth_camera_controller" filename="libgazebo_ros_camera.so"><baseline>0.2</baseline><alwaysOn>true</alwaysOn><updateRate>0.0</updateRate><frame_name>camera_depth_frame</frame_name><pointCloudCutoff>0.5</pointCloudCutoff><pointCloudCutoffMax>3.0</pointCloudCutoffMax><distortionK1>0</distortionK1><distortionK2>0</distortionK2><distortionK3>0</distortionK3><distortionT1>0</distortionT1><distortionT2>0</distortionT2><CxPrime>0</CxPrime><Cx>0</Cx><Cy>0</Cy><focalLength>0</focalLength><hackBaseline>0</hackBaseline></plugin></sensor></gazebo></robot>

xacro模型文件需要转成urdf模型文件才能使用

方法1 提前转换:

当前文件夹打开终端输入:base.urdf.xacro > base.urdf生成纯urdf文件。

方法2 在运行launch文件的时候自动转,需要加入xacro解析步骤

package.xml文件内在<test_depend>前加入:<exec_depend>xacro</exec_depend>

launch文件编写:

# 此launch文件是机器人仿真程序,包含 gazebo启动,机器人仿真生成,机器人模型状态发布
import os
from launch import LaunchDescription
from launch.actions import ExecuteProcess
from launch_ros.actions import Node
from launch_ros.substitutions import FindPackageShare
from launch.substitutions import LaunchConfiguration
import xacrodef generate_launch_description():robot_name_in_model = 'jtbot'         #机器人模型名字package_name = 'jtbot_description'    #模型包名ld = LaunchDescription()use_sim_time = LaunchConfiguration('use_sim_time', default='true')pkg_share = FindPackageShare(package=package_name).find(package_name) gazebo_world_path = os.path.join(pkg_share, 'world/jt.world')        #世界仿真文件路径default_rviz_config_path = os.path.join(pkg_share, 'rviz/mrviz2.rviz')  #rviz配置文件路径urdf_xacro_file = os.path.join(pkg_share, 'urdf/jtbot_base.urdf.xacro') #xacro模型文件路径#解析xacro模型文件doc = xacro.parse(open(urdf_xacro_file))xacro.process_doc(doc)params = {'robot_description': doc.toxml()}# 开启ros Gazebo serverstart_gazebo_cmd = ExecuteProcess(cmd=['gazebo','--verbose', gazebo_world_path,'-s', 'libgazebo_ros_init.so',   '-s', 'libgazebo_ros_factory.so', ],output='screen')# Start Robot State publisherstart_robot_state_publisher_cmd = Node(package='robot_state_publisher',executable='robot_state_publisher',output='screen',parameters=[params,{'use_sim_time': use_sim_time}])    # gazebo内生成机器人spawn_entity_cmd = Node(package='gazebo_ros', executable='spawn_entity.py',arguments=['-entity', robot_name_in_model,  '-topic', 'robot_description'], output='screen')# Launch RVizstart_rviz_cmd = Node(package='rviz2',executable='rviz2',name='rviz2',output='screen',arguments=['-d', default_rviz_config_path])ld.add_action(start_gazebo_cmd)ld.add_action(spawn_entity_cmd)ld.add_action(start_robot_state_publisher_cmd)ld.add_action(start_rviz_cmd)return ld

相关文章:

xacro机器人模型文件转urdf文件怎么编写launch文件启动gazebo仿真和在rviz2内显示模型

urdf文件很直白&#xff0c;每个零件的</link> </joint>都要编写一遍&#xff0c;每个零件数据都要自己算出来结果&#xff0c;很麻烦&#xff0c;但是用起来很简单。xacro写的模型文件可以把好多常量提前定义出来&#xff0c;不同大小的机器人只要只要改一下常量…...

前端图片转base64,并使用canvas对图片进行压缩

目录 1.图片转base64的应用场景 2.图片转base64代码 3.对上传的图片进行压缩 1.图片转base64的应用场景 图片转base64通常用在用户上传图片的情况下使用&#xff0c;他的作用就是让用户看到预览的图片不受网络的影响。 这是传统的文件传输的流程&#xff1a;首先是用户选择…...

电脑键盘打不了字按哪个键恢复?最新分享!

“有没有朋友知道电脑键盘为什么会莫名其妙就打不了字&#xff1f;明明用得好好的&#xff0c;突然就打不了字了&#xff0c;真的让人很迷惑&#xff01;有什么方法可以解决吗&#xff1f;” 电脑键盘为我们的办公提供了很大的方便&#xff0c;我们可以利用键盘输入我们需要的文…...

ue5读取外部文件

准备环境 我的环境是win10&#xff0c;ue5.1.1&#xff0c;cpux86。 创建工程时&#xff0c;需要选择C模式 这样在Content Browser中会出现C Classes文件夹&#xff0c;下面有一个本项目命名的文件夹&#xff0c;鼠标右键可以看到New C Class选项。 新建类的时候选择父类Blue…...

【ARM】Day4 点亮LED灯

1. 思维导图 2. 自己编写代码实现三盏灯点亮 .text .global _start _start: /**********LED1&#xff0c;LED2,LED3点灯:PE10,PF10,PE8**************/ RCC_INIT:使能GPIOE组/GPIOF组控制器,通过RXCC_MP_AHB4ENSETR设置第[5:4]位写1,地址:0x50000A28[5:4]1ldr r0,0x50000A28 …...

TiDB基础介绍、应用场景及架构

1. 什么是newsql NewSQL 是对各种新的可扩展/高性能数据库的简称&#xff0c;这类数据库不仅具有NoSQL对海量数据的存储管理能力&#xff0c;还保持了传统数据库支持ACID和SQL等特性。 NewSQL是指这样一类新式的关系型数据库管理系统&#xff0c;针对OLTP&#xff08;读-写&…...

深入学习前端开发,掌握HTML、CSS、JavaScript等技术

课程链接&#xff1a; 链接: https://pan.baidu.com/s/1WECwJ4T8UQfs2FyjUMbxig?pwdi654 提取码: i654 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v4的分享 课程介绍&#xff1a; 第1周&#xff1a;HTML5基础语法与标签 &#x1f…...

python编程小游戏 五子棋,python编程小游戏简单的

大家好&#xff0c;本文将围绕python编程小游戏如何停止展开说明&#xff0c;python编程小游戏日语教程是一个很多人都想弄明白的事情&#xff0c;想搞清楚python编程小游戏超级玛丽需要先了解以下几个事情。 今天分享一个有趣的Python游戏库freegames&#xff0c;它里面包含经…...

spring ico容器 spring注入方式 spring与tomcat整合

一、简介 1、什么是spring&#xff1f; Spring是一个开源的轻量级Java应用开发框架&#xff0c;它提供了一种简单、高效、灵活的方式来构建企业级应用程序。Spring框架的核心特点是依赖注入&#xff08;Dependency Injection&#xff09;和面向切面编程&#xff08;Aspect-Ori…...

ansible 修改远程主机nginx配置文件

安装ansible brew install ansible 或者 pip3 install ansible 添加远程主机 设置秘钥 mac登录远程主机 ssh -p 5700 root192.168.123.211 ssh localhost #设置双机信任 ssh-kyegen -t rsa #设置主机两边的ssh配置文件 vi /etc/ssh/sshd_config/ PermitRootL…...

EV 录屏修复小工具

参考这篇文章, EV录制文件损坏-修复方法, 我用 C# 写了一个小程序. 仓库: github.com/SlimeNull/EvRepair 下载: github.com/SlimeNull/EvRepair/Releases 镜像: gitee.com/slimenull/EvRepair/releases 觉得还不错的话, 点个星星 推荐使用的几个理由: 内嵌 ffmpeg 和 recov…...

蓝牙资讯|中国智能家居前景广阔,蓝牙Mesh照明持续火爆

据俄罗斯卫星通讯社报道&#xff0c;中国已成为全球最大的智能家居消费国&#xff0c;占全球50%—60%的市场份额。未来&#xff0c;随着人工智能技术的发展以及智能家居生态的不断进步&#xff0c;智能家居在中国的渗透率将加速提升。德国斯塔蒂斯塔调查公司数据显示&#xff0…...

2023年排行前五的大规模语言模型(LLM)

2023年排行前五的大规模语言模型(LLM) 截至2023年&#xff0c;人工智能正在风靡全球。它已经成为热门的讨论话题&#xff0c;吸引了数百万人的关注&#xff0c;不仅限于技术专家和研究人员&#xff0c;还包括来自不同背景的个人。人们对人工智能热情高涨的原因之一是其在人类多…...

DoIP学习笔记系列:(六)满足AES128-CMAC算法的“安全认证”.dll生成实践

文章目录 1. 算法Demo2. 算法实现传送门 DoIP学习笔记系列:导航篇 AES128-CMAC算法在汽车电子控制单元的软件开发中涉及到安全相关的需求经经常用到,具体的算法原理请各位小伙伴自行百度,本篇主要向大家分享该算法如何集成到.dll文件中,在OTA、刷写等场景作为$27服务的安全…...

Collections操作集合的工具类,可变参数、集合操作的工具类

1、可变参数 假设定义一个方法求和&#xff0c;该方法可以灵活的完成如下需求&#xff1a; 计算1个数据的和计算2个数据的和计算3个数据的和计算n个数据的和&#xff0c;甚至可以支持不接收参数进行调用。 1.1、可变参数 可变参数用在形参中可以接收多个数据。可变参数的格式&…...

Linux Kernel:进程表示

环境: Kernel Version:Linux-5.10 ARCH:ARM64 一:前言 Linux内核涉及进程和程序的所有算法都围绕task_struct数据结构建立,具体可看另一篇文章: Linux Kernel:thread_info与task_struct 同时Linux提供了资源限制(resource limit, rlimit)机制,对进程使用系统资源施…...

黑马项目一阶段面试58题 苍穹外卖具体技术细节9题

一、Nginx的作用 1.反向代理 前端把请求发送给nginx&#xff0c;再由nginx将请求发送给后端服务器。 2.负载均衡 提高访问速度&#xff1b;进行负载均衡&#xff1b;保证后端服务安全 二、Swagger有什么作用 直接调试后端请求响应 三、Redis常见数据类型 String、Hash、L…...

SkyEye操作指南:连接TI CCS的IDE调试

现代电力电子控制系统的开发中&#xff0c;DSP芯片以其优越的运算性能在控制算法领域得到越来越广泛的应用。传统的DSP开发过程往往需要在完成控制系统仿真与程序设计后&#xff0c;才能根据比对结果进行程序修改&#xff0c;全过程还需要硬件电路工程师的配合&#xff0c;开发…...

PINN神经网络源代码解析(pyTorch)

参考文献 PINN(Physics-informed Neural Networks)的原理部分可参见https://maziarraissi.github.io/PINNs/ 考虑Burgers方程&#xff0c;如下图所示&#xff0c;初始时刻u符合sin分布&#xff0c;随着时间推移在x0处发生间断. 这是一个经典问题&#xff0c;可使用pytorch通过…...

ChatGPT​保密吗?它有哪些潜在风险?如何规避?

自2022年11月公开发布以来&#xff0c;ChatGPT已成为许多企业和个人的必备工具&#xff0c;但随着该技术越来越多地融入我们的日常生活&#xff0c;人们很自然地想知道&#xff1a;ChatGPT是否是保密的。 问&#xff1a;ChatGPT保密吗&#xff1f; 答&#xff1a;否&#xff0…...

C++中配置OpenCV的教程

首先去OpenCV的官网下载OpenCV安装包&#xff0c;选择合适的平台和版本进行下载&#xff0c;我下载的是Windows的OpenCV-4.7.0版本。OpenCV下载地址 下载好后&#xff0c;解压到自己指定的路径。 配置环境变量&#xff1a; WinR键打开运行窗口&#xff0c;输入sysdm.cpl打开系…...

收银一体化-亿发2023智慧门店新零售营销策略,实现全渠道运营

伴随着互联网电商行业的兴起&#xff0c;以及用户理念的改变&#xff0c;大量用户从线下涌入线上&#xff0c;传统的线下门店人流量急剧收缩&#xff0c;门店升级几乎成为了每一个零售企业的发展之路。智慧门店新零售收银解决方案是针对传统零售企业面临的诸多挑战和问题&#…...

node.js内置模块fs,path,http使用方法

NodeJs中分为两部分 一是V8引擎为了解析和执行JS代码。 二是内置API&#xff0c;让JS能调用这些API完成一些后端操作。 内置API模块(fs、path、http等) 第三方API模块(express、mysql等) fs模块 fs.readFile()方法&#xff0c;用于读取指定文件中的内容。 fs.writeFile()方…...

【git clone error:no matching key exchange method found】

拉起项目代码报错 git clone ssh://uidxxxgerrit-xxxxxxxx Cloning into ‘xxxxx’… Unable to negotiate with xxx.xx.xxx.ip port xxxxx: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 fatal: Could not …...

谈谈网络协议的定义、组成和重要性

个人主页&#xff1a;insist--个人主页​​​​​​ 本文专栏&#xff1a;网络基础——带你走进网络世界 本专栏会持续更新网络基础知识&#xff0c;希望大家多多支持&#xff0c;让我们一起探索这个神奇而广阔的网络世界。 目录 一、网络协议的定义 二、网络协议的组成 1、…...

ssh免密登陆报错ERROR: @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

问题描述&#xff1a; 在日常的运维中需要做ssh的免密登陆有提示如下的报错内容&#xff1a; [rootpaas-harbor01 cce-v5.2.3]# ssh-copy-id 192.45.66.14 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub" /usr/bin/ssh-c…...

【kubernetes】Pod控制器

目录 Pod控制器及其功用 pod控制器有多种类型 1、ReplicaSet ReplicaSet主要三个组件组成 2、Deployment 3、DaemonSet 4、StatefulSet 5、Job 6、Cronjob Pod与控制器之间的关系 1、Deployment 查看控制器配置 查看历史版本 2、SatefulSet 为什么要有headless&…...

aspose.ocr 的图片识别

操作aspose.ocr版本 <dependency><groupId>aspose</groupId><artifactId>ocr</artifactId><version>23.7.1-SNAPSHOT</version></dependency>官网下载地址 https://releases.aspose.com/ocr/java/ 记录一些简单的识别图片操…...

安卓纯代码布局开发游戏二:Android Studio开发环境搭建

1.Android Studio下载&#xff1a; Download Android Studio & App Tools - Android Developers 2.安装 安装过程非常简单&#xff0c;找到下载包&#xff0c;一直点Next即可。 3.下载Android SDK 第一次进入Android Studio默认会先下载Android SDK,笔者下载的Android SDK存…...

HuggingFace开源的自然语言处理AI工具平台

HuggingFace是一个开源的自然语言处理AI工具平台&#xff0c;它为NLP的开发者和研究者提供了一个简单、快速、高效、可靠的解决方案&#xff0c;让NLP变得更加简单、快速、高效、可靠。 Hugging Face平台主要包括以下几个部分&#xff1a; Transformers&#xff1a;一个提供了…...