myAGV,ROS2化,/cmd_vel

teleopを実行した後にtopic listを見ていたため/cmd_velがあるように見えていました.

(myenv) wataru@NucBoxG5:~$ docker run -it --rm \
  --net=host \
  --env RMW_IMPLEMENTATION=rmw_cyclonedds_cpp \
  osrf/ros:galactic-desktop
root@NucBoxG5:/# ros2 topic list
/accel/filtered
/diagnostics
/imu
/joint_states
/odom
/odometry/filtered
/parameter_events
/robot_description
/rosout
/scan
/set_pose
/tf
/tf_static
/voltage
/voltage_backup
/ydlidar_ros2_driver_node/transition_event

いないですね….
起動ログを追いかけてみた所,

(ros2 galactic py3)er@er:~/myagv_ros2$ ros2 launch myagv_odometry myagv_active.launch.py
[INFO] [launch]: All log files can be found below /home/er/.ros/log/2026-05-22-09-40-24-525547-er-32658
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [ydlidar_ros2_driver_node-7]: process started with pid [32698]
[INFO] [myagv_odometry_node-1]: process started with pid [32677]
...
[myagv_odometry_node-1] Serial buffer cleared successfully
...
[ERROR] [myagv_odometry_node-1]: process has died [pid 32893, exit code -6, cmd '/home/er/myagv_ros2/install/myagv_odometry/lib/myagv_odometry/myagv_odometry_node --ros-args -r __node:=myagv_odometry_node'].
...
[myagv_odometry_node-1] [INFO] [1779414400.608016034] [rclcpp]: signal_handler(signal_value=2)
[myagv_odometry_node-1] terminate called after throwing an instance of 'boost::wrapexcept<boost::system::system_error>'
[myagv_odometry_node-1]   what():  read: Interrupted system call
...

コケてますね….


原因判明.
大きな原因は,ROS2のソースはjetson nano用でしたので,接続ポートが違うのと通信コマンドが異なっていた という部分です.
差分は以下です.

diff --git a/myagv_odometry/src/myAGV.cpp b/myagv_odometry/src/myAGV.cpp
index d513bea..3f5d431 100755
--- a/myagv_odometry/src/myAGV.cpp
+++ b/myagv_odometry/src/myAGV.cpp
@@ -8,7 +8,7 @@
 const unsigned char header[2] = { 0xfe, 0xfe };
 
 boost::asio::io_service iosev;
-boost::asio::serial_port sp(iosev, "/dev/ttyS0");
+boost::asio::serial_port sp(iosev, "/dev/ttyAMA2");
 
 std::array<double, 36> odom_pose_covariance = {
     {1e-9, 0, 0, 0, 0, 0,
@@ -179,6 +179,7 @@ bool MyAGV::readSpeed()
     imu_data.angular_velocity.y = ((buf[index + 11] + buf[index + 12] * 256 ) - 10000) * 0.1;
     imu_data.angular_velocity.z = ((buf[index + 13] + buf[index + 14] * 256 ) - 10000) * 0.1;
 
+    /*
     uint8_t highNibble = (buf[index + 15] >> 4) & 0x0F;  
 
     Battery_voltage = (float)buf[index + 16] / 10.0f;
@@ -212,6 +213,7 @@ bool MyAGV::readSpeed()
                                         //  << imu_data.linear_acceleration.x << "," << imu_data.linear_acceleration.y << "," << imu_data.linear_acceleration.z << "|"
                                     //  << imu_data.angular_velocity.x << "," << imu_data.angular_velocity.y << "," << imu_data.angular_velocity.z << std::endl;
     //std::cout << "current pos is: " << x << "," << y << "," << theta << std::endl;
+    */
 
     return true;
 }
@@ -233,13 +235,13 @@ void MyAGV::writeSpeed(double movex, double movey, double rot)
     char buf[8] = { 0 };
     buf[0] = header[0];
     buf[1] = header[1];
-    buf[2] = move_cmd >> 8;
-    buf[3] = move_cmd & 0xff;
-    buf[4] = x_send;
-    buf[5] = y_send;
-    buf[6] = rot_send;
-    check = (buf[2] + buf[3] + buf[4] + buf[5] + buf[6]) & 0xff;
-    buf[7] = check;
+    // buf[2] = move_cmd >> 8;
+    // buf[3] = move_cmd & 0xff;
+    buf[2] = x_send;
+    buf[3] = y_send;
+    buf[4] = rot_send;
+    // check = (buf[2] + buf[3] + buf[4] + buf[5] + buf[6]) & 0xff;
+    buf[5] = check;
 
     boost::asio::write(sp, boost::asio::buffer(buf));
 }
@@ -341,7 +343,7 @@ void MyAGV::execute(double linearX, double linearY, double angularZ)
 {   
     currentTime = this->get_clock()->now();   
     double dt = (currentTime - lastTime).seconds();
-    if (true ==  readSpeed()) 
+    // if (true ==  readSpeed()) 
     {    
         writeSpeed(linearX, linearY, angularZ);
         publisherOdom(dt);
@@ -358,6 +360,7 @@ void MyAGV::execute(double linearX, double linearY, double angularZ)
  */
 void MyAGV::setAutoReportState(bool state)
 {
+    return;
     // Motor auto report
     unsigned char cmd[6] = {0xfe, 0xfe, 0x01, 0x0c, state, 0x0e};
     short cmd_sum = 0;
@@ -378,4 +381,4 @@ void MyAGV::setAutoReportState(bool state)
     boost::asio::write(sp, boost::asio::buffer(cmd));
     std::this_thread::sleep_for(std::chrono::milliseconds(50));
     return;
-}
\ No newline at end of file
+}
diff --git a/myagv_odometry/src/myAGVSub.cpp b/myagv_odometry/src/myAGVSub.cpp
index 832cc4a..803cadb 100755
--- a/myagv_odometry/src/myAGVSub.cpp
+++ b/myagv_odometry/src/myAGVSub.cpp
@@ -41,4 +41,4 @@ int main(int argc, char* argv[])
 
     rclcpp::shutdown();
     return 0;
-}
\ No newline at end of file
+}
diff --git a/ydlidar_ros2_driver/params/X2.yaml b/ydlidar_ros2_driver/params/X2.yaml
index f36565a..38987b4 100644
--- a/ydlidar_ros2_driver/params/X2.yaml
+++ b/ydlidar_ros2_driver/params/X2.yaml
@@ -1,6 +1,7 @@
 ydlidar_ros2_driver_node:
   ros__parameters:
-    port: /dev/ttyTHS1
+    # port: /dev/ttyTHS1
+    port: /dev/ttyAMA0
     frame_id: laser_frame
     ignore_array: "-50,50"
     baudrate: 115200

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*