{"id":5865,"date":"2025-02-02T06:03:30","date_gmt":"2025-02-01T21:03:30","guid":{"rendered":"http:\/\/shinku.ddo.jp\/wordpress\/?page_id=5865"},"modified":"2025-02-15T12:51:34","modified_gmt":"2025-02-15T03:51:34","slug":"raspberrypi5ros%ef%bc%92%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%97%e3%81%9f%e9%9f%b3%e9%87%8f%e3%82%a4%e3%83%b3%e3%82%b8%e3%82%b1%e3%83%bc%e3%82%bf","status":"publish","type":"page","link":"http:\/\/shinku.ddo.jp\/wordpress\/?page_id=5865","title":{"rendered":"Raspberry Pi 5:ROS\uff12\u3092\u4f7f\u7528\u3057\u305f\u97f3\u91cf\u30a4\u30f3\u30b8\u30b1\u30fc\u30bf"},"content":{"rendered":"\n<p>\u30e9\u30ba\u30d1\u30a4\u3067\u518d\u751f\u4e2d\u306e\u97f3\u91cf\u306b\u5408\u308f\u305b\u3066\u30a4\u30f3\u30b8\u30b1\u30fc\u30bf\u3092\u5149\u3089\u305b\u3088\u3046\u3002\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u524d\u56de\u306f\u30de\u30a4\u30b3\u30f3\u306e\u30a2\u30ca\u30ed\u30b0\u5165\u529b\u3067\u30e9\u30ba\u30d1\u30a4\u306e\u30e9\u30a4\u30f3\u51fa\u529b\u3092\u30e2\u30cb\u30bf\u30fc\u3057\u307e\u3057\u305f\u304c\u3001\u305d\u308c\u3060\u3068\u30ce\u30a4\u30ba\u304c\u4e57\u3063\u3066\u30ce\u30a4\u30ba\u306b\u30a4\u30f3\u30b8\u30b1\u30fc\u30bf\u304c\u53cd\u5fdc\u3059\u308b\u306e\u3067\u3042\u307e\u308a\u3046\u308c\u3057\u304f\u306a\u3044<\/p>\n\n\n\n<p>\u306a\u306e\u3067\u3001\u30e9\u30ba\u30d1\u30a4\u5185\u3067ALSA\u3067\u306e\u518d\u751f\u4e2d\u306e\u97f3\u91cf\u3092\u53d6\u5f97\u3057\u3001\u305d\u308c\u3092ROS2\u30c8\u30d4\u30c3\u30af\u901a\u4fe1\u3067\u30de\u30a4\u30b3\u30f3\u306b\u9001\u308a\u3001\u30de\u30a4\u30b3\u30f3\u3092\u4f7f\u3063\u3066\u30a4\u30f3\u30b8\u30b1\u30fc\u30bf\u3092\u70b9\u706f\u3055\u305b\u307e\u3059\u3002<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>\u524d\u63d0\u6761\u4ef6\uff1b<a rel=\"noreferrer noopener\" href=\"http:\/\/shinku.ddo.jp\/wordpress\/?page_id=5854\" target=\"_blank\">\u30e9\u30ba\u30d1\u30a4\uff15\uff0b\u30e9\u30ba\u30d1\u30a4OSbookworm\u306bROS2 humble\u304c\u5c0e\u5165\u3055\u308c\u3066\u3044\u308b<\/a><a rel=\"noreferrer noopener\" href=\"http:\/\/shinku.ddo.jp\/wordpress\/?page_id=5854\" target=\"_blank\">\uff0b<\/a><a rel=\"noreferrer noopener\" href=\"http:\/\/shinku.ddo.jp\/wordpress\/?page_id=5854\" target=\"_blank\">Mbed<\/a><a rel=\"noreferrer noopener\" href=\"http:\/\/shinku.ddo.jp\/wordpress\/?page_id=5854\" target=\"_blank\">\u306e\u30af\u30ed\u30b9\u958b\u767a\u74b0\u5883<\/a><a rel=\"noreferrer noopener\" href=\"http:\/\/shinku.ddo.jp\/wordpress\/?page_id=5854\" target=\"_blank\">\u304c<\/a><a href=\"http:\/\/shinku.ddo.jp\/wordpress\/?page_id=5854\" target=\"_blank\" rel=\"noreferrer noopener\">\u3067\u304d\u3066\u3044\u308b<\/a><a rel=\"noreferrer noopener\" href=\"http:\/\/shinku.ddo.jp\/wordpress\/?page_id=5854\" target=\"_blank\">\u72b6\u614b\u307e\u3067\u4f5c\u6210\u3057\u3066\u304a\u304f\u3053\u3068<\/a><\/p>\n\n\n\n<h2>\u25cf\u76ee\u6b21<\/h2>\n\n\n\n<p>\u30fb\u69cb\u6210\u306e\u7d39\u4ecb<\/p>\n\n\n\n<p>\u30fbMbed\u5074\u30bd\u30d5\u30c8\u30a6\u30a8\u30a2<\/p>\n\n\n\n<p>\u30fb\u30e9\u30ba\u30d1\u30a4\u5074\u30bd\u30d5\u30c8\u30a6\u30a8\u30a2<\/p>\n\n\n\n<p>\u3002\u914d\u5e03<\/p>\n\n\n\n<h2>\u25cf\u69cb\u6210<\/h2>\n\n\n\n<p>\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u3053\u3068\u3092\u3084\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/shinku.ddo.jp\/wordpress\/wp-content\/uploads\/2025\/02\/image.png\"><img decoding=\"async\" loading=\"lazy\" width=\"1050\" height=\"667\" src=\"http:\/\/shinku.ddo.jp\/wordpress\/wp-content\/uploads\/2025\/02\/image.png\" alt=\"\" class=\"wp-image-5887\"\/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2>\u25cfMbed\u5074\u30bd\u30d5\u30c8\u30a6\u30a8\u30a2<\/h2>\n\n\n\n<p>\uff11\uff09\u30c8\u30d4\u30c3\u30af\u5782\u308c\u6d41\u3057\u3092\u6b62\u3081\u308b\u3002<\/p>\n\n\n\n<p>\/home\/pi\/.fastdds\/DEFAULT_FASTRTPS_PROFILES.xml\u3092\u4f5c\u6210\u3059\u308b\u3002<\/p>\n\n\n\n<p>ip\u306f\u81ea\u5206\u306e\u74b0\u5883\u3067\u66f8\u304d\u63db\u3048\u308b\u3053\u3068\u3002\u3053\u3053\u306b\u8a18\u8f09\u306e\u306a\u3044NIC\u306b\u306fTopic\u3092\u51fa\u3055\u306a\u304f\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n &lt;profiles xmlns=\"http:\/\/www.eprosima.com\/XMLSchemas\/fastRTPS_Profiles\">\n  &lt;transport_descriptors>\n   &lt;transport_descriptor>\n    &lt;transport_id>CustomUdpTransport&lt;\/transport_id>\n    &lt;type>UDPv4&lt;\/type>\n    &lt;interfaceWhiteList>\n     &lt;address><strong>192.168.11.3<\/strong>&lt;\/address>\n     &lt;address>127.0.0.1&lt;\/address>\n    &lt;\/interfaceWhiteList>\n   &lt;\/transport_descriptor>\n  &lt;\/transport_descriptors>\n  &lt;participant profile_name=\"CustomTcpTransportParticipant\" is_default_profile=\"true\">\n   &lt;rtps>\n    &lt;userTransports>\n     &lt;transport_id>CustomUdpTransport&lt;\/transport_id>\n    &lt;\/userTransports>\n    &lt;useBuiltinTransports>false&lt;\/useBuiltinTransports>\n   &lt;\/rtps>\n  &lt;\/participant>\n &lt;\/profiles>\n<\/code><\/pre>\n\n\n\n<p>~\/.bashrc\u306b\u4ee5\u4e0b\u8ffd\u52a0<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export FASTRTPS_DEFAULT_PROFILES_FILE=\/home\/pi\/.fastdds\/DEFAULT_FASTRTPS_PROFILES.xml<\/code><\/pre>\n\n\n\n<p>\uff12\uff09\u30d1\u30c3\u30b1\u30fc\u30b8\u4f5c\u6210<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u3092\u30ef\u30fc\u30af\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u300c\u4eee\u306b~\/11_colcon_ws\/\u3068\u3057\u3066\u9032\u3081\u308b\u300d\u3067\u5b9f\u884c\u3059\u308c\u3070volc_disp\u3068\u3044\u3046\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u4f5c\u3063\u3066\u304f\u308c\u308b\u3002<\/p>\n\n\n\n<p>ros2 pkg create vol_disp &#8211;build-type ament_python &#8211;dependencies rclpy<\/p>\n\n\n\n<p>\uff13\uff09python\u3067\u30d7\u30ed\u30b0\u30e9\u30e0\u4f5c\u6210<\/p>\n\n\n\n<p>~\/11_colcon_ws\/src\/vol_disp\/vol_disp\/voldisp.py\u3092\u4f5c\u6210\uff08\u308f\u304b\u308a\u3084\u3059\u304f\u3059\u308b\u305f\u3081\u306b\u30d1\u30c3\u30b1\u30fc\u30b8\u540d\u3068\u306f\u540d\u524d\u3092\u5909\u3048\u3066\u3044\u307e\u3059\u3002\uff09<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#--------+----------+-------------------------------------------\n# v0.0   |240323    |create NEW\n#        |          |\n#--------+----------+-------------------------------------------\nimport rclpy\nfrom rclpy.node import Node\nfrom rclpy.qos import QoSProfile,ReliabilityPolicy,DurabilityPolicy\nfrom mbed2rasppik_msgs.msg import Mbed2rasppik\nfrom rasppi2mbedk_msgs.msg import Rasppi2mbedk\n\nimport time\n\nimport pyaudio\nimport numpy as np\n\nimport signal\nimport sys\n\n# PyAudio\u306e\u8a2d\u5b9a\nFORMAT = pyaudio.paInt16\nCHANNELS = 1\nRATE = 44100\nCHUNK = 1024\n\n# PyAudio\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u4f5c\u6210\naudio = pyaudio.PyAudio()\n\n# \u30b9\u30c8\u30ea\u30fc\u30e0\u3092\u958b\u304f\nstream = audio.open(format=FORMAT, channels=CHANNELS,\n                    rate=RATE, input=True,\n                    frames_per_buffer=CHUNK)\n\n\n#----------\u30af\u30e9\u30b9\u5b9a\u7fa9-----------\nclass Central_Controller(Node):\n    \n    #\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf(\u521d\u671f\u5b9a\u7fa9)\n    def __init__(self):\n        \n        super().__init__(\"vol_disp_node\")\n        \n        self.v_rx_cntr:int = 0\n        self.v_bluestat1:int = 0\n        self.v_bluestat_rpi1:int = 0\n        self.v_volumeamp_rpi:int = 0\n\n        self.v_volume:float= 0\n        self.v_volume_max:float= 0\n\n        #\u901a\u4fe1\u54c1\u8cea\n        profile = QoSProfile(depth=10, reliability=rclpy.qos.ReliabilityPolicy.BEST_EFFORT,\\\n                    durability=rclpy.qos.DurabilityPolicy.VOLATILE)\n        \n        #\u9001\u4fe1\u8a2d\u5b9a\n        self.pub = self.create_publisher(Rasppi2mbedk,'rasppi2mbedk',profile)\n        \n        #\u53d7\u4fe1\u8a2d\u5b9a\n        self.sub = self.create_subscription(Mbed2rasppik,'mbed2rasppik',self.callback,profile) \n\n        print(\"\u97f3\u91cf\u3092\u8868\u793a\u3057\u307e\u3059\u3002Ctrl+C\u3067\u7d42\u4e86\u3057\u307e\u3059\u3002\")\n\n\n    #\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u95a2\u6570\n    def callback(self,msg):\n       \n        msg_pub = Rasppi2mbedk() \n        #----------------mbed2rasppi\u8cfc\u8aad\u5024\u306e\u8aad\u307f\u8fbc\u307f\n        self.v_bluestat1 = msg.v_bluestat1\n        self.v_volumeamp_rpi = 100\n\n        #-------------------------\u6f14\u7b97\n        self.v_rx_cntr += 1\n        self.v_bluestat_rpi1 = self.v_bluestat1\n\n        # \u97f3\u58f0\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u53d6\u308b\n        data = np.frombuffer(stream.read(CHUNK), dtype=np.int16)\n        # \u97f3\u91cf\u3092\u8a08\u7b97\n        self.v_volume = np.linalg.norm(data) \/ CHUNK\n        print(f\"\u97f3\u91cf: {self.v_volume:.2f}\")\n        self.v_volume_max = max(self.v_volume , self.v_volume_max)\n        print(f\"\u6700\u5927\u97f3\u91cf: {self.v_volume_max:.2f}\")\n        self.v_volumeamp_rpi = int(min(65535,self.v_volume*65))\n\n        #-------------rasppi2mbed\u3078\u306e\u767a\u884c\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8---------------------------       \n        msg_pub.v_bluestat_rpi1 = self.v_bluestat_rpi1\n        msg_pub.v_volumeamplitude_rpi = self.v_volumeamp_rpi\n\n        #----------------\u30b3\u30f3\u30bd\u30fc\u30eb\u3078\u306e\u30c7\u30fc\u30bf\u30e2\u30cb\u30bf------------------\n        print('rx_counter='+str(self.v_rx_cntr))\n        print('RX:v_bluestat1='+str(self.v_bluestat1))\n        print('TX:v_bluestat_rpi1='+str(self.v_bluestat_rpi1),'v_volumeamplitude_rpi='+str(self.v_volumeamp_rpi))\n        print('-------------------')\n                    \n        self.pub.publish(msg_pub)\n        \n\"\"\" \u30e1\u30a4\u30f3\u95a2\u6570 \"\"\"\ndef main():\n    \n    #RCL\u306e\u521d\u671f\u5316\u3092\u5b9f\u884c\n    rclpy.init()\n    \n    #\u30af\u30e9\u30b9\u3092\u30b3\u30f3\u30b9\u30bf\u30f3\u30b9\u5316\n    node = Central_Controller()\n\n    #-----CTRL+C\u6642\u306e\u51e6\u7406\u3092\u8ffd\u52a0\n    def signal_handler(sig, frame):\n        print(\"CTRL+C \u7d42\u4e86\u3057\u307e\u3059\u3002\")\n        node.destroy_node()\n        rclpy.shutdown()\n        stream.stop_stream()\n        stream.close()\n        audio.terminate()\n        sys.exit(0)\n\n    signal.signal(signal.SIGINT, signal_handler)\n    \n    try:\n        #\u30eb\u30fc\u30d7\u306b\u5165\u308anode\u306e\u51e6\u7406\u3092\u5b9f\u884c\u3055\u305b\u308b\n        rclpy.spin(node)\n    except KeyboardInterrupt:\n        pass\n    finally:\n        if rclpy.ok():\n            node.destroy_node()\n            rclpy.shutdown()\n        stream.stop_stream()\n        stream.close()\n        audio.terminate()\n    \nif __name__ == '__main__':\n    main()\n<\/code><\/pre>\n\n\n\n<p>\/11_colcon_ws\/src\/vol_disp\/setup.py\u3092\u7de8\u96c6<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from setuptools import find_packages, setup\n\npackage_name = 'vol_disp'\n\nsetup(\n    name=package_name,\n    version='0.0.0',\n    packages=find_packages(exclude=&#91;'test']),\n    data_files=&#91;\n        ('share\/ament_index\/resource_index\/packages',\n            &#91;'resource\/' + package_name]),\n        ('share\/' + package_name, &#91;'package.xml']),\n    ],\n    install_requires=&#91;'setuptools'],\n    zip_safe=True,\n    maintainer='pi',\n    maintainer_email='pi@todo.todo',\n    description='TODO: Package description',\n    license='TODO: License declaration',\n    tests_require=&#91;'pytest'],\n    entry_points={\n        'console_scripts': &#91;\n            'voldisp = vol_disp.voldisp:main',\n        ],\n    },\n)<\/code><\/pre>\n\n\n\n<p>\uff13\uff09\u30ab\u30b9\u30bf\u30e0\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u30ea\u30b9\u30c8\u3092\u4f5c\u308b\u3002<\/p>\n\n\n\n<p>\u5236\u5fa1\u3067\u901a\u5e38\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u3067\u306a\u304f\u30ab\u30b9\u30bf\u30e0\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u4f7f\u3046\u306e\u306f\u300c\u540c\u4e00\u306e\u30bf\u30a4\u30df\u30f3\u30b0\u3067\u306e\u5236\u5fa1\u306b\u4f7f\u3046\u72b6\u614b\u5024\u306f\u540c\u4e00\u306e\u30bf\u30a4\u30df\u30f3\u30b0\u306e\u3082\u306e\u3067\u306a\u3044\u3068\u3044\u308d\u3044\u308d\u554f\u984c\u304c\u8d77\u3053\u308b\u300d\u304b\u3089\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u308c\u3067\u308f\u304b\u3089\u306a\u3044\u65b9\u306f\u3001\u306a\u304b\u306a\u304b\u8aac\u660e\u304c\u3080\u3064\u304b\u3057\u3044\u306e\u3067\u3001\u4e00\u56de\u3044\u3064\u304b\u75db\u3044\u76ee\u306b\u3042\u3063\u3066\u899a\u3048\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2>\u25cf\u30e9\u30ba\u30d1\u30a4\u5074\u30bd\u30d5\u30c8\u30a6\u30a8\u30a2<\/h2>\n\n\n\n<p>\u307e\u305a\u3001\u3054\u6ce8\u610f\u3002<\/p>\n\n\n\n<p>\u3053\u3053\u3067\u306f\u3042\u3048\u3066PIP\u3092\u5f37\u5f15\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u304a\u308a\u3001\u4eca\u63a8\u5968\u306evenv\u306f\u4f7f\u3063\u3066\u3044\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<p>\u306a\u305c\u304b\uff01\u30fb\u30fb\u30fb\u306a\u3093\u304bROS2\u3068\u76f8\u6027\u60aa\u3044\u304b\u3089\u3002\u3076\u3063\u3061\u3083\u3051\u3001venv\u3060\u3068\u3046\u307e\u304f\u52d5\u304b\u3093\u304cpip\u3092\u5f37\u5f15\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308c\u3070\u52d5\u304f\u3093\u3067\u305d\u308c\u3067\u3084\u3063\u3061\u3083\u3063\u3066\u307e\u3059<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>\u30b9\u30c6\u30c3\u30d7\uff11\uff09\u307e\u305a\u3001\u97f3\u91cf\u3092\u30c6\u30ad\u30b9\u30c8\u3067\u8868\u793a\u3059\u308b\u3002<\/p>\n\n\n\n<p>\u30fb\u6e96\u5099<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install python3 python3-pip\nsudo apt install portaudio19-dev<\/code><\/pre>\n\n\n\n<p>\u300c\u30e1\u30e2\u300dvenv\u3068ros2\u306e\u76f8\u6027\u304c\u306a\u3093\u304b\u3088\u304f\u306a\u3044\u306e\u3067\u4ee5\u4e0b\u3067\u5f37\u5f15\u306bvenv\u306a\u3057\u3067pip\u3059\u308b\u624b\u3082\u3042\u308b pip install pyaudio &#8211;break-system-packages \u3068\u304b pip install transitions &#8211;break-system-packages \uff08ROS2\u3067\u3088\u304f\u4f7f\u3046\u3084\u3064\uff09\u3068\u304b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install pyaudio --break-system-packages\npip install numpy --break-system-packages\n<\/code><\/pre>\n\n\n\n<p>\u30fb\u30d7\u30ed\u30b0\u30e9\u30e0\u672c\u4f53\uff08volume_display_py\uff09<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import pyaudio\nimport numpy as np\n\n# PyAudio\u306e\u8a2d\u5b9a\nFORMAT = pyaudio.paInt16\nCHANNELS = 1\nRATE = 44100\nCHUNK = 1024\n\n# PyAudio\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u4f5c\u6210\naudio = pyaudio.PyAudio()\n\n# \u30b9\u30c8\u30ea\u30fc\u30e0\u3092\u958b\u304f\nstream = audio.open(format=FORMAT, channels=CHANNELS,\n                    rate=RATE, input=True,\n                    frames_per_buffer=CHUNK)\n\nprint(\"\u97f3\u91cf\u3092\u8868\u793a\u3057\u307e\u3059\u3002Ctrl+C\u3067\u7d42\u4e86\u3057\u307e\u3059\u3002\")\n\ntry:\n    while True:\n        # \u97f3\u58f0\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u53d6\u308b\n        data = np.frombuffer(stream.read(CHUNK), dtype=np.int16)\n        # \u97f3\u91cf\u3092\u8a08\u7b97\n        volume = np.linalg.norm(data) \/ CHUNK\n        print(f\"\u97f3\u91cf: {volume:.2f}\")\nexcept KeyboardInterrupt:\n    print(\"\u7d42\u4e86\u3057\u307e\u3059\u3002\")\n\n# \u30b9\u30c8\u30ea\u30fc\u30e0\u3092\u9589\u3058\u308b\nstream.stop_stream()\nstream.close()\naudio.terminate()<\/code><\/pre>\n\n\n\n<p>\u3067\u3001\u4ee5\u4e0b\u5b9f\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python volume_display_py<\/code><\/pre>\n\n\n\n<p>\u30b9\u30c6\u30c3\u30d7\uff12\uff09ROS2\u306e\u901a\u4fe1\u3092\u7d44\u307f\u8fbc\u3080<\/p>\n\n\n\n<p>\uff12\uff0d\uff11\uff0d\uff11\uff09\u30ce\u30fc\u30c9\u4f5c\u6210<\/p>\n\n\n\n<p>\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u5185\u3067<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ros2 pkg create vol_disp --build-type ament_python --dependencies rclpy\n<\/code><\/pre>\n\n\n\n<p>\uff12\uff0d\uff11\uff0d\uff12\uff09\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u5185\/src\/vol_disp\/setup.py\u7de8\u96c6<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from setuptools import setup\n\npackage_name = 'my_python_pkg'\n\nfrom setuptools import find_packages, setup\n\npackage_name = 'vol_disp'\n\nsetup(\n    name=package_name,\n    version='0.0.0',\n    packages=find_packages(exclude=&#91;'test']),\n    data_files=&#91;\n        ('share\/ament_index\/resource_index\/packages',\n            &#91;'resource\/' + package_name]),\n        ('share\/' + package_name, &#91;'package.xml']),\n    ],\n    install_requires=&#91;'setuptools'],\n    zip_safe=True,\n    maintainer='pi',\n    maintainer_email='pi@todo.todo',\n    description='TODO: Package description',\n    license='TODO: License declaration',\n    tests_require=&#91;'pytest'],\n    entry_points={\n        'console_scripts': &#91;\n            'voldisp = vol_disp.voldisp:main',\n        ],\n    },\n)<\/code><\/pre>\n\n\n\n<p>\uff12\uff0d\uff11\uff0d\uff13\uff09<\/p>\n\n\n\n<p>\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u5185\/src\/vol_disp\/vol_disp\/voldisp.py<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import rclpy\nfrom rclpy.node import Node\nfrom rclpy.qos import QoSProfile,ReliabilityPolicy,DurabilityPolicy\nfrom mbed2rasppik_msgs.msg import Mbed2rasppik\nfrom rasppi2mbedk_msgs.msg import Rasppi2mbedk\n\nimport time\n\nimport pyaudio\nimport numpy as np\n\nimport signal\nimport sys\n\n# PyAudio\u306e\u8a2d\u5b9a\nFORMAT = pyaudio.paInt16\nCHANNELS = 1\nRATE = 44100\nCHUNK = 1024\n\n# PyAudio\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u4f5c\u6210\naudio = pyaudio.PyAudio()\n\n# \u30b9\u30c8\u30ea\u30fc\u30e0\u3092\u958b\u304f\nstream = audio.open(format=FORMAT, channels=CHANNELS,\n                    rate=RATE, input=True,\n                    frames_per_buffer=CHUNK)\n\n\n#----------\u30af\u30e9\u30b9\u5b9a\u7fa9-----------\nclass Central_Controller(Node):\n    \n    #\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf(\u521d\u671f\u5b9a\u7fa9)\n    def __init__(self):\n        \n        super().__init__(\"input_control\")\n        \n        self.v_rx_cntr:int = 0\n        self.v_bluestat1:int = 0\n        self.v_bluestat_rpi1:int = 0\n        self.v_volumeamp_rpi:int = 0\n\n        self.v_volume:float= 0\n        self.v_volume_max:float= 0\n\n        #\u901a\u4fe1\u54c1\u8cea\n        profile = QoSProfile(depth=10, reliability=rclpy.qos.ReliabilityPolicy.BEST_EFFORT,\\\n                    durability=rclpy.qos.DurabilityPolicy.VOLATILE)\n        \n        #\u9001\u4fe1\u8a2d\u5b9a\n        self.pub = self.create_publisher(Rasppi2mbedk,'rasppi2mbedk',profile)\n        \n        #\u53d7\u4fe1\u8a2d\u5b9a\n        self.sub = self.create_subscription(Mbed2rasppik,'mbed2rasppik',self.callback,profile) \n\n        print(\"\u97f3\u91cf\u3092\u8868\u793a\u3057\u307e\u3059\u3002Ctrl+C\u3067\u7d42\u4e86\u3057\u307e\u3059\u3002\")\n\n\n    #\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u95a2\u6570\n    def callback(self,msg):\n       \n        msg_pub = Rasppi2mbedk() \n        #----------------mbed2rasppi\u8cfc\u8aad\u5024\u306e\u8aad\u307f\u8fbc\u307f\n        self.v_bluestat1 = msg.v_bluestat1\n        self.v_volumeamp_rpi = 100\n\n        #-------------------------\u6f14\u7b97\n        self.v_rx_cntr += 1\n        self.v_bluestat_rpi1 = self.v_bluestat1\n\n        # \u97f3\u58f0\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u53d6\u308b\n        data = np.frombuffer(stream.read(CHUNK), dtype=np.int16)\n        # \u97f3\u91cf\u3092\u8a08\u7b97\n        self.v_volume = np.linalg.norm(data) \/ CHUNK\n        print(f\"\u97f3\u91cf: {self.v_volume:.2f}\")\n        self.v_volume_max = max(self.v_volume , self.v_volume_max)\n        print(f\"\u6700\u5927\u97f3\u91cf: {self.v_volume_max:.2f}\")\n        self.v_volumeamp_rpi = int(min(65535,self.v_volume*65))\n\n        #-------------rasppi2mbed\u3078\u306e\u767a\u884c\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8---------------------------       \n        msg_pub.v_bluestat_rpi1 = self.v_bluestat_rpi1\n        msg_pub.v_volumeamplitude_rpi = self.v_volumeamp_rpi\n\n        #----------------\u30b3\u30f3\u30bd\u30fc\u30eb\u3078\u306e\u30c7\u30fc\u30bf\u30e2\u30cb\u30bf------------------\n        print('rx_counter='+str(self.v_rx_cntr))\n        print('RX:v_bluestat1='+str(self.v_bluestat1))\n        print('TX:v_bluestat_rpi1='+str(self.v_bluestat_rpi1),'v_volumeamplitude_rpi='+str(self.v_volumeamp_rpi))\n        print('-------------------')\n                    \n        self.pub.publish(msg_pub)\n        \n\"\"\" \u30e1\u30a4\u30f3\u95a2\u6570 \"\"\"\ndef main():\n    \n    #RCL\u306e\u521d\u671f\u5316\u3092\u5b9f\u884c\n    rclpy.init()\n    \n    #\u30af\u30e9\u30b9\u3092\u30b3\u30f3\u30b9\u30bf\u30f3\u30b9\u5316\n    node = Central_Controller()\n\n    #-----CTRL+C\u6642\u306e\u51e6\u7406\u3092\u8ffd\u52a0\n    def signal_handler(sig, frame):\n        print(\"CTRL+C \u7d42\u4e86\u3057\u307e\u3059\u3002\")\n        node.destroy_node()\n        rclpy.shutdown()\n        stream.stop_stream()\n        stream.close()\n        audio.terminate()\n        sys.exit(0)\n\n    signal.signal(signal.SIGINT, signal_handler)\n    \n    try:\n        #\u30eb\u30fc\u30d7\u306b\u5165\u308anode\u306e\u51e6\u7406\u3092\u5b9f\u884c\u3055\u305b\u308b\n        rclpy.spin(node)\n    except KeyboardInterrupt:\n        pass\n    finally:\n        if rclpy.ok():\n            node.destroy_node()\n            rclpy.shutdown()\n        stream.stop_stream()\n        stream.close()\n        audio.terminate()\n    \nif __name__ == '__main__':\n    main()\n\n<\/code><\/pre>\n\n\n\n<p>\uff12\uff0d\uff12\uff0d\uff11\uff09ROS2TOPIC\u30fb\u30ab\u30b9\u30bf\u30e0\u30e1\u30c3\u30bb\u30fc\u30b8\u30d5\u30a1\u30a4\u30eb\u300cmbed2rasppik\u300d\u4f5c\u6210<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ros2 pkg create --build-type ament_cmake mbed2rasppik<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>cd ~\/ros2_ws\/src\/mbed2rasppik\nmkdir msg\necho \"int32 num\" &gt; <\/code><\/pre>\n\n\n\n<p>\uff08\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u5185\uff09\/src\/mbed2rasppik\/Mbed2rasppik\u3092\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u7de8\u96c6<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>uint8 v_bluestat1<\/code><\/pre>\n\n\n\n<p>\uff08\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u5185\uff09\/src\/mbed2rasppik\/CMakeLists.txt<\/p>\n\n\n\n<p>\u306e\u3001find_package\u306e\u3068\u3053\u308d\u3092\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u5909\u66f4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>find_package(rosidl_default_generators REQUIRED)\n\nset(msg_files\n  \"msg\/Mbed2rasppik.msg\"\n)\nrosidl_generate_interfaces(${PROJECT_NAME}\n  ${msg_files}\n)<\/code><\/pre>\n\n\n\n<p>\uff08\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u5185\uff09\/src\/mbed2rasppik\/package.xml<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\"?&gt;\n&lt;?xml-model href=\"http:\/\/download.ros.org\/schema\/package_format3.xsd\" schematypens=\"http:\/\/www.w3.org\/2001\/XMLSchema\"?&gt;\n&lt;package format=\"3\"&gt;\n  &lt;name&gt;mbed2rasppik_msgs&lt;\/name&gt;\n  &lt;version&gt;0.0.0&lt;\/version&gt;\n  &lt;description&gt;TODO: Package description&lt;\/description&gt;\n  &lt;maintainer email=\"pi@todo.todo\"&gt;pi&lt;\/maintainer&gt;\n  &lt;license&gt;TODO: License declaration&lt;\/license&gt;\n\n  &lt;buildtool_depend&gt;ament_cmake&lt;\/buildtool_depend&gt;\n\n  &lt;test_depend&gt;ament_lint_auto&lt;\/test_depend&gt;\n  &lt;test_depend&gt;ament_lint_common&lt;\/test_depend&gt;\n\n  &lt;build_depend&gt;rosidl_default_generators&lt;\/build_depend&gt;\n  &lt;exec_depend&gt;rosidl_default_runtime&lt;\/exec_depend&gt;\n  &lt;member_of_group&gt;rosidl_interface_packages&lt;\/member_of_group&gt;\n\n  &lt;export&gt;\n    &lt;build_type&gt;ament_cmake&lt;\/build_type&gt;\n  &lt;\/export&gt;\n&lt;\/package&gt;<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>\uff12\uff0d\uff13\uff0d\uff11\uff09ROS2TOPIC\u30fb\u30ab\u30b9\u30bf\u30e0\u30e1\u30c3\u30bb\u30fc\u30b8\u30d5\u30a1\u30a4\u30eb\u300crasppi2mbedk\u300d\u4f5c\u6210<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd ~\/ros2_ws\ncolcon build<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>\u30b9\u30c6\u30c3\u30d7\uff13\uff09\u81ea\u52d5\u8d77\u52d5<\/p>\n\n\n\n<p>Raspberry Pi 5\u3067Raspberry Pi OS\u3092\u4f7f\u7528\u3057\u3001OS\u8d77\u52d5\u6642\u306bPython\u3067\u66f8\u304b\u308c\u305fROS2\u30ce\u30fc\u30c9\u3092\u8907\u6570\u8d77\u52d5\u3059\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3>\u624b\u9806<\/h3>\n\n\n\n<ol start=\"1\">\n<li><strong>ROS2\u30ce\u30fc\u30c9\u306e\u4f5c\u6210<\/strong>:\n<ul>\n<li>\u5404\u30ce\u30fc\u30c9\u306ePython\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u4f8b\u3048\u3070\u3001<code>node1.py<\/code>\u3068<code>node2.py<\/code>\u3068\u3044\u3046\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30b7\u30b9\u30c6\u30e0\u30b5\u30fc\u30d3\u30b9\u306e\u4f5c\u6210<\/strong>:\n<ul>\n<li>\u5404\u30ce\u30fc\u30c9\u306e\u305f\u3081\u306b\u30b7\u30b9\u30c6\u30e0\u30b5\u30fc\u30d3\u30b9\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u4ee5\u4e0b\u306f\u3001<code>node1.service<\/code>\u306e\u4f8b\u3067\u3059\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Unit]\nDescription=ROS2 Node 1\nAfter=network.target\n\n&#91;Service]\nExecStart=\/usr\/bin\/python3 \/path\/to\/your\/node1.py\nRestart=always\nUser=pi\n\n&#91;Install]\nWantedBy=multi-user.target<\/code><\/pre>\n\n\n\n<ul>\n<li>\u540c\u69d8\u306b\u3001<code>node2.service<\/code>\u3082\u4f5c\u6210\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<ol start=\"3\">\n<li><strong>\u30b5\u30fc\u30d3\u30b9\u30d5\u30a1\u30a4\u30eb\u306e\u914d\u7f6e<\/strong>:\n<ul>\n<li>\u4f5c\u6210\u3057\u305f\u30b5\u30fc\u30d3\u30b9\u30d5\u30a1\u30a4\u30eb\u3092<code>\/etc\/systemd\/system\/<\/code>\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u914d\u7f6e\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo cp node1.service \/etc\/systemd\/system\/\nsudo cp node2.service \/etc\/systemd\/system\/<\/code><\/pre>\n\n\n\n<p>4.<strong>\u30b5\u30fc\u30d3\u30b9\u306e\u6709\u52b9\u5316\u3068\u8d77\u52d5<\/strong>:<\/p>\n\n\n\n<ul>\n<li>\u30b5\u30fc\u30d3\u30b9\u3092\u6709\u52b9\u5316\u3057\u3001\u8d77\u52d5\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl enable node1.service\nsudo systemctl enable node2.service\nsudo systemctl start node1.service\nsudo systemctl start node2.service<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2>\u25cf\u914d\u5e03<\/h2>\n\n\n\n<p>\u6e96\u5099\u4e2d<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u30e9\u30ba\u30d1\u30a4\u3067\u518d\u751f\u4e2d\u306e\u97f3\u91cf\u306b\u5408\u308f\u305b\u3066\u30a4\u30f3\u30b8\u30b1\u30fc\u30bf\u3092\u5149\u3089\u305b\u3088\u3046\u3002\u3067\u3059\u3002 \u524d\u56de\u306f\u30de\u30a4\u30b3\u30f3\u306e\u30a2\u30ca\u30ed\u30b0\u5165\u529b\u3067\u30e9\u30ba\u30d1\u30a4\u306e\u30e9\u30a4\u30f3\u51fa\u529b\u3092\u30e2\u30cb\u30bf\u30fc\u3057\u307e\u3057\u305f\u304c\u3001\u305d\u308c\u3060\u3068\u30ce\u30a4\u30ba\u304c\u4e57\u3063\u3066\u30ce\u30a4\u30ba\u306b\u30a4\u30f3\u30b8\u30b1\u30fc\u30bf\u304c\u53cd\u5fdc\u3059\u308b\u306e\u3067\u3042\u307e\u308a\u3046\u308c\u3057\u304f\u306a\u3044 \u306a\u306e\u3067 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"http:\/\/shinku.ddo.jp\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/5865"}],"collection":[{"href":"http:\/\/shinku.ddo.jp\/wordpress\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/shinku.ddo.jp\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/shinku.ddo.jp\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/shinku.ddo.jp\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5865"}],"version-history":[{"count":10,"href":"http:\/\/shinku.ddo.jp\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/5865\/revisions"}],"predecessor-version":[{"id":5912,"href":"http:\/\/shinku.ddo.jp\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/5865\/revisions\/5912"}],"wp:attachment":[{"href":"http:\/\/shinku.ddo.jp\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5865"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}