#!/bin/bash
# 建立 ROS 2 機器人開發專案 Workspace
set -e
# Workspace 路徑
WORKSPACE=~/ros2_robotics_ws
mkdir -p $WORKSPACE/src
cd $WORKSPACE
# 初始化 ROS 2 Workspace
source /opt/ros/humble/setup.bash
colcon build --symlink-install
# === 1. 建立範例機器人套件 ===
cd src
ros2 pkg create --build-type ament_python my_robot_pkg
cd my_robot_pkg
# 建立資料夾
mkdir -p urdf launch config micro_ros_interface
# === 2. 機器人 URDF 檔案 ===
cat <<EOF > urdf/my_robot.urdf
<robot name="demo_robot">
<link name="base_link"/>
<joint name="base_to_link1" type="fixed">
<parent link="base_link"/>
<child link="link1"/>
</joint>
<link name="link1">
<visual>
<geometry>
<box size="0.5 0.1 0.1"/>
</geometry>
</visual>
</link>
</robot>
EOF
# === 3. Gazebo + RViz Launch File ===
cat <<EOF > launch/robot_world.launch.py
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import Command
import os
def generate_launch_description():
pkg_path = os.path.join(os.getenv('HOME'), 'ros2_robotics_ws/src/my_robot_pkg')
urdf_path = os.path.join(pkg_path, 'urdf/my_robot.urdf')
return LaunchDescription([
Node(
package='robot_state_publisher',
executable='robot_state_publisher',
name='state_pub',
parameters=[{'robot_description': Command(['cat', urdf_path])}]
),
Node(
package='rviz2',
executable='rviz2',
name='rviz2',
arguments=['-d', os.path.join(pkg_path, 'config/robot.rviz')],
output='screen'
)
])
EOF
# === 4. RViz 設定檔 ===
cat <<EOF > config/robot.rviz
Visualization Manager:
Class: "rviz/VisualizationManager"
Displays:
- Name: RobotModel
Class: rviz/RobotModel
Enabled: true
EOF
# === 5. 建立 micro-ROS 模擬 node ===
cat <<EOF > micro_ros_interface/micro_sim.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class MicroSim(Node):
def __init__(self):
super().__init__('micro_sim')
self.publisher_ = self.create_publisher(String, 'pico_status', 10)
self.timer = self.create_timer(1.0, self.timer_callback)
def timer_callback(self):
msg = String()
msg.data = 'Hello from micro-ROS simulated node!'
self.publisher_.publish(msg)
self.get_logger().info('Publishing: "%s"' % msg.data)
rclpy.init()
node = MicroSim()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
EOF
# === 6. 安裝 Python 依賴與 entry point ===
cat <<EOF > setup.py
from setuptools import setup
package_name = 'my_robot_pkg'
setup(
name=package_name,
version='0.0.0',
packages=[package_name],
data_files=[('share/' + package_name + '/launch', ['launch/robot_world.launch.py']),
('share/' + package_name + '/urdf', ['urdf/my_robot.urdf']),
('share/' + package_name + '/config', ['config/robot.rviz'])],
install_requires=['setuptools'],
zip_safe=True,
maintainer='demo_user',
maintainer_email='user@example.com',
description='Demo robot package for Pi4 + ROS2 + micro-ROS',
license='MIT',
entry_points={
'console_scripts': [
'micro_sim = my_robot_pkg.micro_sim:main'
],
},
)
EOF
mkdir my_robot_pkg
mv micro_ros_interface/micro_sim.py my_robot_pkg/micro_sim.py
# === 7. 完成 Build ===
cd $WORKSPACE
colcon build --symlink-install
# 提示
echo "✅ 專案建立完成!請執行以下指令:"
echo "source ~/ros2_robotics_ws/install/setup.bash"
echo "ros2 launch my_robot_pkg robot_world.launch.py"
echo "ros2 run my_robot_pkg micro_sim"
已為你建立整套範例 Workspace 結構,包含:
-
✅
URDF
機器人模型 -
✅
Launch
啟動檔(載入 robot + RViz) -
✅
RViz
設定 -
✅
micro-ROS
模擬 node -
✅
setup.py
與colcon
build 支援
🔧 使用方式:
如果你想加入:
-
Gazebo 模擬啟動
-
MoveIt2 控制流程
-
micro-ROS 實體 Pico 節點整合
沒有留言:
張貼留言